MVC 全局异常
MVC global exceptions
我正在编写一个 MVC 5 互联网应用程序,我有一个关于全局处理异常的问题。
我的 Application_Error
设置在我的 global.asax
文件中。这迎合了诸如 404
HttpExceptions
.
之类的错误
如何将控制器中发生的所有错误发送到 Application_Error
函数?一个示例是以下异常:
System.Web.HttpRequestValidationException: A potentially dangerous
Request.Form value was detected from the client (name="").
我已经为我的控制器编写了一个 OnException(ExceptionContext filterContext)
,但我不确定如何获得 Application_Error
函数来处理这些错误。我是否需要从 OnException
函数传递异常,或者这是错误的方法?
提前致谢。
我正在使用某种 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.config
或 DynamicModuleHelper
:
- 通过
nuget
安装Microsoft.Web.Infrastructure
和WebActivatorEx
- 向您的项目添加
Bootstrapper
class
- 在
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));
}
}
}
您可以通过将以下 class 添加到您的 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);
}
}
希望对您有所帮助。
我正在编写一个 MVC 5 互联网应用程序,我有一个关于全局处理异常的问题。
我的 Application_Error
设置在我的 global.asax
文件中。这迎合了诸如 404
HttpExceptions
.
如何将控制器中发生的所有错误发送到 Application_Error
函数?一个示例是以下异常:
System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (name="").
我已经为我的控制器编写了一个 OnException(ExceptionContext filterContext)
,但我不确定如何获得 Application_Error
函数来处理这些错误。我是否需要从 OnException
函数传递异常,或者这是错误的方法?
提前致谢。
我正在使用某种 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.config
或 DynamicModuleHelper
:
- 通过
nuget
安装 - 向您的项目添加
Bootstrapper
class - 在
PreApplicationStartMethod
注册模块
Microsoft.Web.Infrastructure
和WebActivatorEx
样本:
// 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));
}
}
}
您可以通过将以下 class 添加到您的 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);
}
}
希望对您有所帮助。