2010-03-09 31 views
10

Tôi biết rằng ASP.NET MVC có thuộc tính bộ lọc lỗi để xử lý loại lỗi được chỉ định. Tuy nhiên, tính năng này không thể bắt gặp bất kỳ lỗi nào xảy ra khi ứng dụng khởi động. Vì vậy, tôi cần thêm một số mã vào phương thức “Application_Error” để xử lý lỗi này giống như đoạn mã sau.Làm thế nào để xử lý lỗi ứng dụng ASP.NET xảy ra trên ứng dụng bắt đầu và chuyển & hiển thị lỗi trong chế độ xem MVC?

public void Application_Error(object sender, EventArgs e) 
{ 
    // At this point we have information about the error 
    var ctx = HttpContext.Current; 

    var exception = ctx.Server.GetLastError(); 

    var errorInfo = 
     "<br>Offending URL: " + ctx.Request.Url + 
     "<br>Source: " + exception.Source + 
     "<br>Message: " + exception.Message + 
     "<br>Stack trace: " + exception.StackTrace; 

    ctx.Response.Write(errorInfo); 

    Server.ClearError(); 
} 

Mặc dù, mã này sẽ hoạt động tốt, khi lỗi ứng dụng bình thường xảy ra như lỗi xảy ra trong trang xem. Tuy nhiên, nó không hoạt động khi lỗi xảy ra trên ứng dụng bắt đầu bởi vì các đối tượng yêu cầu và đáp ứng luôn là null.

Tiếp theo, tôi cố gắng giải quyết câu hỏi này bằng cách đặt chuyển hướng mặc định trong các lỗi tùy chỉnh như mã sau.

<customErrors mode="On" defaultRedirect="Scripts/ApplicationError.htm"></customErrors> 

Thật không may, nó không hoạt động vì khi ứng dụng nhận được yêu cầu chuyển hướng, nó cố gắng khởi động lại ứng dụng và lại ném ngoại lệ.

Làm cách nào để giải quyết vấn đề này? Ngoài ra, bạn có ý tưởng khác để xử lý lỗi này không.

Cảm ơn,

PS. Lý do chính để tạo trình xử lý này vì tôi muốn hiển thị lỗi khi ứng dụng không thể kết nối với dịch vụ khác như cơ sở dữ liệu để lưu dữ liệu vào bộ nhớ đệm khi khởi động ứng dụng.

Trả lời

19

Lý do tại sao RequestResponse đối tượng là null bên trong sự kiện Application_Error của bạn là vì sự kiện Application_Start không liên quan đến bất kỳ người sử dụng, do đó bạn không thể chuyển hướng từ nó. Chỉ có các đối tượng được tích hợp sẵn là ApplicationServer. Tham chiếu các đối tượng Session, Request hoặc Response sẽ gây ra lỗi.

Một giải pháp khác là sử dụng try/catch và trong khối catch ghi nhật ký lỗi và đặt một số biến toàn cục cho biết đã xảy ra sự cố khi khởi động ứng dụng. Sau đó, trên Application_BeginRequest bạn có thể kiểm tra biến này và chuyển hướng cho phù hợp.

+0

Tôi sử dụng để tạo một số mã tương tự với câu trả lời của bạn. Tôi xóa mọi lỗi khi lỗi ứng dụng được kích hoạt và lưu lỗi cuối cùng vào biến tĩnh công cộng. Sau đó, tôi có một số bộ lọc hành động kiểm tra biến này và hiển thị lỗi nếu nó có sẵn. Tuy nhiên, tôi không thích ý tưởng này. Bởi vì nó có thể hiển thị trang lỗi để yêu cầu khác, gây ra lỗi này. –

+2

Không được có bất kỳ yêu cầu nào khác. Nếu ứng dụng của bạn thất bại khi khởi tạo, tôi không thấy nó sẽ xử lý bất kỳ yêu cầu nào nếu nó ở trạng thái không thành công. Cách giải quyết duy nhất là khắc phục sự cố và khởi động lại ứng dụng. –

+0

Tôi đồng ý rằng các yêu cầu tiếp theo sẽ không xảy ra nếu lỗi khởi động xảy ra, vì vậy bạn cần thử/nắm bắt xung quanh tất cả Application_Start. Nếu bạn kiểm tra ngoại lệ khởi động của bạn trong BeginRequest, có cách nào thân thiện hơn với MVC để chuyển hướng hơn Response.Redirect không? Tôi chuyển hướng theo cách mà Firefox nói sẽ không kết thúc. Có cách nào để chuyển hướng đến một hành động có ngoại lệ, như Error.Startup (cũ). – flipdoubt

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