Установка элемента в HttpClientHandler приводит к ошибке «Этот экземпляр уже запустил один или несколько запросов» - PullRequest
0 голосов
/ 14 июня 2019

Вот мой код:

public class Uploader
{
    private readonly HttpMessageHandler m_httpMessageHandler;

    public Uploader(HttpMessageHandler httpMessageHandler)
    {
         m_httpMessageHandler = httpMessageHandler;
    }

    public async Task<string> Upload(string url, Dictionary<string, string> data)
    {
        HttpResponseMessage result;
        try
        {
            if (somecheck)
            {
                HttpClientHandler handler = (HttpClientHandler)m_httpMessageHandler;
                // error occurs here
                handler.ServerCertificateCustomValidationCallback = delegate { return true; };
            }

            var client = new HttpClient(m_httpMessageHandler);
            result = await client.PostAsync(url, new FormUrlEncodedContent(data));
            if (result.StatusCode != HttpStatusCode.OK)
            {
                return Strings.LabelPrinterNotConfiguredError;
            }
            else
            {
                return null; // Success!
            }
        }
        catch(Exception e) 
        {
            // do some stuff
        }
    }
}

В моем Startup.cs

services.AddSingleton<HttpMessageHandler, HttpClientHandler>();

Причина, по которой я это сделал, заключается в том, что я создал макет HttpClientHandler, используемый для модульного тестирования HttpClient. Таким образом, я могу выйти из абстрактного класса HttpMessageHandler для фиктивной реализации в моих тестах.

Я получаю эту ошибку:

System.InvalidOperationException: Этот экземпляр уже запустил один или несколько запросов. Свойства могут изменяются только перед отправкой первого запроса.

Прочитав несколько других ответов о SO, я знаю, что проблема в том, что у моего единственного HttpClientHandler как-то изменяются свойства после запуска, что не нравится среде выполнения. Однако я до сих пор не могу понять, почему это происходит, потому что не похоже, что я явно изменяю BaseAddress, Timeout или MaxResponseContentBufferSize.

Ответы, по-видимому, заключаются в том, чтобы изменить HttpClientHandler после его создания, но если да, то как мне правильно установить переменную-член ServerCertificateCustomValidationCallback?

Последующим вопросом будет: как бы я исправил эту ошибку, сохранив при этом способность издеваться / проверять HttpClient?

...