#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-запросов.