MVC全球例外

时间:2015-03-03 11:27:54

标签: c# exception asp.net-mvc-5 global-asax application-error

我正在编写一个MVC 5互联网应用程序,我对全球处理异常有疑问。

我在Application_Error文件中设置了global.asax。这可以应对404 HttpExceptions等错误。

如何将控制器中发生的所有错误发送到Application_Error功能?一个例子是以下例外:

  

System.Web.HttpRequestValidationException:有潜在危险   从客户端检测到Request.Form值(name ="")。

我为我的控制器编写了一个OnException(ExceptionContext filterContext),但我不确定如何让Application_Error函数来处理这些错误。我是否需要从OnException函数传递异常,或者这是错误的方法?

提前致谢。

2 个答案:

答案 0 :(得分:1)

我正在使用某种http模块,这正是我所要求的:

public class MyModule : IHttpModule {

    public void Init(HttpApplication context) {
        context.Error += OnRequestError;
    }

    private void OnRequestError(object sender, EventArgs e) {
        var context = ((HttpApplication)sender).Context;

        var error = context.Error;
        if (error == null)
            return;
        var errorType = error.GetType();
        if (errorType == typeof(HttpException))
            // do something

        // this is what you are looking for
        if (errorType = typeof(HttpRequestValidationException))
            // do something, whatever you want
        // works for me, so should work to you too
    }
}

要使模块正常工作,您可以使用web.configDynamicModuleHelper

  • 通过Microsoft.Web.Infrastructure
  • 安装WebActivatorExnuget
  • 在项目中添加Bootstrapper课程
  • PreApplicationStartMethod
  • 注册模块

样品:

// File: Bootstrapper.cs (contains class Bootstrapper)

using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using WebActivatorEx;
using WhatEver.It.Is;

[assembly: PreApplicationStartMethod(typeof(Bootstrapper), "Bootstrap")]

namespace WhatEver.It.Is {
    public class Bootstrapper {
        public static void Bootstrap() {
            // Do what do you need just before the application get started
            // like registering modules, etc...
            DynamicModuleUtility.RegisterModule(typeof(MyModule));
        }
    }
}

答案 1 :(得分:1)

您可以通过将以下类添加到App_Start文件夹来创建全局过滤器: -

public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());

        }
    }

HandleErrorAttribute可以替换为您自己的自定义异常过滤器。

您需要做的就是确保将以下代码行添加到Gloabal.asax的App_Start方法中: -

 public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            //AreaRegistration.RegisterAllAreas();
            //RouteConfig.RegisterRoutes(RouteTable.Routes);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        }
    }

希望这有帮助。