1

Asp.netコアプロジェクトで私は両方のWeb UIとWeb APIコントローラがあります。 私はhttps://www.devtrends.co.uk/blog/handling-errors-in-asp.net-core-web-apiの記事に続き、startup.csに含ま:どのようにエラー処理アクションで私はWebビューまたはAPI応答を返しますか決定する

app.UseStatusCodePagesWithReExecute("/Error/error/{0}"); 
app.UseExceptionHandler("/Error/error/500"); 

とのErrorControllerでアクションを処理する追加のエラー:

[Route("error/{code}")] 
public IActionResult Error(int code) 
{ 
    return new ObjectResult(new ApiResponse(code)); 
} 

これは、Web APIのではなく、Webページのために良いです。 APIの場合、カスタムオブジェクト(JSONとしてシリアル化されています)を返したいのですが、UIではカスタムビューを返したいと思います。 私は質問がCalledFromApiClientを実装する方法である

public IActionResult Error(int code) 
{ 
    if(CalledFromApiClient()) 
    { 
      return new ObjectResult(new ApiResponse(code)); 
    } 
    else 
     return View(“Error”); 
} 

のようなものを書きたいですか?

apiコントローラをすべてapiサブフォルダ/名前空間に保存し、callstackを使用してAPIコントローラから例外がスローされたかどうかを確認することを検討しています。 それはうまくいくはずですが、うまく見えません。

もっと良い方法はありますか?

+0

チェックヘッダ(コンテントネゴシエーションを)受け入れることを慣例に従うことを前提としています。それがHTMLを求めたら、それを返します – Nkosi

答えて

1

私は最終的にこの要件のための一般的な例は、あなたがエラー処理したいMVCと APIアクションの両方を持つプロジェクトで同じ著者https://www.devtrends.co.uk/blog/conditional-middleware-based-on-request-in-asp.net-core

のブログで答えを見つけましたそれぞれ違う。

私たちは、JSONはJSONを与えるために要求が要求する場合、URLパスは、APIコントローラアクションスタートWithSegment「API」

// returns Api error response 
app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder => 
{ 
    appBuilder.UseStatusCodePagesWithReExecute("/apierror/{0}"); 
appBuilder.UseExceptionHandler("/apierror/500"); 
}); 
// returns MVC error page 
app.UseWhen(context => !context.Request.Path.StartsWithSegments("/api"), appBuilder => 
{ 
    appBuilder.UseStatusCodePagesWithReExecute("/error/{0}"); 
appBuilder.UseExceptionHandler("/error/500"); 
}); 
関連する問題