这是我的代码:
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
在启动后以某种方式对其属性进行了修改,而运行时不喜欢它。但是,我仍然不知道为什么会发生这种情况,因为我似乎并没有公开修改BaseAddress
,Timeout
或MaxResponseContentBufferSize
。
答案似乎是在创建HttpClientHandler
后修改ServerCertificateCustomValidationCallback
,但是,如何正确设置HttpClient
成员变量?
后续问题将是:如何在保持模拟/测试{{1}}功能的同时解决此错误?