【发布时间】:2016-02-24 23:55:41
【问题描述】:
我有一些代码通过调用许多其他服务来验证某些数据。我并行启动所有调用,然后等待至少其中一个调用完成。如果任何请求失败,我不关心其他调用的结果。
我使用HttpClient 拨打电话,我通过了HttpMessageHandler 进行了大量的日志记录。本质上:
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = null;
try
{
response = await base.SendAsync(request, cancellationToken);
}
catch (OperationCanceledException ex)
{
LogTimeout(...);
throw;
}
catch (Exception ex)
{
LogFailure(...);
throw;
}
finally
{
LogComplete(...);
}
return response;
}
不,我遇到问题的部分是我取消请求时。当我取消一个请求时,我是故意这样做的,所以我不希望它被记录为超时,但取消和真正的超时之间似乎没有任何区别。
有没有办法做到这一点?
编辑:我需要稍微澄清一下。并行调用的服务是在超时的情况下传入 CancellationTokens:
var ct = new CancellationTokenSource(TimeSpan.FromSeconds(2));
所以当服务器响应时间超过两秒时,我会得到一个OperationCanceledException,如果我手动取消令牌源(比如因为另一台服务器在 1 秒后返回错误),那么我仍然会得到一个@987654326 @。理想情况下,我可以查看CancellationToken.IsCancellationRequested 来确定它是否由于超时而被取消,而不是明确要求取消,但无论如何,您似乎都获得了相同的值> 它被取消了。
【问题讨论】:
-
已存储客户端的最后日期时间。然后检查它与当前时间。如果日期时间的差异大于超时时间,则认为客户端超时。否则,就是取消。沿着这条线的东西。
-
您可以只检查取消令牌是否已请求取消。即使发生竞争条件,并且请求在您想取消它时超时,您可能仍然想忽略它,因为您确实取消了它。
标签: c# http dotnet-httpclient cancellation cancellationtokensource