2016-06-23 4 views
5

내 앱이 ASP.NET Core RC2이고, 상태 코드와 예외 처리기 미들웨어가 어떻게 작동하는지 혼란 스럽습니다.예외가 다른 페이지로 리디렉션되는 이유는 무엇입니까?

내 응용 프로그램은 다음 미들웨어로 구성됩니다. 그것은 반환해야 볼

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

컨트롤러 핸들 :

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

내가 알 수없는 URL로 이동하면 상태 액션에서 예상대로이 404 page를 반환합니다.

예외를 throw하는 작업으로 이동하면 /Error/ServerError으로 이동하고 상태 작업에서는 500 page이 아닙니다. 나는 그것이 상태 액션에서 500 page를 반환합니다 StatusCodeResult(500);을 반환 조치로 이동하면

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

. 나를 혼란 무엇

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

콘솔이 모두 결과가 500 (Internal Server Error)하지만 그들이 미들웨어를 기반으로 다른 페이지로 이동합니다 반환하는 방법에 따라 반환 것을 알 수 있다는 것입니다. 왜 이런 일이

enter image description here

입니까?

+0

나는 잘 모르겠지만, 난'ASPNET/Diagnostics'을 검토하고 내가'StatusCodePagesMiddleware'의 조건을 다음 보았다 : 당신은 다음과 같은 것을 할 수있는'경우 (context.Response.HasStarted || ...) {return;}'. 또한 'ExceptionHandlerMiddleware' 컨텍스트에서. Response.OnStarting (_clearCacheHeadersDelegate, context.Response); 나는'StatusCodePagesMiddleware'가 상태 코드를 처리하기 전에 Response이 이미'ExceptionHandlerMiddleware'에 의해 시작되었다고 생각합니다. –

답변

4

예외를 throw하는 작업으로 이동하면 상태 작업에서 500 페이지가 아니라/Error/ServerError로 이동합니다. 응답이 꺼질 때

이것은 after 상태 코드 페이지 미들웨어를 등록 그래서 먼저 실행 얻을 또한 ExcetionHandlerMiddleware이 처리되지 않은 예외를 처리하기 때문에 예상된다. 나는이 미들웨어를 재주문해도 상태 코드 페이지 미들웨어가 나가는 HttpResponse 인스턴스에서 상태 코드를 찾고 처리되지 않은 예외가있는 경우이 값이 설정되지 않기 때문에 동작에 차이가 없음을 알 수있다.

업데이트 : 의견에 응답.

[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

다른 접근법은 예외 상황을 포착하고 상태 코드를 설정하는 자체 미들웨어를 작성하는 것이므로 UseStatusCodePagesWithReExecute가 평가되는 시점에 사용 가능하게됩니다. – Tseng

+0

제가 그렇게까지 나아갈 지 확신 할 수 없습니다. 내 업데이트 된 게시물에서 뭔가를 할 수 있습니다. –

관련 문제