C# 使用IHttpClientFactory时如何正确传递取消令牌
我正在尝试改进发送C# 使用IHttpClientFactory时如何正确传递取消令牌,c#,multithreading,.net-core-3.0,C#,Multithreading,.net Core 3.0,我正在尝试改进发送HttpClient.SendAsync请求后未成功的HttpResponseMessage响应的日志记录 使用.Net内核的System.Net.Http.IHttpClientFactory,此代码发出请求: 发布https//fooApp.fooDomain.com/fooMethod 内容类型:application/json;字符集=utf-8 startup.cs: services.AddHttpClient("MyHttpClient", c
HttpClient.SendAsync
请求后未成功的HttpResponseMessage
响应的日志记录
使用.Net内核的System.Net.Http.IHttpClientFactory
,此代码发出请求:
发布https//fooApp.fooDomain.com/fooMethod
内容类型:application/json;字符集=utf-8
startup.cs:
services.AddHttpClient("MyHttpClient", client =>
{
client.BaseAddress = new Uri("https//fooApp.fooDomain.com/");
client.Timeout = new TimeSpan(0, 0, 15);
});
MyHttpService.cs:
public class MyHttpService
{
private readonly IHttpClientFactory _factory;
public MyHttpService(IHttpClientFactory factory)
{
_factory = factory;
}
private async Task<HttpResponseMessage> GetHttpResponseMessage(...)
{
try
{
HttpClient httpClient = this._factory.CreateClient("MyHttpClient");
using (request.HttpContent)
{
var requestMessage = new HttpRequestMessage
{
RequestUri = new Uri("fooMethod", UriKind.Relative),
Method = HttpMethod.Post,
Content = new StringContent(string.Empty, Encoding.UTF8, "application/json")
};
using (requestMessage)
{
return await httpClient.SendAsync(requestMessage);
}
}
}
catch (Exception ex)
{
//Log the exception...
return null;
}
}
}
你是想用超时来协调你的手动取消令牌,还是?嘿@John_Monica,我不确定我是否理解你的问题,我相信是的-我正在尝试协调它们,但我不确定是否需要实现我的目标当你通过cts时,是取消异步请求,当你的请求超时时,它会被取消,它们不是一回事儿。@Shahar我想Johan以为你在用ASP.NET内核。总之,简短的版本是:HttpClient超时和您的取消令牌是两个完全不同的东西。通过检查取消令牌是否已请求取消,您并不是在检查连接是否超时。@ShaharShokrani您可以创建cts并将其传入,但这是毫无意义的。无论您是这样做还是使用timeout,您仍然会得到TaskCancelled异常。只需登录异常处理程序,而不用检查是否请求取消。
try
{
//...
return await httpClient.SendAsync(requestMessage, cts);
}
catch (TaskCanceledException ex)
{
if (cts.IsCancellationRequested) //log time-out
else //log general
}
catch (Exception ex)
{
//log general
}