C# Net core 2.2:HttpClient超时时OperationCanceledException代替TaskCanceledException
在我们的项目中,我们有一个C# Net core 2.2:HttpClient超时时OperationCanceledException代替TaskCanceledException,c#,asp.net-core,dotnet-httpclient,asp.net-core-2.2,C#,Asp.net Core,Dotnet Httpclient,Asp.net Core 2.2,在我们的项目中,我们有一个HttpClient,用于严格超时的传出连接,之前,我像所有教程建议的那样处理超时情况:通过捕获TaskCanceledException。它成功了。但是从最近开始(不能说确切的时间,但大约一个月),超时开始导致操作取消异常 System.OperationCanceledException: The operation was canceled. at System.Net.Http.HttpClient.HandleFinishSendAsyncError(E
HttpClient
,用于严格超时的传出连接,之前,我像所有教程建议的那样处理超时情况:通过捕获TaskCanceledException
。它成功了。但是从最近开始(不能说确切的时间,但大约一个月),超时开始导致操作取消异常
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()
System.OperationCanceledException:操作已取消。
位于System.Net.Http.HttpClient.HandleFinishSendAsyncError(异常e,CancellationTokenSource cts)
位于System.Net.Http.HttpClient.FinishSendAsyncBuffered(任务'1 sendTask,HttpRequestMessage请求,取消令牌源cts,布尔处理)
位于Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper映射器、ObjectMethodExecutor执行器、对象控制器、对象[]参数)
在System.Threading.Tasks.ValueTask`1.get_Result()处
在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()中
在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()上
位于Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext上下文)
位于Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(状态和下一步、范围和范围、对象和状态、布尔值和isCompleted)
在Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()中
在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()上
位于Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext)
在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State&Next、Scope&Scope、Object&State、Boolean&isCompleted)
在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()中
在Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()上
位于Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext HttpContext)
位于Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext HttpContext)
在Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext HttpContext)中
---来自引发异常的上一个位置的堆栈结束跟踪---
在Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext上下文)中
位于Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext上下文)
位于NSwag.AspNetCore.middleware.SwaggerUiIndexMiddleware`1.Invoke(HttpContext上下文)
位于NSwag.AspNetCore.middleware.RedirectToIndexMiddleware.Invoke(HttpContext上下文)
位于NSwag.AspNetCore.middleware.SwaggerDocumentMiddleware.Invoke(HttpContext上下文)
位于Microsoft.AspNetCore.Server.IIS.Core.iishttpcontextroft`1.ProcessRequestAsync()
将所有捕获更改为OperationCanceledException
不是什么大问题,但我想知道为什么?有人知道为什么HttpClient
可以切换异常吗?我使用VS2019 16.4.3和IIS express在本地部署应用程序。NETCore2.2我找到了
基本上,在短时间超时的情况下,存在可能导致OCE发生的竞争条件。它的意思是“我们不知道到底发生了什么,我们也不在乎,所以你不应该太在意。”。总之,不管怎样,捕获OperationCanceledException
几乎总是更好的,因为这也包括TaskCanceledException
(派生类),而且一些内部代码重新排列/优化或时间更改很容易在以前生成TCE时开始生成OCE。