2016-06-23 16 views
5

Uygulamam ASP.NET Core RC2 çalışıyor ve durum kodu ve istisna işleyici middleware nasıl çalıştığı konusunda kafam karıştı.Neden bir istisna farklı sayfalara yönlendiriyor?

Uygulamam aşağıdaki aracı ile yapılandırılmış. o dönmelidir görüntülemek

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

kontrolör kolları:

[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(); 
} 

Bilinmeyen bir URL'ye zaman Durum eylemden beklendiği gibi 404 page dönecektir.

Bir özel durum oluşturan bir eyleme giderken, Durum eyleminden 500 page'a değil /Error/ServerError'a gider. Bunun Durum eylemden 500 page dönecektir StatusCodeResult(500); döndüren bir eylem giderseniz

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

. kafamı karıştırıyor Ne

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

konsol hem sonuç 500 (Internal Server Error) ama onlar katman dayalı farklı bir sayfaya gitmek olacak döndürülür şekline göre iade gösteriyor olmasıdır. Neden bu

enter image description here

mı?

+0

Emin değilim, ama 'aspnet/Diagnostics' inceledik ve ben' StatusCodePagesMiddleware' içinde durumu şu gördüğümüz: Aşağıdaki gibi bir şey yapabilirsiniz 'if (context.Response.HasStarted || ...) {döndürür;} '. Ayrıca "ExceptionHandlerMiddleware" 'de context.Response.OnStarting (_clearCacheHeadersDelegate, context.Response);'. StatusCodePagesMiddleware 'durum kodu işlenmeden önce düşünüyorum, Response zaten" ExceptionHandlerMiddleware "tarafından başlatıldı. –

cevap

4

Bir istisna atar eylemine gittiğimde, Durum eyleminden 500 sayfa değil/Hata/Sunucu Hatası'na gider. tepkisi söndüğünde

Bu after durum kodu sayfaları ortakatmanını kayıtlı olduğu ve bu yüzden ilk idam da ExcetionHandlerMiddleware istisnalar işlenmeyen işlemesi nedeniyle bekleniyor ve. Bu middlewar'leri yeniden düzenleseniz bile, davranışta bir fark görmeyeceğinizi düşünüyorum çünkü statusware'in middleware durumları, giden HttpResponse örneğindeki bir durum kodunu arar ve işlenmemiş istisnalar söz konusu olduğunda bu ayarlamayabilir.

Güncelleme: Bir yoruma yanıt vermek.

[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

Alternatif bir yaklaşım, istisnayı yakalayan ve durum kodunu ayarlayan kendi ara katman yazılımını oluşturmak olacaktır, bu nedenle UseStatusCodePagesWithReExecute değerlendirildiğinde noktada bu noktaya ulaşabilir – Tseng

+0

Ben o kadar ileri gidersem emin değilim. Güncellenmiş gönderimdeki gibi bir şey yapabilirsiniz. –

İlgili konular