当前位置: 首页 > 编程语言 > C#

WebApiv2ExceptionHandlerNotCalled分享

时间:2023-04-10 21:57:23 C#

WebApiv2ExceptionHandlerNotCalled为什么自定义的ExceptionHandler从来没有调用过,却返回标准响应(不是我想要的)?像这样注册config.Services.Add(typeof(IExceptionLogger),newElmahExceptionLogger());config.Services.Replace(typeof(IExceptionHandler),newGlobalExceptionHandler());并像这样实现公共类GlobalExceptionHandler:HttpStatusCode.Unauthorized:HttpStatusCode.InternalServerError,message="发生内部异常。文本我们将处理.Request};}}publicclassExceptionResponse:IHttpActionResult{publicHttpStatusCodestatusCode{get;set;}公共字符串消息{get;设置;}publicHttpRequestMessage请求{get;newHttpResponseMessaGE(状态码);response.RequestMessage=请求;response.Content=newStringContent(消息);返回Task.FromResult(响应);}}并像这样抛出(测试)thrownewNullReferenceException("testerror");在控制器中或在存储库中更新我没有另一个ExceptionFilter。我找到了此行为的触发器:给定URLGEThttp://localhost:XXXXX/template/lock/someId发送此标头,我的ExceptionHandler工作Host:localhost:XXXXX发送此标头,它不起作用,内置处理程序返回错误Host:localhost:XXXXXOrigin:http://localhost:YYYY这可能是CORS请求的问题(我使用带有通配符的全局WebAPICORS包)或者以我的ELMAH记录器结束。它也恰好托管在Azure(网站)上,尽管内置的错误处理程序不同。知道如何解决这个问题吗?事实证明,默认情况下只处理最外层的异常,而不是存储库类中的异常。所以以下内容也必须被覆盖:publicvirtualboolShouldHandle(ExceptionHandlerContextcontext){returncontext.ExceptionContext.IsOutermostCatchBlock;}Update1WebAPIv2不再使用IsOutermostCatchBlock。无论如何,我的实现没有任何变化,因为ShouldHandle的新代码仍然阻止我的错误处理程序。所以我正在使用它并且我的错误处理程序被调用一次。我以这种方式捕获控制器和存储库中的错误。publicvirtualboolShouldHandle(ExceptionHandlerContextcontext){returntrue;}UPDATE2因为这个问题得到了如此多的关注,请注意当前的解决方案是@JustAMartin在下面的评论中链接的解决方案。这里的真正罪魁祸首是在消息处理管道中通过EnableCors方法插入的CorsMessageHandler。catch块拦截任何异常并在它到达HTTPServertry-catch块之前将其转换为响应,并且可以调用ExceptionHandler逻辑。以上就是C#学习教程:WebApiv2ExceptionHandler不调用的所有分享内容。更多关于C#学习教程,希望大家多多关注—HttpResponseMessage结果;如果(corsRequestContext.RequestContext!=null){corsRequestContext!=null)IsPreflight){result=awaitthis.HandleCorsPreflightRequestAsync(request,corsRequestContext,cancellationToken);返回结果;}result=awaitthis.HandleCorsRequestAsync(request,corsRequestContext,cancellationToken);返回结果;}catch(Exception异常){result=CorsMessageHandler.HandleException(请求,异常);返回结果;}}result=awaitthis.n__FabricatedMethod3(request,cancellationToken);返回结果;}本文收集自网络,不代表侵权等立场请点击右侧联系管理员删除。如需转载请注明出处: