2

MVC3 Web サイトがあり、404 エラー ページを正しく表示しようとしています。私はそれをすべて設定しました

  • URLをリダイレクトしません。
  • ヘッダーで実際の 404 エラー ステータスを返し、
  • URL をログに記録し、
  • 私が作成したカスタムページです。
  • .aspx/.html ページではなく、実際のアクション/コントローラー ページです。

Visual Studio でデバッグすると、完全に機能します。テスト環境または実稼働環境に投稿すると、機能せず、ヘッダーに 404 ステータスの一般的なファイルが見つかりませんでした。

エラー ページはデフォルトの 404 エラー ( thisまたは this ) ではありませんが、サーバー自体のグローバル カスタムのようです (サーバーは複数のサイトをホストし、すべての 404 は同じ単純な行ページを表示します)。サーバーのエラー ページには、実際には 500 エラー ページが表示されます。また、Response.TrySkipIisCustomErrors = true を設定してバイパスしようとしましたが、うまくいきません。

本番サーバーとテスト サーバーでは正しくログに記録されており、404 ステータス コードが返されない場合は、エラー ページが表示されます。それで、アクション/ビューが機能していると確信していますが、それはどういうわけかサーバーにあります。ASP.NET 4 と IIS 7 を実行しています。

これを修正するために何を/どこで調査するかについての提案はありますか?

.

コードのリソース これまでの私のソリューションは
、ASP.NET MVC で 404 を適切に処理するにはどうすればよいですか? に基づいています。

これは、Application_Error で例外をキャプチャすることによって、私が行っていることのベースです。簡単にループにつながる可能性があるため、私はまだ少し警戒しているので、それを防ぐためにすべてを試み/キャッチしました(別のエラーをキャッチする内にエラーが発生します)

global.asax のコード

    protected void Application_Error(object sender, EventArgs e)
    {
            try
        {
            Exception exception = Server.GetLastError();

            Response.Clear();

            HttpException httpException = exception as HttpException;

            RouteData routeData = new RouteData();
            routeData.Values.Add("controller", "Error");

            if (httpException == null)
            {
                routeData.Values.Add("action", "NotFound");
            }
            else
            {
                switch (httpException.GetHttpCode())
                {
                    case 404:
                        // Page not found.
                        routeData.Values.Add("action", "NotFound");
                        break;
                    case 500:
                        // Server error.
                        routeData.Values.Add("action", "ServerError");
                        break;


                    default:
                        routeData.Values.Add("action", "General");
                        break;
                }
            }

            routeData.Values.Add("error", exception);

            Server.ClearError();

            Response.TrySkipIisCustomErrors = true;

            IController errorController = new ErrorController();
            errorController.Execute(new RequestContext(
                 new HttpContextWrapper(Context), routeData));
        }
        catch
        {
            //
        }
    }

エラー コントローラーのコード

 public ActionResult NotFound()
    {
        try
        {

            Response.StatusCode = (int)HttpStatusCode.NotFound;
            Response.TrySkipIisCustomErrors = true;
        }
        catch
        {}
        return View();
    }
4

2 に答える 2

0

私も同じ問題を抱えていました。web.configファイルを変更する必要があります。

  <system.webServer>    
     <httpErrors errorMode="Custom" existingResponse="Replace">
        <remove statusCode="404" />
        <error statusCode="404" responseMode="ExecuteURL" path="/Errors/404" />
     </httpErrors>  
  </system.webServer>

/ Errors/404をカスタムエラーページへのパスに置き換え ます。

于 2012-07-12T23:17:17.493 に答える
0

TrySkipIisCustomErrorsasを指定しましたtrueか?ここで確認してください。

于 2012-07-13T03:45:33.287 に答える