【问题标题】:MVC global exceptionsMVC 全局异常
【发布时间】:2015-03-03 11:27:53
【问题描述】:

我正在编写一个 MVC 5 互联网应用程序,我有一个关于全局处理异常的问题。

我的global.asax 文件中有我的Application_Error 设置。这迎合了诸如404HttpExceptions之类的错误。

如何将控制器中发生的所有错误发送到Application_Error 函数?一个例子是以下异常:

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

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

提前致谢。

【问题讨论】:

  • 如果要处理异常,在 OnException 中编写代码并将 ExceptionHandled 标记为 true,如果您不使用此方法或不将其标记为已处理,则会转到 Application_Error(应该是仅用于 ASP.NET 故障记录,但不适用于您的应用程序异常处理)。

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


【解决方案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);
        }
    }

希望这会有所帮助。

【讨论】:

  • 我已经创建了一个全局过滤器,但是是否可以从全局过滤器中调用 Application_Error 函数?应该这样做,还是应该 Application_Error 只针对不是来自控制器的异常?
【解决方案2】:

我正在使用某种 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

  • 通过nuget 安装Microsoft.Web.InfrastructureWebActivatorEx
  • 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));
        }
    }
}

【讨论】:

  • 如何让模块工作?我在 web.config 中添加了代码和以下内容:
猜你喜欢
  • 2016-02-12
  • 2016-11-18
  • 2013-05-29
  • 1970-01-01
  • 2020-06-21
  • 2019-03-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多