winforms 处理HttpClient的正确方法

huwehgph  于 2023-10-23  发布在  其他
关注(0)|答案(2)|浏览(108)

我可以知道怎样处理垃圾吗?还是我真的需要处理掉它因为微软也在处理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;
            }
        }
    }
zlhcx6iw

zlhcx6iw1#

这个答案很简短,但很甜蜜:
处理程序在创建时绑定到HttpClient。你不能扔掉那些东西。只需使用它创建您的HttpClien t,然后忘记它。微软网站上的这个例子并不是一个典型的使用场景。
请确保在创建HttpClient时将其设置为静态的,并且在类作用域中:

private static readonly HttpClient clientWithProxy = new HttpClient(handlerWithProxy);

您应该在应用程序的整个生命周期中对所有HTTP请求使用重用相同的HttpClient

nafvub8i

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

相关问题