5

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>

IIS の既定のエラー ページ

/error/* は、アプリケーション内のコントローラーによって処理されます。標準エラー ページを表示する代わりに、IIS にカスタム エラー パスを実行させるにはどうすればよいですか?

これは、Azure 上で実行される ASP.NET MVC 3 です。そのままの IIS でも動作しませんが、開発サーバーがコントローラーを実行します。

4

4 に答える 4

9

IIS は defaultResponseMode を尊重しません。次のように、すべてのエラーに responseMode を追加する必要があります。

<httpErrors errorMode="Custom">
  <clear />
  <error statusCode="401" path="/error/notallowed" responseMode="ExecuteURL" />
  <error statusCode="403" path="/error/notallowed" responseMode="ExecuteURL" />
  <error statusCode="404" path="/error/notfound" responseMode="ExecuteURL" />
  <error statusCode="500" path="/error/servererror" responseMode="ExecuteURL" />
</httpErrors>

デフォルトが適用されない理由は私にはわかりません。

于 2012-04-08T10:13:30.290 に答える
3

Web全体で多くの解決策を見つけましたが、どちらも静的ファイル(たとえば、存在しない「picture.jpg」)に対しても機能していませんでした。

このソリューションは、Azure Web サイトと Azure WebRole インスタンスの両方で機能します。私はweb.config変換を使用するので、それに応じて自分のニーズに合わせて更新してください。

エラーには ASPX ページを使用しているため、正しい HTTP 応答コードを設定できます (.htm ページを使用した場合、IIS は常に HTTP 200 を設定します)。

ファイル~/404.aspxは次のとおりです。

<%@ Page Language="C#" AutoEventWireup="false" ContentType="text/html" Debug="false" EnableEventValidation="false" EnableSessionState="False" EnableViewState="false" ResponseEncoding="utf-8" Transaction="Disabled" ValidateRequest="false" ViewStateMode="Disabled" %>
<% Context.Response.StatusCode = 404; %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>404 Error - Page not found</title>
</head>
<body>
  <h1>Custom 404 page</h1>
</body>
</html>

ファイル~/500.aspxは次のとおりです。

<%@ Page Language="C#" AutoEventWireup="false" ContentType="text/html" Debug="false" EnableEventValidation="false" EnableSessionState="False" EnableViewState="false" ResponseEncoding="utf-8" Transaction="Disabled" ValidateRequest="false" ViewStateMode="Disabled" %>
<% Context.Response.StatusCode = 500; %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>500 Server Error</title>
</head>
<body>
  <h1>Custom 500 page</h1>
</body>
</html>

必要なパーツには~/Web.config以下が含まれます:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <customErrors mode="Off" />
  </system.web>

  <system.webServer>
    <httpErrors errorMode="Detailed" />
  </system.webServer>
</configuration>

必要なパーツには~/Web.Release.config以下が含まれます:

<?xml version="1.0"?>
<configuration>
  <customErrors mode="On" defaultRedirect="/500.aspx" redirectMode="ResponseRewrite" xdt:Transform="Replace">
    <!-- AWARE do NOT use address in form "~/404.htm" but in "/404.htm" -->
    <error statusCode="404" redirect="/404.aspx" />
    <error statusCode="500" redirect="/500.aspx"/>
  </customErrors>

  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace" xdt:Transform="Replace">
      <!-- AWARE do NOT use address in form "~/404.htm" but in "/404.htm" -->
      <remove statusCode="404" />
      <error statusCode="404" path="/404.aspx" responseMode="ExecuteURL" />

      <remove statusCode="500" />
      <error statusCode="500" path="/500.aspx" responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>
</configuration>

終わり。

于 2013-12-12T13:17:34.747 に答える
0

この設定が設定されていることを確認してください。

<system.webServer>

    <modules runAllManagedModulesForAllRequests="true"/>

</system.webServer>

そうしないと、IISアプリケーションがIIS設定である統合モードではなくクラシックモードで実行される可能性がありますが、Azureでは統合モードがデフォルトであると思いました(正直なところ、チェックしていません)。

于 2012-04-08T08:33:10.493 に答える