gpt4 book ai didi

C# 应用程序与本地 api 断开连接,使用如何在不重新启动程序的情况下重新连接

转载 作者:行者123 更新时间:2023-12-04 12:58:39 24 4
gpt4 key购买 nike

大家好,我是 C# 新手,我已经用这种语言完成了前两周的学习,所以我的知识非常基础。

我正在使用连接到客户端(英雄联盟客户端)并使用各种方法发送和获取信息(获取、发布、放置和删除)的应用程序。

程序的作用:

  • 一旦应用程序启动,就会有一个在加载表单时调用的公共(public)类。
  • public LCU lcu = new LCU(); (我将在下面添加 LCU 的代码)<-- 这将建立连接
  • 我可以发送任意数量的请求,这是一个工作示例:
  • var request = await lcu.http_client.DeleteAsync(lcu.baseURL + "/lol-lobby/v2/lobby").ConfigureAwait(true);
    我的问题是,当我发出太多请求(每 2 秒或以下)时,应用程序会与客户端/api 断开连接并修复我需要重新连接的任务。

    现在我不知道该怎么做,我尝试添加 LCU lcu = new LCU();在计时器内,但这不起作用。

    我很想知道为什么它不起作用,如果您对如何做有一些建议,我会很高兴知道。

    谢谢!!

    LCU.cs (不是主要形式)
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Net.Security;
    using System.Security.Cryptography.X509Certificates;
    using System.Text;
    using System.Threading.Tasks;

    namespace LeaguePW5
    {
    public class LCU
    {
    public string address { get; set; }
    public int port { get; set; }
    public string username { get; set; }
    public string password { get; set; }
    public string protocol { get; set; }
    public string process_name { get; set; }
    public int process_id { get; set; }
    public string baseURL => string.Format("{0}://{1}:{2}", this.protocol, this.address, this.port);
    public LCU()
    {
    Process[] process = Process.GetProcessesByName("LeagueClientUx");
    if (process.Length != 0)
    {
    string lockFile;
    using (FileStream stream = File.Open(Path.Combine(Path.GetDirectoryName(process[0].MainModule.FileName), "lockfile"), FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
    lockFile = new StreamReader(stream).ReadToEnd();
    }
    string[] parameters = lockFile.Split(new string[] { ":" }, StringSplitOptions.None);
    this.username = "riot";
    this.address = "127.0.0.1";
    this.process_name = parameters[0];
    this.process_id = Convert.ToInt32(parameters[1]);
    this.port = Convert.ToInt32(parameters[2]);
    this.password = parameters[3];
    this.protocol = parameters[4];
    }

    }
    public HttpClient http_client
    {
    get
    {
    HttpClientHandler httpClientHandler = new HttpClientHandler();
    httpClientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
    httpClientHandler.ServerCertificateCustomValidationCallback = ((HttpRequestMessage httpRequestMessage, X509Certificate2 cert, X509Chain cetChain, SslPolicyErrors policyErrors) => true);
    return new HttpClient(httpClientHandler)
    {
    DefaultRequestHeaders =
    {
    Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("riot:" + this.password)))
    }
    };
    }
    set
    {
    }
    }



    }
    }


    附言如果你需要完整的代码,我很乐意分享

    最佳答案

    您在 http_client 中有错误初始化。每次发出请求时它都会返回新实例。

    HttpClient 文档:

    // HttpClient is intended to be instantiated once per application, rather than per-use.



    尝试此修复程序,您将不会断开连接。 (另外我已经应用了属性的命名策略,在 .NET 中被微软广泛使用)

    private HttpClient _httpClient; // backing field
    public HttpClient HttpClient
    {
    get
    {
    if (_httpClient == null) // create new instance only if still not created
    {
    HttpClientHandler httpClientHandler = new HttpClientHandler();
    httpClientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
    httpClientHandler.ServerCertificateCustomValidationCallback = ((HttpRequestMessage httpRequestMessage, X509Certificate2 cert, X509Chain cetChain, SslPolicyErrors policyErrors) => true);
    _httpClient = new HttpClient(httpClientHandler)
    {
    DefaultRequestHeaders =
    {
    Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("riot:" + this.password)))
    }
    };
    }
    return _httpClient;
    }
    }

    和用法
    await lcu.HttpClient.DeleteAsync(lcu.baseURL + "/lol-lobby/v2/lobby").ConfigureAwait(false);
    ConfigureAwait(true)是默认的。使用 false或不使用 ConfigureAwait以避免多余的开销。

    此外,您可以导出 LCU来自 IDisposable 的类(class)和 implement界面因为 HttpClientIDisposable .并调用 HttpClient.Dispose()在处置方法上。但只有创建 new LCU() 才有意义多次上课。

    关于C# 应用程序与本地 api 断开连接,使用如何在不重新启动程序的情况下重新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62366422/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com