MVC 3 プロジェクトの global.asax 内ですべてのアプリケーション例外を処理しようとしています。Cassini 内ではすべてが正しく機能していますが、IIS 7.5 にデプロイするとすぐに、IIS がアプリケーションから制御を奪い始め、多くの例外自体を処理します。これにより、カスタム ロギングがバイパスされ、醜いビューが返されます。
この質問に対するダーリンの回答にも同様のアプローチがあります。これが私が現時点で使用しているものです。
protected void Application_Error(object sender, EventArgs e)
{
var app = (MvcApplication)sender;
var context = app.Context;
var exception = app.Server.GetLastError();
LogExceptionDetails(exception, Request.Url.PathAndQuery);
context.Response.Clear();
context.ClearError();
string redirectTo = "/error";
HttpException httpException = exception as HttpException;
if (httpException != null)
{
switch (httpException.GetHttpCode())
{
case 403:
redirectTo += "/forbidden";
break;
case 404:
redirectTo += "/notfound";
break;
}
}
Response.TrySkipIisCustomErrors = true;
// I should really change this so I can return a proper statusCode
Response.Redirect(redirectTo);
}
例として、に移動するlocalhost/app_code
と見苦しいビューが返され、ログに記録されません。以下を使用して、少なくともIISがカスタムビューを返すようにすることができました。
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="403" />
<error statusCode="403" path="/error/forbidden" responseMode="ExecuteURL" />
<remove statusCode="404" />
<error statusCode="404" path="/error/notfound" responseMode="ExecuteURL" />
</httpErrors>
ただし、ログの問題は解決しません。
私が試した他のことは次のとおりです。
- 設定
existingResponse="PassThrough"
。 - を使用し
<clear />
ます。 httpErrors
ありとなしのさまざまな組み合わせcustomErrors
。- 設定
<modules runAllManagedModulesForAllRequests="true" />
。 Response.TrySkipIisCustomErrors = true;
これをプログラムで処理する方法はありますか?