Вот мой код:
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
?