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

C#应用程序与本地api断开连接,通常是如何在不重新启动程序的情况下重新连接,c#,api,reconnect,C#,Api,Reconnect,大家好,我是c#的新手,前两周我用这门语言学习,所以我的知识相当基础 我正在玩一个连接到客户端(传奇联盟客户端)的应用程序,并使用varius方法发送和获取信息(获取、发布、放置和删除) 程序的功能: 应用程序启动后,将在加载表单时调用一个公共类 公共LCU LCU=新LCU()(我将在下面添加LCU的代码)您在http\u客户端初始化中出错。每次发出请求时,它都会返回新实例 根据文件: //HttpClient打算在每个应用程序而不是每次使用时实例化一次 尝试此修复程序,您将不会断开连接。(此

大家好,我是c#的新手,前两周我用这门语言学习,所以我的知识相当基础

我正在玩一个连接到客户端(传奇联盟客户端)的应用程序,并使用varius方法发送和获取信息(获取、发布、放置和删除)

程序的功能:

  • 应用程序启动后,将在加载表单时调用一个公共类

  • 公共LCU LCU=新LCU()
    (我将在下面添加LCU的代码)您在
    http\u客户端
    初始化中出错。每次发出请求时,它都会返回新实例

    根据文件:

    //HttpClient打算在每个应用程序而不是每次使用时实例化一次

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

    private-HttpClient\u-HttpClient;//后场
    公共HttpClient HttpClient
    {
    得到
    {
    if(_httpClient==null)//仅在尚未创建时创建新实例
    {
    HttpClientHandler HttpClientHandler=新的HttpClientHandler();
    httpClientHandler.ClientCertificateOptions=ClientCertificateOptions.Manual;
    httpClientHandler.ServerCertificateCustomValidationCallback=((HttpRequestMessage HttpRequestMessage,X509Certificate2证书,X509Chain cetChain,SslPolicyErrors policyErrors)=>true);
    _httpClient=新的httpClient(httpClientHandler)
    {
    DefaultRequestHeader=
    {
    授权=新的AuthenticationHeaderValue(“基本”,Convert.ToBase64String(Encoding.ASCII.GetBytes(“riot:+this.password)))
    }
    };
    }
    返回httpClient;
    }
    }
    
    用法

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


    此外,您可以从
    IDisposable
    和接口派生
    LCU
    类,因为
    HttpClient
    IDisposable
    。并在disposing方法中调用
    HttpClient.Dispose()
    。但只有在多次创建
    新LCU()
    类时,才有意义。

    向LCU类添加dispose方法。Http连接不是持久的,除非标头“connection”未设置为“close”,否则每个请求都会创建新连接。有时,如果您在路由器或防火墙后面,连接池机制可能会导致问题,在这种情况下,您最好确保每个请求都在新连接中执行,因此在客户端
    DefaultRequestHeaders
    中添加“ConnectionClose=true”,非常感谢您的超级回答!这有点复杂,但我很快会调查的@Gusman的回答非常有效well@Germ使用我的修复程序,您可以删除
    ConnectionClose=true
    ,并可能获得性能提升。因为
    HttpClient
    将重用已打开的现有TCP连接,而不是为每个请求建立新的连接。
    await lcu.HttpClient.DeleteAsync(lcu.baseURL + "/lol-lobby/v2/lobby").ConfigureAwait(false);