2009-05-01 24 views
7

は、ここで私は私のGlobal.asax.vbでやろうとしているものです:ASP.NET MVCで未処理の例外をログに記録するにはどうすればよいですか?

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のは失敗していること:

Invalid path for child request 'http://www.example.com/error.html'. A virtual path is expected.

私はこの問題を解決するにはどうすればよいです?それとも、これを行うためのより良い方法は何ですか?

答えて

9

私はちょうどあなたが使用することができますエラーロガー/ハンドラであるELMAHと呼ばれるスコットHanselman氏のブログhereにこれを見つけましたあなたのコードを変更する必要はありません。 MVCでうまく動作しているように見えるので、それを調べたいかもしれません。

+7

ここでは、スタックオーバーフローでELMAHの修正版を使用しています。これは非常に優れています。 –

+2

@Jarrod - フォークにはどんな種類のものが含まれていますか? –

+0

ELMAHのルール - log4netよりも役立ちました。私見では。 – MikeJ

2

あなたはすなわち、パスアプリケーションベース(アプリへの外部すなわちなしのパス)と比較し、そのような何か、仮想パスをspecifiyする必要があります。 Server.Transferを(「error.html」) または サーバー。転送(「/ error.html」) または Server.Transferを(「〜/ error.html」)

+0

"〜/ error.html":/error.htmlの子要求の実行中にエラーが発生しました。 –

+0

"/error.html":/error.htmlの子要求の実行中にエラーが発生しました。 –

+0

"error.html":error.htmlの子要求の実行中にエラーが発生しました。 –

3

ELMAHは、未処理の例外をキャッチするための優れたエラーハンドラです。これは、HttpModulesを介してWebアプリケーションにシームレスに接続し、通知とロギングのさまざまなオプションを備えています。

特長:

  • SQL、XML、SQLiteの、インメモリログ
  • メール通知
  • RSSフィード
  • 詳細!例外のログ
  • 簡単に統合
  • エラー通知 - ユーザー

そしてFYIは、「うまく死ん」中にエラーのエラーハンドラを知らせる、SOフォークバージョンはいえ、ELMAHを使用しています。これがデフォルトでarchitectural explanationsetup tutorial

2

最高で、ASP.NET MVCアプリケーションでは、あなたのコントローラが属性[のHandleError]を使用している場合

System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo> 

から継承し、すべての例外を/ Error.aspx共有ビューを持っています捕らえられるまで泡立ち続けると、そのページに終わるでしょう。

(それはラインの終わりだから、この場合は有効)私は単にインラインを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はもっと頑丈に見えますが、私のニーズにとってはこれで十分でした。

関連する問題