Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用IHttpClientFactory时如何正确传递取消令牌_C#_Multithreading_.net Core 3.0 - Fatal编程技术网

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
}