首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC全局异常

MVC全局异常
EN

Stack Overflow用户
提问于 2015-03-03 11:27:53
回答 2查看 716关注 0票数 1

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

我的Application_Error设置在我的global.asax文件中。这满足了诸如404 HttpExceptions之类的错误。

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

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

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

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-03 12:59:32

可以通过将以下类添加到App_Start文件夹中来创建全局筛选器:

代码语言:javascript
复制
public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());

        }
    }

可以将HandleErrorAttribute替换为您自己的自定义异常筛选器。

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

代码语言:javascript
复制
 public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            //AreaRegistration.RegisterAllAreas();
            //RouteConfig.RegisterRoutes(RouteTable.Routes);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        }
    }

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2015-03-03 11:52:41

我正在使用某种http-模块,它给了我确切的您要求的内容:

代码语言:javascript
复制
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.InfrastructureWebActivatorEx安装nuget
  • Bootstrapper类添加到项目中
  • PreApplicationStartMethod注册模块

示例:

代码语言:javascript
复制
// 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28830676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档