ASP.NET MVC カスタム エラー ページ

高洛峰
リリース: 2016-12-24 13:48:51
オリジナル
1560 人が閲覧しました

asp.net mvc カスタム エラー ページの設定に問題があるのは、あなただけではありません。あなたのアプローチが正しいことに驚いています。それが機能しない理由は、エラーの一部が asp.net パイプラインによって処理され、他の部分が iis によって直接処理されるためです。

通常 (他のフレームワーク/サーバーではこれが当てはまると予想されます)、エラーが発生する場所に関係なく、カスタム エラー ページを 1 か所で設定するだけで済みます。このように:

<customErrors mode="On">
  <error code="404" path="404.html" />
  <error code="500" path="500.html" />
</customErrors>
ログイン後にコピー

カスタム 404 エラー ページ

リソースが存在しない場合 (静的および動的を含む)、404 ステータス ページを返す必要があります。通常は、代わりに少し分かりやすい情報を提供する必要があります。デフォルトasp.net/iis によって生成されたエラー ページはサイト訪問者に表示され、リソースが存在しない理由についてアドバイスを提供したり、どのサイトを検索するかを選択したりすることができます。

ここでの簡単な設定は、次のとおりデモ用です:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8"/>
  <title>404 Page Not Found</title>
</head>
<body>
  <h1>404 Page Not Found</h1>
</body>
</html>
ログイン後にコピー

vs に付属の標準テンプレートを含む、新しい ASP.NET MVC 5 アプリケーションを作成しました。これを実行して、/foo/bar などの存在しないパスに移動しようとすると、次の情報を含む標準の ASP.NET 404 ページが表示されます。

この場合のエラーは、URL に一致するコントローラーまたはアクションが見つからないため、ASP.NET MVC によって発生します。 ASP.NET MVC自定义错误页面

404 エラー ページをカスタマイズするには、web.config の 構成セクションで次のようにします:

<customErrors mode="On">
 <error statusCode="404" redirect="~/404.html"/>
</customErrors>
ログイン後にコピー

mode="On"ローカルのエラーページです。通常は、使用時にのみレンダリングするために、mode="RemoteOnly" を設定するとよいでしょう。

再び /foo/bar に移動すると、先ほど定義したエラー ページが表示されます

ただし、予想どおり、この時点の URL パスは /foo/bar ではなく、ASP.NET はそれを /404 にリダイレクトします。 .html?aspxerrorpath=/foo/bar で、応答の HTTP ステータス コードも 200 であることを確認しましたが、これは正常です。

これは非常に悪質です。http コード 200 を返すことは誤解を招くだけでなく、SEO にも悪影響を及ぼします。簡単に言えば、指定されたパスにリソースが存在しない場合、リソースが移動されている場合は、新しいパスにリダイレクトされる必要があります。

この問題を解決するには、エラー ページをリダイレクトする ASP.NET のデフォルトの動作を変更して応答を書き換えます。

<customErrors mode="On" redirectMode="ResponseRewrite">
 <error statusCode="404" redirect="~/404.html"/>
</customErrors>
ログイン後にコピー

ただし、これはあまり効果がありません (この外国人は非常に冗長です)、元の URL アドレスはリダイレクトされませんが、ASP.NET は依然として 200 を返し、カスタム エラー ページをプレーン テキストとして表示します。

ASP.NET ページに戻る必要があるようです。以前に *.aspx ページに移動する必要がないと思っていたのなら、残念ながらがっかりしました。

したがって、エラー ページと対応する web.config を 404.aspx に変更すると、URL とコンテンツ タイプ (text/html) は正常になります。

しかし、200 の問題は依然として存在しており、Microsoft はこの問題に対応する解決策を公式に提供しており、ページのステータス コードを 404.aspx に追加しました:

<% Response.StatusCode = 404 %> ;

これで、正しいステータス コード、URL、カスタム エラー ページができました。

間違いです。

静的ページ パス (例: foo.html) またはルーティング設定と一致しない URL (例: /foo/bar/foo/bar) にリンクすると、標準の IIS 404 エラーが表示されます。 page.

