7

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 は失敗します:

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

これを修正するにはどうすればよいですか? または、これを行うためのより良い方法は何ですか?

4

4 に答える 4

9

コードを変更せずに使用できるエラー ロガー/ハンドラーであるELMAHと呼ばれるScott Hanselman のブログでこれを見つけましたMVC でうまく動作するように見えるので、調べてみてください。

于 2009-05-01T15:57:11.030 に答える
3

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

特徴:

  • SQL、XML、SQLite、インメモリ ロギング
  • 電子メール通知
  • RSS フィード
  • 詳細!例外のロギング
  • 簡単な統合
  • エラー シグナル - ユーザーの「正常に終了」している間に、エラー ハンドラーにエラーのシグナルを送信します。

参考までに、SO はフォーク バージョンではありますが、ELMAH を使用しています。これは最高のアーキテクチャの説明セットアップのチュートリアルです

于 2009-05-01T16:04:20.123 に答える
2

既定では、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 の方が堅牢に見えますが、私のニーズにはこれで十分でした。

于 2009-05-01T16:20:30.397 に答える
2

仮想パスを指定する必要があります。つまり、アプリケーション ベースに相対するパス (つまり、アプリの外部パスはありません) を指定する必要があるため、Server.Transfer("error.html") または Server.Transfer("/error.html ") または Server.Transfer("~/error.html")

于 2009-05-01T15:54:59.660 に答える