2016-06-23 11 views
5

Ứng dụng của tôi đang chạy ASP.NET Core RC2 và tôi nhầm lẫn về cách mã trạng thái và phần mềm trung gian xử lý ngoại lệ hoạt động.Tại sao chuyển hướng ngoại lệ sang các trang khác nhau?

Ứng dụng của tôi được định cấu hình với phần mềm trung gian sau.

app.UseStatusCodePagesWithReExecute("/Error/Status/{0}"); 
app.UseExceptionHandler("/Error/ServerError"); 

Cụm tay lái điều khiển mà xem nó sẽ trả về:

[HttpGet] 
public IActionResult Status(int id) 
{ 
    switch (id) 
    { 
     case 404: 
      return View("404"); 
     case 400: 
      return View("400"); 
     case 500: 
      return View("500"); 
     default: 
      return View("501"); 
    } 
} 

[HttpGet] 
public IActionResult ServerError() 
{ 
    return View(); 
} 

Khi tôi hướng đến một URL chưa biết nó sẽ trả lại 404 page như mong đợi từ các hành động Trạng thái.

Khi tôi điều hướng đến một hành động ném một ngoại lệ, nó sẽ điều hướng đến /Error/ServerError chứ không phải là 500 page từ hành động Trạng thái.

public IActionResult ThrowException() 
{ 
    throw new Exception(); 
} 

Nếu tôi hướng đến một hành động mà trả StatusCodeResult(500); nó sẽ trả lại 500 page từ hành động Trạng thái.

[HttpGet] 
public IActionResult Error500() 
{ 
    return new StatusCodeResult(500); 
} 

gì confuses me là giao diện điều khiển cho thấy rằng cả hai kết quả trở 500 (Internal Server Error) nhưng tùy thuộc vào cách thức chúng được trả về họ sẽ hướng đến một trang khác nhau dựa trên các middleware.

enter image description here

Tại sao điều này?

+0

Tôi không chắc chắn, nhưng tôi xem xét 'aspnet/Diagnostics' và tôi thấy sau điều kiện trong 'StatusCodePagesMiddleware':' if (context.Response.HasStarted || ...) {return;} '. Cũng trong 'ExceptionHandlerMiddleware'' context.Response.OnStarting (_clearCacheHeadersDelegate, context.Response); '. Tôi nghĩ trước khi 'StatusCodePagesMiddleware' đã xử lý mã trạng thái, Response đã được bắt đầu bởi' ExceptionHandlerMiddleware'. –

Trả lời

4

Khi tôi điều hướng đến một hành động ném một ngoại lệ, nó sẽ điều hướng đến/Lỗi/ServerError chứ không phải 500 trang từ hành động Trạng thái.

này là bình thường vì các ExcetionHandlerMiddleware xử lý unhandled ngoại lệ và cũng được đăng ký after tình trạng các trang mã middleware và nên được thực hiện đầu tiên khi các phản ứng đi ra ngoài. Tôi tin rằng ngay cả khi bạn sắp xếp lại các phần trung gian này, bạn sẽ không thấy sự khác biệt về hành vi vì các trang mã trạng thái trung gian tìm kiếm mã trạng thái trên cá thể HttpResponse đi và trong trường hợp ngoại lệ chưa được giải quyết, điều này có thể không được đặt.

Đã cập nhật: Trả lời nhận xét. Bạn có thể làm một cái gì đó như dưới đây:

[HttpGet] 
public IActionResult ServerError() 
{ 
    var exceptionHandlerFeature = HttpContext.Features.Get<IExceptionHandlerFeature>(); 
    if (exceptionHandlerFeature != null) 
    { 
     var exception = exceptionHandlerFeature.Error; 

     //TODO: log the exception 
    } 
    return View("500"); 
} 
+0

Một cách tiếp cận khác là tạo phần mềm trung gian của riêng mình, bắt giữ ngoại lệ và đặt mã trạng thái, vì vậy nó có sẵn tại thời điểm khi UseStatusCodePagesWithReExecute đang được đánh giá – Tseng

+0

Tôi không chắc liệu tôi có đi xa đến thế không. Bạn có thể làm một cái gì đó như trong bài viết cập nhật của tôi. –

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