Правильный способ удаления HttpClientHandler

#c# #winforms #.net-framework-version

#c# #winforms #.net-framework-version

Вопрос:

Могу ли я узнать, как правильно удалить обработчик? или мне действительно нужно его утилизировать? Потому что Microsoft также отправляет обработчикhttps://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;
            }
        }
    }
  

Комментарии:

1. Обработчики привязаны к HttpClient при создании. Вы не удаляете их. Просто создайте свой HttpClient с ним и забудьте об этом. Этот пример на сайте MS не является типичным сценарием использования.

2. Ах, так что это значит, если я уже добавил его в свой HttpClient следующим образом: закрытый статический HttpClient clientWithProxy только для чтения = новый HttpClient (handlerWithProxy); не о чем беспокоиться об удалении?

3. Точно — вы создали свой клиент именно так, как он должен быть создан. Этот клиент статичен и будет жить в течение всего срока службы вашего приложения, то же самое с этим единственным обработчиком. Вы ничего не пропускаете.

Ответ №1:

Этот ответ будет коротким, но приятным:

Обработчики привязаны к HttpClient при создании. Вы не удаляете их. Просто создайте свой HttpClien t с ним и забудьте об этом. Этот пример на сайте MS не является типичным сценарием использования.

Убедитесь, что при создании вашего HttpClient вы делаете его статичным и в области видимости класса:

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

Вы должны повторно использовать одно и то же HttpClient на протяжении всего срока службы вашего приложения для всех HTTP-запросов.