【问题标题】:Net core 2.2: OperationCanceledException instead of TaskCanceledException on HttpClient timeoutNet core 2.2:在 HttpClient 超时时使用 OperationCanceledException 而不是 TaskCanceledException
【发布时间】:2020-01-20 14:47:16
【问题描述】:

在我们的项目中,我们有一个 HttpClient 用于具有严格超时的传出连接,之前,我像所有教程建议的那样处理超时情况:通过捕获 TaskCanceledException。它奏效了。但是从最近(不能说具体时间,大概一个月左右),超时开始导致OperationCanceledException

System.OperationCanceledException: The operation was canceled.
   at System.Net.Http.HttpClient.HandleFinishSendAsyncError(Exception e, CancellationTokenSource cts)
   at System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   <buisness-logic traceback>
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at System.Threading.Tasks.ValueTask`1.get_Result()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at NSwag.AspNetCore.Middlewares.SwaggerUiIndexMiddleware`1.Invoke(HttpContext context)
   at NSwag.AspNetCore.Middlewares.RedirectToIndexMiddleware.Invoke(HttpContext context)
   at NSwag.AspNetCore.Middlewares.SwaggerDocumentMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Server.IIS.Core.IISHttpContextOfT`1.ProcessRequestAsync()

把所有的catch改成OperationCanceledException问题不大,但我想知道为什么?有人知道为什么HttpClient 可以切换异常吗?我使用 VS2019 16.4.3 和 IIS express 在本地部署应用程序。网核2.2

【问题讨论】:

  • 另见this。最重要的是,无论如何,你最好还是抓住OperationCanceledException,因为这也涵盖了TaskCanceledException(派生类),并且一些内部代码重新洗牌/优化或时间更改很容易在以前开始产生OCE生产 TCE。

标签: c# asp.net-core dotnet-httpclient asp.net-core-2.2


【解决方案1】:

我找到了。

https://github.com/dotnet/corefx/issues/33957

基本上,在短暂超时的情况下,存在可能导致 OCE 发生的竞争条件。它的意思是“我们并不真正知道到底发生了什么,我们也不在乎,所以你也不应该这样做”。

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 2012-10-13
    • 2023-04-09
    • 2019-12-26
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多