在HttpClientHandler中设置成员会导致“此实例已启动一个或多个请求”错误

时间:2019-06-14 19:49:50

标签: c# .net .net-core dotnet-httpclient

这是我的代码:

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上的其他answers之后,我知道问题是我拥有的单个HttpClientHandler在启动后以某种方式对其属性进行了修改,而运行时不喜欢它。但是,我仍然不知道为什么会发生这种情况,因为我似乎并没有公开修改BaseAddressTimeoutMaxResponseContentBufferSize

答案似乎是在创建HttpClientHandler后修改ServerCertificateCustomValidationCallback,但是,如何正确设置HttpClient成员变量?

后续问题将是:如何在保持模拟/测试{{1}}功能的同时解决此错误?

0 个答案:

没有答案