ASP.NET MVCで未処理の例外をログに記録するにはどうすればよいですか?
-
03-07-2019 - |
質問
Global.asax.vbでしようとしていることは次のとおりです。
Public Class MvcApplication
Inherits System.Web.HttpApplication
Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
routes.MapRoute( _
"Error", _
"error.html", _
New With {.controller = "Error", _
.action = "FriendlyError"} _
)
...
'other routes go here'
...
End Sub
Sub Application_Start()
RegisterRoutes(RouteTable.Routes)
End Sub
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
...
'code here logs the unhandled exception and sends an email alert'
...
Server.Transfer("http://www.example.com/error.html")
End Sub
End Class
しかし、Server.Transferは失敗します:
子リクエスト「http://www.example.com/error.html」の無効なパス。仮想パスが必要です。
これを修正するにはどうすればよいですか?または、これを行うためのより良い方法は何ですか?
他のヒント
ELMAH は、未処理の例外をキャッチするための優れたエラーハンドラです。 HttpModulesを介してWebアプリケーションにシームレスにプラグインし、通知とログのさまざまなオプションがあります。
機能:
- SQL、XML、SQLite、InMemoryロギング
- メール通知
- RSSフィード
- 詳細!例外のロギング
- 簡単な統合
- エラーシグナル-「うまくダイイングしている」ときにエラーのエラーハンドラーにシグナルを送信します。ユーザー向け
また、参考までに、SOはELMAHを使用しますが、フォークされたバージョンです。これは最高のアーキテクチャの説明およびセットアップチュートリアル
仮想パス、つまりアプリケーションベースへの相対パス(つまり、アプリの外部パスがない)を指定する必要があるため、次のようになります。 Server.Transfer(" error.html") または Server.Transfer(" /error.html") または Server.Transfer("〜/ error.html")
デフォルトでは、ASP.NET MVCアプリケーションには、Shared / Error.aspxビューがあり、これを継承しています
System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>
コントローラーが属性[HandleError]を使用している場合、すべての例外はキャッチされるまでバブルし続け、そのページで終了します。
インラインPage_Loadを追加しただけです(この場合は行末なので有効です):
<script runat="server">
Sub Page_Load(ByVal Sender As System.Object, ByVal e As System.EventArgs)
MyExceptionHandlerService.LogException("exceptionsource", this.Model.Exception)
End Sub
</script>
その後、フレンドリーな「申し訳ありません...」メッセージ。 ELMAHはより堅牢であるように見えますが、私のニーズにはこれで十分でした。