私の目標は、MVC 関連だけでなく、管理されているすべてのエラーを処理するエラー処理をアプリケーション内に作成することです。したがって、HandleErrorAttribute パターンは使用していません。これは MVC エラー専用であり、他のマネージド エラー用ではないためです。
私の Global.asax には次のものがあります。
protected void Application_Error()
{
string displayError = ConfigurationManager.AppSettings["DisplayError"];
NameValueCollection serverVariables;
int loop1, loop2;
StringBuilder serverVariableKeys = new StringBuilder();
Exception exception = Server.GetLastError();
HttpException httpException = exception as HttpException;
if (HttpContext.Current != null)
{
// loop through and get server vars
}
if (exception != null)
// Log Error
// Redirect to Error page if set to basic mode
if (!string.IsNullOrWhiteSpace(displayError) && displayError.ToLower() == "basic")
{
Response.Clear();
Server.ClearError(); // needed for redirect to work
var routeData = new RouteData();
routeData.Values["controller"] = "Error";
routeData.Values["action"] = "General";
routeData.Values["exception"] = exception;
Response.StatusCode = 500;
if (httpException != null)
{
Response.StatusCode = httpException.GetHttpCode();
switch (Response.StatusCode)
{
case 403:
routeData.Values["action"] = "Http403";
break;
case 404:
routeData.Values["action"] = "Http404";
break;
}
}
IController errorsController = new Controllers.ErrorController();
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
errorsController.Execute(rc);
}
}
、およびアクションErrorController
を持つ があります。各アクションに対応するビューがあります。General
Http403
Http404
私のweb.configには次のものがあります:
<system.web>
<!-- removed bits to reduce space -->
<customErrors mode="On" />
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules >
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
<remove name="Session"/>
<add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition=""/>
</modules>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<httpErrors errorMode="Detailed" />
</system.webServer>
これはマネージ コードに関連する多くのシナリオで機能しますが、IIS が無効な静的ファイル呼び出し (example.com/BadFileName.gif) などを引き継ぐと、IIS からエラーが返され、ローカル ファイル パスなどのサーバーの詳細が開示されます。これは、web.config の次の行が原因です。
<httpErrors errorMode="Detailed" />
しかし、errorMode を Custom などの他の値に設定したり、行を削除したりすると、カスタム エラー処理が機能しなくなり、マネージ コード エラーを含むすべてに対して既定の IIS エラー メッセージが返されます。
この設定がなくてもカスタムエラーが機能するように、次のような多くのことを試しました。
CustomError
に設定mode="Off"
customError
コントローラーにリダイレクトするエラーノードを定義するhttpErrors
コントローラーにリダイレクトするエラーノードを定義する
デバッグを進めると、コントローラーへの呼び出しが表示されますが、最終的には IIS が代わりに応答を送信します。エラー ログは正しく Application_Error と呼ばれるので、コードはアプリケーションが特定のポイントまでそれを処理できるようにします。
アプリケーションの詳細:
- ASP.NET MVC 4.0
- IIS 7.5 でホスト (Azure Web サイト プレビュー)
これを使用して機能させる方法はありません<httpErrors errorMode="Detailed" />
か?