httpClient.PostAsync 中的线程已中止问题
Thread was aborted issue in httpClient.PostAsync
当我向其他人发送请求时 api 程序将崩溃并且线程被中止将发生。
请指教。
public async Task<TResponse> Post<TRequest, TResponse>(string method, TRequest request)
{
JsonMediaTypeFormatter jsonFormat = new JsonMediaTypeFormatter
{
SerializerSettings =
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,
NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None
}
};
var response = await _httpClient.PostAsync(_baseUrl + method, request, jsonFormat);
var finalResponse = await response.Content.ReadAsAsync<TResponse>();
return finalResponse;
}
请注意,不会向服务器发送任何请求。顺便说一句,_httpClient 将定义如下
_httpClient =
new HttpClient(new HttpClientHandler
{
AutomaticDecompression =
System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate
})
{Timeout = TimeSpan.FromSeconds(50)};
_httpClient.DefaultRequestHeaders.Add("Authorization", "apikey " + apiKey);
我自己弄明白了,原来PostAsync
会调用其他方法取消当前线程。所以我删除了 await
关键字并得到了最终结果。
var response = _httpClient.PostAsync(_baseUrl + method, request, jsonFormat).Result;
我们还收到“线程正在中止”错误。
对我们来说,我们对 httpClient.PostAsync
的调用来自单元测试。
一旦我们将单元测试方法签名更改为 async
,并且调用 await
,PostAsync
就成功了。
[TestMethod]
public async Task Test_blah()
{
...
// Act
var response = await testController.Call();
...
}
当我向其他人发送请求时 api 程序将崩溃并且线程被中止将发生。 请指教。
public async Task<TResponse> Post<TRequest, TResponse>(string method, TRequest request)
{
JsonMediaTypeFormatter jsonFormat = new JsonMediaTypeFormatter
{
SerializerSettings =
{
ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore,
NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None
}
};
var response = await _httpClient.PostAsync(_baseUrl + method, request, jsonFormat);
var finalResponse = await response.Content.ReadAsAsync<TResponse>();
return finalResponse;
}
请注意,不会向服务器发送任何请求。顺便说一句,_httpClient 将定义如下
_httpClient =
new HttpClient(new HttpClientHandler
{
AutomaticDecompression =
System.Net.DecompressionMethods.GZip | System.Net.DecompressionMethods.Deflate
})
{Timeout = TimeSpan.FromSeconds(50)};
_httpClient.DefaultRequestHeaders.Add("Authorization", "apikey " + apiKey);
我自己弄明白了,原来PostAsync
会调用其他方法取消当前线程。所以我删除了 await
关键字并得到了最终结果。
var response = _httpClient.PostAsync(_baseUrl + method, request, jsonFormat).Result;
我们还收到“线程正在中止”错误。
对我们来说,我们对 httpClient.PostAsync
的调用来自单元测试。
一旦我们将单元测试方法签名更改为 async
,并且调用 await
,PostAsync
就成功了。
[TestMethod]
public async Task Test_blah()
{
...
// Act
var response = await testController.Call();
...
}