2015-03-03 3 views
1

Я кодирую интернет-приложение MVC 5, и у меня есть вопрос относительно обработки исключений во всем мире.Международные исключения MVC

У меня есть моя Application_Error установка в моем global.asax файлах. Это относится к ошибкам, таким как 404HttpExceptions.

Как я могу отправить все ошибки, возникающие в контроллере, в функцию Application_Error? Примером может служить следующее исключение:

System.Web.HttpRequestValidationException: потенциально опасное значение Request.Form было обнаружено от клиента (имя = «»).

Я написал OnException(ExceptionContext filterContext) для моего контроллера, но я не уверен, как получить функцию Application_Error обрабатывать эти ошибки. Нужно ли передавать исключение из функции OnException, или это неправильный подход?

Заранее благодарен.

+0

Если вы хотите обработать исключение, вы пишете код в OnException и отмечаете ExceptionHandled как true, если вы не используете этот метод или не отмечаете его как обработанный, он переходит к Application_Error (который должен использоваться только для ASP. NET, но не для обработки исключений вашего приложения). –

ответ

1

Вы можете создать глобальный фильтр, добавив следующий класс в папку App_Start: -

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

     } 
    } 

HandleErrorAttribute может быть заменен ваш собственный фильтр исключений.

Все, что вам тогда нужно сделать, это убедиться, что вы добавить следующую строку коды в методу App_Start вашего Gloabal.asax: -

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

Надеется, что это помогает.

+0

Я создал глобальный фильтр, но можно позвонить функция Application_Error из глобального фильтра? Должно ли это быть сделано, или должно ли Application_Error быть только для исключений не из контроллера? – user3736648

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.config или DynamicModuleHelper:

  • Установите Microsoft.Web.Infrastructure и WebActivatorEx через nuget
  • Добавить 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)); 
     } 
    } 
} 
+0

Как мне заставить модуль работать? Я добавил код и следующее в web.config: user3736648

+0

@ user3736648 См. Обновление, пожалуйста, –

Смежные вопросы