MVC パイプライン外のエラーに対してカスタム エラー ページを提供するように IIS を設定できません。コントローラー内で例外をスローすると、それはすべてファイルであり、Application_Error イベントはそれを処理します。
protected void Application_Error(object sender, EventArgs e)
{
var error = Server.GetLastError();
var routeData = new RouteData();
routeData.Values["Controller"] = "Error";
routeData.Values["Area"] = "";
routeData.Values["Exception"] = error;
if (error is HttpException)
{
switch (((HttpException)error).GetHttpCode())
{
case 401:
routeData.Values["Action"] = "NotAllowed";
break;
case 403:
routeData.Values["Action"] = "NotAllowed";
break;
case 404:
routeData.Values["Action"] = "NotFound";
break;
default:
routeData.Values["Action"] = "ServerError";
break;
}
}
else
{
routeData.Values["Action"] = "ServerError";
}
Response.Clear();
Server.ClearError();
IController controller = new ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(((MvcApplication)sender).Context), routeData));
}
ただし、存在しない URL を参照すると、IIS は 404 エラー (またはその他のエラー) を処理し、標準の IIS エラー メッセージを表示して、web.config 設定を完全に無視します。
<system.web>
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/error">
<error statusCode="401" redirect="/error/notallowed" />
<error statusCode="403" redirect="/error/notallowed" />
<error statusCode="404" redirect="/error/notfound" />
<error statusCode="500" redirect="/error/servererror" />
</customErrors>
</system.web>
<system.webServer>
<httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL">
<clear />
<error statusCode="401" path="/error/notallowed" />
<error statusCode="403" path="/error/notallowed" />
<error statusCode="404" path="/error/notfound" />
<error statusCode="500" path="/error/servererror" />
</httpErrors>
</system.webServer>
/error/* は、アプリケーション内のコントローラーによって処理されます。標準エラー ページを表示する代わりに、IIS にカスタム エラー パスを実行させるにはどうすればよいですか?
これは、Azure 上で実行される ASP.NET MVC 3 です。そのままの IIS でも動作しませんが、開発サーバーがコントローラーを実行します。