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