4

タイトルはそれをすべて言います。実際、これを行う方法についてはたくさんの情報があり、私は非常に親密です。私はグーグルでいくつかのことと次のstackoverflowの投稿を読みました:

ASP.NET MVCで404を適切に処理するにはどうすればよいですか?

ASP.NET MVCで404を適切に処理するにはどうすればよいですか?

asp.netMVC3のカスタムエラーページ

http://blog.davebouwman.com/2011/04/21/custom-404-pages-for-asp-net-mvc-3/

私は404をアクションレベルで動作させています。また、コントローラーで*.aspxサフィックスを使用しています。あなたがのようなURLを持っているなら

"http://blahblah/AppName/idontexist.aspx"

カスタムエラーコントローラがロードされます。私の問題は、.aspxがなく、存在しないコントローラーにあります。これにより、典型的なIIS Server404htmlページが生成されます。作業中のもう1つの問題は、IIS構成自体を実際に変更できないことです。私はこれをcode/web.config / global.asax(または私が考えていなかったプロジェクトの他の部分)を介して処理する必要があります。

これが私のweb.configエントリです(これはルートweb.configであり、ビューのものではありません):

<httpErrors defaultPath="/Error.aspx/HttpError" errorMode="Custom" existingResponse="Replace" defaultResponseMode="ExecuteURL">
  <remove statusCode="500" subStatusCode="-1" />
  <remove statusCode="404" subStatusCode="-1" />
  <error statusCode="500" path="/Error.aspx/HttpError" responseMode="ExecuteURL" />
  <error statusCode="404" path="/Error.aspx/NotFound" responseMode="ExecuteURL" />
</httpErrors>

<customErrors mode="On"  defaultRedirect="~/Error.aspx/HttpError">
  <error redirect="~/Error.aspx/NotFound" statusCode="404" />
</customErrors>  

そして、これがglobal.asaxでの私のルートです。

       routes.MapRoute(
            "Default", // Route name
            "{controller}.aspx/{action}/{id}", // URL with parameters
            new { controller = "StartController", action = "StartAction", id = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "NotFoundController", // Route name
            "{controller}.aspx", // URL with parameters
            new { controller = "Error", action = "NotFound" } // Parameter defaults
        );

        routes.MapRoute(
            "NotFoundController2", // Route name
            "{controller}", // URL with parameters
            new { controller = "Error", action = "NotFound" } // Parameter defaults
        );

        routes.MapRoute(
            "Root", // Route name
            "", // URL with parameters
            new { controller = "StartController", action = "StartAction", id = UrlParameter.Optional } // Parameter defaults
        );

また、ルートを使用してこれらをキャッチする際の問題の1つは、404ステータスコードを失うことだと思います。ただし、ルートはこの目的のために特別に設計されたアクションを指しているので、そのポイントは意味がないと思います。

とにかく、どんな考え、提案、または批判も歓迎されます。私はここにとても近いです。ありがとう!

編集1

私はまだこれを研究しています。URLに「.aspx」というテキストが見つからない場合にエラーコントローラーにリダイレクトするカスタムルート制約を定義する方法はありますか?

編集2

そのように制約が使用されることを意図しているようには見えません。私も実装してみました

    protected void Application_Error()
    {
    }

http://blog.davebouwman.com/2011/04/21/custom-404-pages-for-asp-net-mvc-3/の実装ごとのメソッドですが、コントローラーに.aspxを指定しない場合、アプリケーションがエラーをスローする機会がないようです。私のアプリがそれに応答する前に、IISによって処理されているようです。

IISを変更できれば、できればこのアプリケーションの仮想ディレクトリエントリだけに変更を加えることができれば、これに対するより実行可能なソリューションが可能になりますか?

URLを取得できる場所があれば、.aspxを検索し、見つからない場合は404 not foundをスローしますが、IISのデフォルトではなくアプリケーションレベルの404ページにリダイレクトすると、理想にかなり近くなります。

考え?

編集3

アプリケーションがIISサーバーのルートサイトであり、仮想ディレクトリではない場合を除いて、このシナリオを処理することは不可能であると私は考えています。IIS 6.0内で、デフォルトのIISエラーページを微調整できることに気づきました。それだけでなく、特定のケースをURLに置き換えることができます。仮想ディレクトリサイトでこれを実行しようとしましたが、デフォルトのIIS404が見つかりませんページが表示されます。

つまり、セットアップを愚かな方法で制御でき、これを実行しているサイトがルートサイトである場合は、IIS6でこれを処理できます。

私が想像する現実のシナリオにはあまり当てはまりません。

4

1 に答える 1

1

IIS に変更を加えることができなければ、これは不可能だと思います。IIS 6 では、ASP.Net ISAPI ハンドラー (aspnet_isapi.dll) にマップされていない限り、要求は ASP.Net 領域に入りません。通常の ASP.Net 拡張機能の場合、.Net のインストール時に IIS6 でマッピングが既にセットアップされています (.ashx、.aspx など)。これが、存在しないコントローラーの 404 が通常の IIS 404 ページを取得する理由です。IIS は、ディスク上に存在しないフォルダーを探しています。

404 ページ ハンドラーを期待どおりに動作させるには (IIS に変更を加えることができると想定しています)、ワイルドカード マッピングと呼ばれるものをセットアップする必要があります。これにより、すべての要求が ASP.Net ISAPI に送信されます。この場合、何も存在しないため、物理ファイルのチェックをバイパスするように IIS に指示する必要もあります。そのオプションのチェックボックスがあります。もう IIS 6 は手元にありませんが、このサイトのオプション 1 で手順を説明しています。

http://blog.stevensanderson.com/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/

私はこれを以前にやったことがありますが、うまくいきます。すべてを .Net ISAPI に送信することには、いくつかのトレードオフがあります。すべての静的ファイルは、IIS ではなく ASP.Net (画像も含む) によって直接処理されるため、その影響に注意してください。

お役に立てれば

于 2013-03-26T16:04:34.940 に答える