C# ExceptionFilter OneException未被调用

C# ExceptionFilter OneException未被调用,c#,asp.net-mvc,exception-handling,C#,Asp.net Mvc,Exception Handling,我不擅长使用例外过滤器 点击链接: 我已经创建了一个类 public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext context) { if (context.Exception is NotImplementedException) {

我不擅长使用例外过滤器

点击链接:

我已经创建了一个类

public class NotImplExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is NotImplementedException)
        {
            context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
        }
    }
}
然后,我在控制器的单个方法上使用了该属性。我还没有全局添加过滤器,因为我希望它现在可以在单个方法上工作

public class HomeController : Controller
{
    [NotImplExceptionFilter]
    public void Test()
    {
        throw new NotImplementedException("This method is not implemented");
    }
}

但并非每次我抛出错误时都会调用OnExepction。请让我知道我遗漏了什么

我想你的问题是你继承了
Controller
类,而不是
ApiController

由于您在此属性中使用的是
System.Web.Http
命名空间,因此它仅适用于Api控制器

如果您还想使用其他控制器,则需要添加另一个异常过滤器属性,但在这种情况下,不要使用
System.Web.Http
,而是使用
System.Web.Mvc
命名空间,而其他部分将几乎是相同的代码(只有一些小的更改)


再次重写
OnException
,并将逻辑放在其中,但请记住,这两种方式在向用户实际显示错误消息的方式上是不同的。第一个使用响应来显示消息,另一个必须以不同的方式实现。可能看看这个

我认为您的问题是您继承了
Controller
类,而不是
ApiController

由于您在此属性中使用的是
System.Web.Http
命名空间,因此它仅适用于Api控制器

如果您还想使用其他控制器,则需要添加另一个异常过滤器属性,但在这种情况下,不要使用
System.Web.Http
,而是使用
System.Web.Mvc
命名空间,而其他部分将几乎是相同的代码(只有一些小的更改)


再次重写
OnException
,并将逻辑放在其中,但请记住,这两种方式在向用户实际显示错误消息的方式上是不同的。第一个使用响应来显示消息,另一个必须以不同的方式实现。可能看看这个

您的另一个问题是缺少System.Web.Mvc.FilterAttribute,一旦应用该属性,它应该会按预期触发。(前提是您更改使用IEExceptionFilter/ExceptionContext而不是ExceptionFilterAttribute/HttpActionExecutedContext,如前所述)

例如:

[AttributeUsage(AttributeTargets.Method]
    public class NotImplExceptionFilterAttribute : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext) {
        {
            if (filterContext.Exception is NotImplementedException)
        {
            filterContext.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
        }
    }
}

您的另一个问题是缺少System.Web.Mvc.FilterAttribute,一旦应用该属性,它将按预期触发。(如果您更改使用IEExceptionFilter/ExceptionContext而不是ExceptionFilterAttribute/HttpActionExecutedContext,如前所述)

例如:

[AttributeUsage(AttributeTargets.Method]
    public class NotImplExceptionFilterAttribute : FilterAttribute, IExceptionFilter
    {
        public void OnException(ExceptionContext filterContext) {
        {
            if (filterContext.Exception is NotImplementedException)
        {
            filterContext.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
        }
    }
}

无法执行。因为我的控制器上有一些操作正在使用视图,如果我使用ApicController,它将出错。异常处理是否仅在ApicController上有效?在这种情况下,它仅对api控制器有效,因为您当前使用的是
System.Web.Http
namespace.hmm,但是有没有一种方法可以使用error handling在控制器上而不是在ApiController上?@HVT_08查看编辑。最后,有一种方法可以向用户显示错误消息。您可以自定义这样做的方式,但总体思路仍然是它帮助无法做到的。因为我的控制器上有一些操作正在使用视图,如果我使用ApiController,它将出错。异常处理是否仅适用于ApicController?在本例中,它仅适用于api控制器,因为您当前使用的是
System.Web.Http
namespace.hmm,但是有没有一种方法可以在不在ApicController上的控制器上使用错误处理?@HVT_08查看编辑。最后,有一种方法可以向用户显示错误消息用户。您可以定制这样做的方式,但总体思路与它所帮助的相同