上記の状況では ASP.NET がバイパスされ、IIS がリクエストを処理します。もちろん、コントローラーで HttpNotFound() を返した場合も同じ結果が得られます。これは、MVC が単にステータス コードを設定しただけであるためです。エラーをスローするのではなく、IIS に渡します

この場合、web.config Configuration セクション:

<httpErrors errorMode="Custom">
 <remove statusCode="404"/>
 <error statusCode="404" path="/404.html" responseMode="ExecuteURL"/>
</httpErrors>
ログイン後にコピー

ローカル テストの場合は、errorMode="Custom" も設定します。通常は、errorMode="DetailedLocalOnly" に設定されます。

aspx ではなく html ページを使用したことに注意してください。通常は、ASP.NET エラーが発生した場合でもエラー ページが表示されるように、単純な静的ファイルをエラー ページとして使用する必要があります。

ここで、存在しない静的ファイル パスに移動すると、IIS のデフォルトの 404 ページの代わりにカスタム エラー ページが表示されます。残りは以前と同じ 200 問題です。

幸いなことに、IIS は実際にこれに対する組み込みのソリューションを提供しており、responseMode="File" に設定すると、IIS は元の応答ヘッダーを変更せずにカスタム エラー ページを返します:

完了しました。

カスタマイズされた 500 エラー ページ


そのほとんどは、上記のソリューションをコピーしてカスタム 500 エラー ページを追加するだけです。ここで注目すべき点がいくつかあります。

标准的 ASP.NET MVC模板内置的 HandleErrorAttribute 作为一个全局过滤器。捕获在ASP.NET MVC管道引发的任何错误,并返回一个自定义"错误"视图提供你有在web.config中启用自定义错误。它会寻找 ~/views/{controllerName}/error.cshtml 或 ~ / views/shared/error.cshtml。

如果你使用了过滤器(filter),你需要更新现有的自定义错误视图,并不存在的则需要创建(最好放在views/shared文件夹下)

我没有看见这个filter有可以设置的属性值,在 MVC 管道引发的任何异常都会退回到标准的 ASP.NET 错误配置页面,既然你要设置那些**那这里就用不到这个filter。

添加如下自定义错误页配置:

<customErrors mode="On" redirectMode="ResponseRewrite">
 <error statusCode="404" redirect="~/404.aspx"/>
 <error statusCode="500" redirect="~/500.aspx"/>
</customErrors>
ログイン後にコピー

类似于前面创建的404.aspx:

<% Response.StatusCode = 500 %>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8" />
  <title>500 Server Error</title>
</head>
<body>
  <h1>500 Server Error</h1>
</body>
</html>
ログイン後にコピー

不幸的是这样做并不会捕获到你应用程序中的每一个异常。一个相当常见的错误——由 ASP.NET 产生的请求的验证,如一个危险的url路径/foo/bar<script></script> ,这个实际上会产生一个404响应;因此你可以添加一个默认错误配置:

<customErrors mode="Off" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx">
 <error statusCode="404" redirect="~/404.aspx"/>
 <error statusCode="500" redirect="~/500.aspx"/>
</customErrors>
ログイン後にコピー

最后为了捕获非ASP.NET异常我们设置IIS自定义服务器内部错误500错误页面:


总结

在你的应用程序根目录创建如下错误页面:

404.html - for IIS
404.aspx - for ASP.NET
500.html - for IIS
500.aspx - for ASP.NET

确认您设置在 ASPX 页面内的适当响应状态码.

抛弃 MVC HandleErrorAttribute 全局筛选器;配置 ASP.NET 的自定义错误:

<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx">
 <error statusCode="404" redirect="~/404.aspx"/>
 <error statusCode="500" redirect="~/500.aspx"/>
</customErrors>
ログイン後にコピー

配置IIS自定义错误页:

<httpErrors errorMode="DetailedLocalOnly">
 <remove statusCode="404"/>
 <error statusCode="404" path="404.html" responseMode="File"/>
 <remove statusCode="500"/>
 <error statusCode="500" path="500.html" responseMode="File"/>
</httpErrors>
ログイン後にコピー

   

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。


更多ASP.NET MVC自定义错误页面相关文章请关注PHP中文网!


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!