WebAPI全局异常处理
本文关键字:异常处理 全局 WebAPI | 更新日期: 2023-09-27 18:14:16
我有一个ASP WebAPI项目。我试图在我的基本控制器上设置一个全局异常处理程序。所以我创建了一个这样的ExceptionFilterAttribute
using System.Web.Http.Filters;
public class MyExceptionFilterAttribute : ExceptionFilterAttribute
{
protected static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
var exception = actionExecutedContext.Exception;
log.Fatal(exception);
base.OnException(actionExecutedContext);
}
}
然后我也在/App_Start/WebApiConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// ...
// Setup Filters
config.Filters.Add(new MyExceptionFilterAttribute());
}
}
当我添加属性到我的控制器(或基本控制器)时,没有记录任何内容。我做错了什么?
编辑:我的控制器抛出异常:
[HttpGet]
public string Hello(string name)
{
if (name.Equals("error", StringComparison.OrdinalIgnoreCase))
{
throw new HttpResponseException(HttpStatusCode.InternalServerError);
}
else
{
return name;
}
}
实际上,当你添加过滤器到你的HttpConfiguration
,这意味着它将被执行任何行动。也就是说,你不需要把整个属性添加到你的API控制器中。
什么可以跳过你的过滤器?其他过滤器。设置响应的第一个过滤器获胜,并且操作本身可能永远不会执行。
无论如何,也许您需要切换到实现IExceptionHandler
并按如下方式配置它:
config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());
这种方法更好,因为它是一个真正的最后机会异常处理程序,它将始终独立于过滤器的行为被调用。
就像@ShekharPankaj指出的那样,并非所有异常都由属性(或@Matías提供的方法)处理。我的代码没问题。我简单地将异常更改为ArgumentException
,它得到处理。
参见SO-thread: catch ASP中所有未处理的异常。. NET Web Api
回答我自己的问题,这是不可能的!
处理所有导致内部服务器错误的异常似乎是一个错误Web API应该具有的基本功能,因此我在请求中添加了Microsoft for Web API的全局错误处理程序:
https://aspnetwebstack.codeplex.com/workitem/1001如果你同意,就去那个链接投票吧!
在此期间,优秀的文章ASP。. NET Web API异常处理显示了几种不同的方法来捕获一些不同的错误的分类。这比它应该的要复杂得多,而且不能捕获所有内部服务器错误,但这是最好的方法今天可用的。
更新:全局错误处理现已实现,并可在每夜构建!它将以ASP发布。. NET MVC v5.1。它是这样的将工作:https://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling