【问题标题】:ASP NET MVC OnException not being called ApiControllerASP NET MVC OnException 未被调用 ApiController
【发布时间】:2014-02-14 09:28:37
【问题描述】:

我试图拦截所有异常,但代码从未运行。我试过把它放到GlobalFilters,也把它直接放到我的方法上。

我的属性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public class HandleExceptionAttribute : HandleErrorAttribute 
{
    private ILog log = LogManager.GetLogger(typeof(HandleExceptionAttribute));

    public override void OnException(ExceptionContext filterContext) 
    {
        log.Info("inside on exception"); // this never appears
    }
}

我的班级:

public class Tester 
{
    [HandleException]
    public void Except() 
    {
        var asd = 0;
        var qwe = 1 / asd;              
    }
}

除以零给我一个异常,我的调试器捕获它,我继续,但没有任何内容写入日志文件。

记录器工作。其他日志出现在文件中。即使我禁用调试,它也不会读取日志文件,因此不是调试器故障。

在 IIS Express 上运行它。视窗 7。

编辑:

将事物移至控制器。还是不行

public class UserController : ApiController 
{
    private ILog log = LogManager.GetLogger(typeof(UserController));

    [HandleException]
    [CheckModelForNull]
    [ValidateModelState]
    public object Post([FromBody]User user) 
    {    
        var asd = 0;
        var qwe = 1 / asd;
        return new HttpStatusCodeResult(HttpStatusCode.OK);
    }
}

【问题讨论】:

  • 过滤器属性仅适用于动作和控制器。您可能正在寻找 AoP。
  • +1 提出一个很好的问题
  • 你还没有这个属性。
  • @SLaks 看到我的最新更新,mby 是因为它的 apicontroller?
  • 是的; MVC 和 Web API 完全不同。

标签: c# asp.net-mvc asp.net-mvc-4 exception-handling asp.net-apicontroller


【解决方案1】:

ApiControllers 不使用HandleErrorAttribute

最好使用ExceptionFilterAttribute

public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute 
{
    public override void OnException(HttpActionExecutedContext context)
    {
       log.error("ERROR",context.Exception);
    }
}

http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling

【讨论】:

    【解决方案2】:

    如评论中所述,过滤器属性仅适用于控制器中的操作。如果您还想捕获其他类的错误或代码进入操作之前发生的某些事情,则需要覆盖Global.asax 中的Application_Error 方法:

    protected void Application_Error(object sender, EventArgs e)
    {
        log.Info("inside on exception"); 
    }
    

    【讨论】:

    • 已将其移至控制器,但仍无法正常工作。查看我的编辑。
    • 您是否在 global.asax 中注册了过滤器(Application_Start 方法)?
    • 我试过了,但不用注册,如果我直接应用在控制器端点上
    • 然后检查默认的 HandleErrorAttribute 是否未在您的 Application_Start 方法中注册。如果是,它将在异常到达您的方法之前处理。
    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多