2

ASP.NET MVC でキャッチオール ルートを作成するためのオンライン (特に StackOverflow) でいくつかの例を見つけましたが、これは MVC4 では機能していないようです。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("elfinder.connector");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "CatchAll",
        url: "{*url}",
        defaults: new { controller = "Home", action = "CatchAll" }
    );

}

コントローラ アクションは次のように定義されます。

    public ActionResult CatchAll(string url)
    {
        // catch the URL and use it for something
    }

ここでの目標は、潜在的な 404 エラーをすべて傍受し、URL に応じて 404 または別のエラーで応答することです。ただし、私は決してCatchAllアクションに終わらず、次のような URL に対してデフォルトの 404 を取得するだけです。

  • 〜/フー
  • ~/this/is/a/test/url

ここで何か間違ったことをしていますか?Application_Errorエラーをキャッチして、404 の場合はそこから再転送する必要は避けたいと思います。ちょっと面倒なようです。これらのリクエストを処理する適切な方法は、単純に正しいアクションにルーティングすることだと思います。

更新:私の URL 純粋主義者は の使用を避けたいと考えていますがResponse.Redirect、現在、リクエストのグローバルなキャッチオールとして次のことを試みています。

protected void Application_Error()
{
    Exception exception = Server.GetLastError();
    HttpException httpException = exception as HttpException;

    if (httpException != null)
        if (httpException.GetHttpCode() == 404)
        {
            Server.ClearError();
            Response.Redirect(String.Format("~/Home/CatchAll/?url={0}", Request.Path));
        }
}

ただし、これは URL の構造がルートと一致する場合にのみ機能します。そうしないと、IIS は要求をアプリケーションに送信することさえせず、404 を直接返すだけのようです。アクションにマップされていない Web サイトの URL が要求された場合、グローバル ハンドラーがほとんど必要です。

更新: 2 つのことを組み合わせるとうまくいくようです。まず、404 をキャッチするとApplication_Error(またはApplication_EndRequest、一部の人が示唆するように、私のニーズにはどちらの方法でも機能します)、ルート構造に一致するがアクションが見つからないものはすべてカバーされます。ただし、ルート構造に一致しないリクエストのケースがまだあります。

さまざまな理由から、IIS を微調整する必要はありません。ソリューションは、アプリケーション自体に含まれている必要があります。幸いなことに、最新の .NET と IIS を保証できるので、Web.config設定を使用して IIS にエラーの処理方法を指示できます。だから私は現在これを試しています:

<httpErrors errorMode="Custom" defaultResponseMode="Redirect" defaultPath="/Home/CatchAll">
  <clear/>
</httpErrors>

しかし、これは完全に正しいとは言えません。エラー応答が変更されたという点で IIS影響を与えていますが、それでもエラー応答です。それは次のとおりです。

HTTP エラー 500.19 - 内部サーバー エラー

ページの関連構成データが無効であるため、要求されたページにアクセスできません。

したがって、私は正しい方向に進んでいるように見えます。アクションにすべての 404 (またはすべてのエラーでさえ、ほとんど違いはありません) を送信するためにを使用httpErrorsする実際の例を見つけるのに苦労しています。Web.config

4

0 に答える 0