我有一个 ASP WebAPI 项目。我正在尝试在我的基本 Controller 上设置一个全局异常处理程序。所以我像这样创建了一个 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());
}
}
当我将属性添加到我的 Controller (或基本 Controller )时,没有任何记录。我做错了什么?
编辑:我的 Controller 抛出异常:
[HttpGet]
public string Hello(string name)
{
if (name.Equals("error", StringComparison.OrdinalIgnoreCase))
{
throw new HttpResponseException(HttpStatusCode.InternalServerError);
}
else
{
return name;
}
}
最佳答案
实际上,当您将该过滤器添加到您的 HttpConfiguration
时,这意味着它将针对任何操作执行。也就是说,您不需要将整个属性添加到您的 API Controller 。
什么可以跳过你的过滤器?其他过滤器。设置响应的第一个过滤器获胜,并且可能会发生操作本身永远不会执行的情况。
无论如何,也许您需要切换到实现一个IExceptionHandler
并将其配置如下:
config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());
这种方法更好,因为它是真正的最后机会异常处理程序,并且它总是会独立于过滤器的行为被调用。
关于c# - WebAPI 全局异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32758467/