タイトルはそれをすべて言います。実際、これを行う方法についてはたくさんの情報があり、私は非常に親密です。私はグーグルでいくつかのことと次のstackoverflowの投稿を読みました:
ASP.NET MVCで404を適切に処理するにはどうすればよいですか?
ASP.NET MVCで404を適切に処理するにはどうすればよいですか?
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でこれを処理できます。
私が想像する現実のシナリオにはあまり当てはまりません。