2016-06-23 3 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を返します。

例外をスローするアクションに移動すると、/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

例外をスローするアクションに移動すると、[ステータス]アクションの500ページではなく、/ Error/ServerErrorに移動します。 ExcetionHandlerMiddlewareが処理されない例外を処理し、応答が消えたときにafterステータスコードページミドルウェアなどが最初に実行を取得登録されているため

は、これが期待されています。これらのミドルウェアを再注文しても、ステータスコードページミドルウェアは発信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

私はそれを遠くに行くかどうか分かりません。あなたは私の更新されたポストのような何かをすることができます。 –

関連する問題