Trả lời

7

Có cách bạn có thể thực hiện việc này.

Trong sự kiện Application_Error trên toàn cầu.asax tập tin, có được ngoại lệ cuối cùng như là một System.HttpUnhandledException. Mã của bạn sẽ trông giống như sau:

var lastException = Server.GetLastError() as HttpUnhandledException; 
string Ysod = lastException.GetHtmlErrorMessage(); 
// your call to emailing routine follows 

Tôi đồng ý với nhận xét của người khác. Bạn cũng có thể làm điều này với ELMAH.

+0

3 năm và ai biết lý do tại sao tôi không muốn sử dụng ELMAH, nhưng đây là câu trả lời tôi chắc chắn đang tìm kiếm. Không muốn mất một sự phụ thuộc trong một dự án bận rộn đã tràn ngập với các mô-đun bên thứ 3 tôi đoán. – nicknystrom

+1

Chính xác những gì tôi đang tìm kiếm là tốt, tôi sử dụng Elmah trong dự án của tôi, nhưng trong trường hợp khi người dùng là một quản trị viên, tôi muốn hiển thị YSOD chi tiết không chỉ là thông báo lỗi thân thiện. –

+0

Tôi đã sử dụng Elmah, trên các dự án khác, nhưng trong trường hợp này cụ thể, tôi muốn kiểm soát lỗi ghi nhật ký, vì sh! T vừa quá nghiêm trọng, ngay cả đối với Elmah! Điều này trả lời đúng câu hỏi ban đầu và vẫn đứng ngày hôm nay * thở dài * – ppumkin

2

Bạn nên kiểm tra ELMAH nó thực hiện những gì bạn đang yêu cầu tự động.

2

Tôi sẽ nói chung, bạn không muốn người dùng trải nghiệm YSOD. Đây là thứ tôi đã đưa vào các ứng dụng web trước đây để ghi lại lỗi và sau đó cho phép trang lỗi duyên dáng hơn cho người dùng ...

protected void Application_Error(object sender, EventArgs e) 
{ 
    MailMessage msg = new MailMessage(); 
    HttpContext ctx = HttpContext.Current; 

    msg.To.Add(new MailAddress("[email protected]")); 
    msg.From = new MailAddress("[email protected]"); 
    msg.Subject = "My app had an issue..."; 
    msg.Priority = MailPriority.High; 

    StringBuilder sb = new StringBuilder(); 
    sb.Append(ctx.Request.Url.ToString() + System.Environment.NewLine); 
    sb.Append("Source:" + System.Environment.NewLine + ctx.Server.GetLastError().Source.ToString()); 
    sb.Append("Message:" + System.Environment.NewLine + ctx.Server.GetLastError().Message.ToString()); 
    sb.Append("Stack Trace:" + System.Environment.NewLine + ctx.Server.GetLastError().StackTrace.ToString()); 
    msg.Body = sb.ToString(); 

    //CONFIGURE SMTP OBJECT 
    SmtpClient smtp = new SmtpClient("myhost"); 

    //SEND EMAIL 
    smtp.Send(msg); 

    //REDIRECT USER TO ERROR PAGE 
    Server.Transfer("~/ErrorPage.aspx"); 
} 
9

tôi sẽ nhìn vào ELMAH (Error Logging Modules and Handlers for ASP.NET):

ELMAH (Lỗi Logging Mô-đun và Bộ xử lý ) là một lỗi ứng dụng rộng cơ sở ghi nhật ký hoàn toàn là có thể cắm được. Nó có thể được thêm động vào một ứng dụng web ASP.NET đang chạy, hoặc thậm chí tất cả các ứng dụng web ASP.NET trên máy, mà không cần phải biên dịch lại hoặc tái triển khai .

Khi ELMAH đã bị rơi vào một ứng dụng web chạy và cấu hình một cách thích hợp, bạn sẽ có được tiện ích sau đây mà không thay đổi một dòng mã của bạn:

  • Đốn và cung cấp gần như tất cả trường hợp ngoại lệ unhandled.
  • Trang web để xem từ xa toàn bộ nhật ký của các ngoại lệ được mã hóa lại.
  • Trang web để xem từ xa chi tiết đầy đủ của bất kỳ chi tiết nào đã đăng nhập ngoại lệ.
  • Trong nhiều trường hợp, bạn có thể xem lại màn hình màu vàng nguyên bản của cái chết mà ASP.NET đã tạo cho một ngoại lệ nhất định, ngay cả khi chế độ CustomErrors bị tắt.
  • Thông báo e-mail của từng lỗi tại thời điểm xảy ra lỗi.
  • Nguồn cấp dữ liệu RSS trong 15 lỗi cuối cùng từ nhật ký.
1

Sự kiện Application_Error trong tệp Global.asax được kích hoạt bất cứ khi nào ngoại lệ chưa được giải quyết xảy ra trong ứng dụng. Bạn có thể lấy ngoại lệ cuối cùng đã xảy ra bằng phương thức Server.GetLastError().

Tương tự, bạn có thể tạo trang lỗi tùy chỉnh của riêng bạn bằng cách chỉ định trang web đó trong web.config trong phần customErrors trong tệp web.config. Bằng cách chỉ định một tệp mặc định, bạn có thể thực hiện bất kỳ mã hóa tùy chỉnh nào khi một ngoại lệ được định tuyến ở đó.

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