1

MVC 5 インターネット アプリケーションをコーディングしていますが、グローバルな例外処理に関して質問があります。

ファイルにApplication_Errorセットアップがありglobal.asaxます。などのエラーに対応します404 HttpExceptions

Application_Errorコントローラーで発生したすべてのエラーを関数に送信するにはどうすればよいですか? 例として、次の例外があります。

System.Web.HttpRequestValidationException: 潜在的に危険な Request.Form 値がクライアント (name="") から検出されました。

OnException(ExceptionContext filterContext)コントローラー用に を作成しましたが、Application_Errorこれらのエラーを処理する関数を取得する方法がわかりません。関数から例外を渡す必要がありますOnExceptionか、それともこれは間違ったアプローチですか?

前もって感謝します。

4

2 に答える 2

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);
        }
    }

お役に立てれば。

于 2015-03-03T12:59:32.510 に答える
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.InfrastructureWebActivatorExて経由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));
        }
    }
}
于 2015-03-03T11:52:41.017 に答える