2009-05-01 24 views
7

Dưới đây là những gì tôi đang cố gắng để làm trong Global.asax.vb tôi:Làm thế nào để đăng nhập ngoại lệ unhandled trong 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 

Nhưng đó Server.Transfer thất bại:

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

Làm thế nào để sửa lỗi này ? Hoặc, cách nào tốt hơn để tôi làm điều này?

Trả lời

9

tôi chỉ thấy điều này trên blog của Scott Hanselman here gọi ELMAH mà là một Lỗi Logger/Handler mà bạn có thể sử dụng mà không phải thay đổi mã của bạn. Bạn có thể muốn xem xét nó, vì nó có vẻ hoạt động tốt với MVC.

+7

Chúng tôi sử dụng một phiên bản sửa đổi của ELMAH ở đây trên Stack Overflow - nó rất tốt. –

+2

@Jarrod - Bạn đã bao gồm những thứ gì trong ngã ba? –

+0

Quy tắc ELMAH - hữu ích hơn log4net của nó. IMHO. – MikeJ

2

Bạn có thể chỉ định cho một con đường ảo, tức là một con đường tương đối so với cơ sở ứng dụng (tức là không có con đường bên ngoài để ứng dụng), vì vậy cái gì đó như: Server.Transfer ("error.html") hoặc Server. chuyển ("/ error.html") hoặc Server.Transfer ("~/error.html")

+0

"~/error.html": Lỗi khi thực hiện yêu cầu con cho /error.html. –

+0

"/error.html": Lỗi khi thực hiện yêu cầu con cho /error.html. –

+0

"error.html": Lỗi khi thi hành yêu cầu con cho error.html. –

3

ELMAH là trình xử lý lỗi tuyệt vời để bắt ngoại lệ không được xử lý. Nó cắm liền mạch vào ứng dụng web của bạn thông qua HttpModules và có các tùy chọn khác nhau để thông báo và ghi nhật ký.

Các tính năng:

  • SQL, XML, SQLite, InMemory Logging
  • Thông báo email
  • RSS feed
  • chi tiết! khai thác gỗ ngoại lệ
  • Dễ dàng tích hợp
  • Lỗi hiệu - báo hiệu xử lý lỗi của một lỗi khi "chết không độc đáo" cho người sử dụng

Và FYI, SO sử dụng ELMAH, mặc dù một phiên bản chia hai. Đây là sản phẩm tốt nhất architectural explanationsetup tutorial

2

Theo mặc định, các ứng dụng ASP.NET MVC có một cái nhìn chung/Error.aspx, kế thừa từ

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

Nếu điều khiển của bạn sử dụng thuộc tính [HandleError], tất cả các trường hợp ngoại lệ sẽ tiếp tục bong bóng cho đến khi bị bắt, và chúng sẽ kết thúc trên trang đó.

tôi chỉ cần thêm một Page_Load inline (có giá trị trong trường hợp này vì nó là sự kết thúc của dòng):

<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> 

Sau đó, thân thiện "Xin lỗi ..." tin nhắn. Nó chắc chắn trông giống như ELMAH là mạnh mẽ hơn, nhưng đối với nhu cầu của tôi, điều này là đủ.

Các vấn đề liên quan