Thi*_*ijs 15 c# asp.net exception-handling asp.net-web-api
我有一个ASP WebAPI项目.我正在尝试在我的basecontroller上设置一个全局异常处理程序.所以我创建了一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我也注册了 /App_Start/WebApiConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// ...
// Setup Filters
config.Filters.Add(new MyExceptionFilterAttribute());
}
}
Run Code Online (Sandbox Code Playgroud)
当我将属性添加到我的控制器(或基本控制器)时,没有任何记录.我究竟做错了什么?
编辑:我的控制器抛出异常:
[HttpGet]
public string Hello(string name)
{
if (name.Equals("error", StringComparison.OrdinalIgnoreCase))
{
throw new HttpResponseException(HttpStatusCode.InternalServerError);
}
else
{
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
Thi*_*ijs 11
就像@ShekharPankaj所指出的那样,并非所有异常都由属性(或者@Matías提供的方法)处理.我的代码很好.我简单地将异常更改为a ArgumentException并进行处理.
另请参见此SO-thread:捕获ASP.NET Web Api中所有未处理的异常
要回答我自己的问题,这是不可能的!
处理导致内部服务器错误的所有异常似乎是Web API应具备的基本功能,因此我向Microsoft提出了针对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
Mat*_*zer 10
实际上,当您将该过滤器添加到HttpConfiguration它时,意味着它将被执行以执行任何操作.也就是说,您不需要将整个属性添加到API控制器中.
什么可以跳过你的过滤器?其他过滤器.设置响应的第一个过滤器获胜,并且可能发生动作本身从未执行过.
无论如何,也许您需要切换到实现IExceptionHandler并按如下方式配置它:
config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler());
Run Code Online (Sandbox Code Playgroud)
这种方法更好,因为它是一个真正的最后机会异常处理程序,它将始终独立于过滤器的行为进行调用.
| 归档时间: |
|
| 查看次数: |
30905 次 |
| 最近记录: |