C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C# MVCでエラーページを統一したい

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■85284 / inTopicNo.1)  C# MVCでエラーページを統一したい
  
□投稿者/ はな (11回)-(2017/10/03(Tue) 11:35:03)

分類:[ASP.NET (C#)] 

MVC 4
.Net フレームワーク 4
Windows Server 2008 R2
IIS 7
Visual Studio 2013
C#
で開発してます。

エラー処理をGlobal.asax.csのApplication_Errorに記述してます。

http://localhost/hogehoge
でエラー発生したときは意図したページが表示されますが
http://サーバ/hogehoge
でエラー発生したときは
Views/Shared/Error.aspx
のページが表示されてしまいます。

localhostとサーバで同じページを表示するにはどうしたらいいでしょうか?
Error.aspxはエラー内容が表示されない静的なページなので、サーバにアクセスした場合もエラー内容を表示したいです。

protected void Application_Error(Object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
if (exception == null) {
return;
}

try {
// ログ出力
} catch (Exception ex) {
}

Server.ClearError();

HttpContext httpContext = ((MvcApplication)sender).Context;
httpContext.ClearError();
httpContext.Response.Clear();
httpContext.Response.StatusCode = 200;
httpContext.Response.TrySkipIisCustomErrors = true;
RouteData routeData = new RouteData();
routeData.Values["action"] = "showError";
routeData.Values["controller"] = "Login";
routeData.Values["message"] = exception.Message;
routeData.Values["stackTrace"] = exception.StackTrace;
Controller controller = new LoginController();
((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData));
}

引用返信 編集キー/
■85285 / inTopicNo.2)  Re[1]: C# MVCでエラーページを統一したい
□投稿者/ WebSurfer (1320回)-(2017/10/03(Tue) 13:15:00)
No85284 (はな さん) に返信

> localhostとサーバで同じページを表示するにはどうしたらいいでしょうか?

その「locakhost」と「サーバー」で何が違うのでしょう?

想像ですが、

「locakhost」は管理者権限で立ち上げた Visual Studio から F5 または Ctrl + F5 で
アプリを IIS Express 上で実行、「サーバー」は運用環境の Web サーバー (IIS) でア
プリを動かしている ⇒ ワーカープロセスのアクセス権が違う ⇒ 「サーバー」ではワー
カープロセスにログファイルへのアクセス権がない ⇒ ログを書き込もうとすると例外
がスローされる ⇒ 結果、Error.aspx が表示される

・・・というようなことはないでしょうか?

開発マシンの OS が Professional 版であれば、開発環境でも IIS 上で Web アプリを動
かしてデバッグできるので、まずそれをやってみることをお勧めします。

引用返信 編集キー/
■85286 / inTopicNo.3)  Re[2]: C# MVCでエラーページを統一したい
□投稿者/ はな (12回)-(2017/10/03(Tue) 13:45:09)
ローカル環境(Windows7)のIISでは意図したエラーページに遷移できます。

また、FileIOのようなRuntimeExceptionではサーバへのアクセスでもエラー内容が表示されました。

MyExceptionをスローした場合、localhostへのアクセスとサーバへのアクセスで表示するページが異なります。


■localhostとサーバが同じページを表示
RuntimeException・・・エラー内容を表示するページ
アドレス不正(Error.aspxを削除)・・・エラー内容を表示するページ

■localhostとサーバで違うページへ遷移
MyException・・・サーバ:静的なエラーページを表示、localhost:エラー内容表示

引用返信 編集キー/
■85287 / inTopicNo.4)  Re[3]: C# MVCでエラーページを統一したい
□投稿者/ はな (13回)-(2017/10/03(Tue) 16:40:30)
Web.configに
<customErrors mode="Off"></customErrors>
を書いたら解決しました。

httpErrorsの方ばかりいじくってました。

解決済み
引用返信 編集キー/
■85289 / inTopicNo.5)  Re[3]: C# MVCでエラーページを統一したい
□投稿者/ WebSurfer (1321回)-(2017/10/03(Tue) 17:04:26)
No85286 (はな さん) に返信

> ローカル環境(Windows7)のIISでは意図したエラーページに遷移できます。

ワーカープロセスのアクセス権の問題ではないと言ってます?

> また、FileIOのようなRuntimeExceptionではサーバへのアクセスでもエラー内容が表示されました。
> MyExceptionをスローした場合、localhostへのアクセスとサーバへのアクセスで表示するページが異なります。

RuntimeException、MyException とか意味不明ですが、具体的にどういうものですか?


情報不足でよくわからないのでこれまた想像ですが、ワーカープロセスのアクセス権は関係ないとして・・・

Visual Studo のテンプレートを使って MVC4 アプリのプロジェクトを生成すると、HandleError 属性がグローバ
ルに付与され、web.config の customErrors 要素は設定されない(mode はデフォルトの RemoteOnly になるはず
です。

その場合、アクションメソッドで例外がスローされると、

(1) 開発マシンすなわち local では HandleError 属性では処置されず、Global.asax の Application_Error ハ
ンドラに処置が飛ぶ。

(2) サーバーすなわち remote では HandleError 属性で処置されてしまって Application_Error ハンドラが呼
ばれない。

結果、(1) では Application_Error ハンドラでレンダリングされた情報が表示される、(2) では Error.aspx が
表示される。

RuntimeException、MyException で結果が違うのは、前者がコントローラーレベルでの例外ではない、すなわち
HandleError 属性では処置できず、local, remote に関わらず Application_Error ハンドラが呼ばれた。

・・・ということではなかろうかと想像をたくましくして思いました。

引用返信 編集キー/
■85290 / inTopicNo.6)  Re[4]: C# MVCでエラーページを統一したい
□投稿者/ WebSurfer (1322回)-(2017/10/03(Tue) 17:06:28)
No85287 (はな さん) に返信
> Web.configに
> <customErrors mode="Off"></customErrors>
> を書いたら解決しました。

レスが前後してしまいましたが、私の想像は当たっていたようですね。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