我可以知道怎样处理垃圾吗?还是我真的需要处理掉它因为微软也在处理1https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler?view=netcore-3.1
这是我的静态图。
private static HttpClientHandler handlerWithProxy = new HttpClientHandler
{
UseCookies = false,
UseDefaultCredentials = true,
DefaultProxyCredentials = CredentialCache.DefaultCredentials,
Proxy = new WebProxy($"{MyProxy.ProxyHost}:{MyProxy.ProxyPort}", false),
UseProxy = true,
SslProtocols = SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls,
ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }
};
我在这里宣布弃尸。这是正确的吗?
private static async Task<JsonDocument> ResponseMessage(HttpRequestMessage request, CancellationToken token)
{
HttpCompletionOption option = HttpCompletionOption.ResponseHeadersRead;
using (HttpResponseMessage response = MyProxy.UseProxy ? await clientWithProxy.SendAsync(request, option, token).ConfigureAwait(false)
: await client.SendAsync(request, option, token).ConfigureAwait(false))
{
token.ThrowIfCancellationRequested();
HttpStatusCode status = response.StatusCode;
using (Stream stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
{
if (stream == null || stream.CanRead == false) { return default; }
var options = new JsonDocumentOptions { AllowTrailingCommas = true };
var json = await JsonDocument.ParseAsync(stream, options).ConfigureAwait(false);
if (!response.IsSuccessStatusCode) { throw new InvalidDataException($"Error occured: {ParseError(uri, json, status)}"); }
//is this right of calling the dispose if it is already null?
if (handler == null) { handler.Dispose(); }
return json;
}
}
}
2条答案
按热度按时间zlhcx6iw1#
这个答案很简短,但很甜蜜:
处理程序在创建时绑定到
HttpClient
。你不能扔掉那些东西。只需使用它创建您的HttpClien
t,然后忘记它。微软网站上的这个例子并不是一个典型的使用场景。请确保在创建
HttpClient
时将其设置为静态的,并且在类作用域中:您应该在应用程序的整个生命周期中对所有HTTP请求使用重用相同的
HttpClient
。nafvub8i2#
接受的答案有问题。使用singleton httpclient的问题。
底层HTTP连接可能对最初DNS解析的IP保持开放,而不管DNS的变化。在蓝/绿色部署和基于DNS的故障转移等场景中,这可能是一个问题。
使用httpClient的问题:https://learn.microsoft.com/en-us/dotnet/architecture/microservices/implement-resilient-applications/use-httpclientfactory-to-implement-resilient-http-requests#issues-with-the-original-httpclient-class-available-in-net
所以最好使用DI中的HttpClientFactory。如果你的要求是这样的,你不能使用它,你需要考虑处理DNS更改以某种方式。在此提出的解决方案:https://byterot.blogspot.com/2016/07/singleton-httpclient-dns.html