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