RC1に戻り、これを行います。
[HttpPost]
public IActionResult Post([FromBody]string something)
{
try{
// ...
}
catch(Exception e)
{
return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError);
}
}
RC2では、HttpStatusCodeResultがなくなり、500種類のIActionResultを返すことができるものも見つかりません。
私が求めていることとアプローチは全く異なっていますか? Controller
コードを試してみませんか。フレームワークから一般的な500の例外をAPI呼び出し元に返させるだけですか。開発のために、どうすれば正確な例外スタックを見ることができますか?
私が見ることができるものからControllerBase
クラスの中にヘルパーメソッドがあります。 StatusCode
メソッドを使うだけです:
[HttpPost]
public IActionResult Post([FromBody] string something)
{
//...
try
{
DoSomething();
}
catch(Exception e)
{
LogException(e);
return StatusCode(500);
}
}
また、コンテンツをネゴシエートするStatusCode(int statusCode, object value)
オーバーロードを使うこともできます。
特定の番号をハードコードしたくない場合は、Microsoft.AspNetCore.Mvc.ControllerBase.StatusCode
とMicrosoft.AspNetCore.Http.StatusCodes
を使用して応答を作成できます。
return StatusCode(StatusCodes.Status500InternalServerError);
あなたの応答にボディが必要な場合は、呼び出すことができます
return StatusCode(StatusCodes.Status500InternalServerError, responseObject);
これは応答オブジェクトと共に500を返します...
現在(1.1)の時点でこれを処理するためのより良い方法はStartup.cs
のConfigure()
でこれをすることです:
app.UseExceptionHandler("/Error");
これは/Error
へのルートを実行します。これにより、作成したすべてのアクションにtry-catchブロックを追加する必要がなくなります。
もちろん、これに似たErrorControllerを追加する必要があります。
[Route("[controller]")]
public class ErrorController : Controller
{
[Route("")]
[AllowAnonymous]
public IActionResult Get()
{
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
詳しい情報 はこちら 。
実際の例外データを取得したい場合は、return
ステートメントの直前の上記のGet()
にこれを追加することができます。
// Get the details of the exception that occurred
var exceptionFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
if (exceptionFeature != null)
{
// Get which route the exception occurred at
string routeWhereExceptionOccurred = exceptionFeature.Path;
// Get the exception that occurred
Exception exceptionThatOccurred = exceptionFeature.Error;
// TODO: Do something with the exception
// Log it with Serilog?
// Send an e-mail, text, fax, or carrier pidgeon? Maybe all of the above?
// Whatever you do, be careful to catch any exceptions, otherwise you'll end up with a blank page and throwing a 500
}
上記の抜粋は、 Scott Sauberのブログ から取得したものです。
return StatusCode((int)HttpStatusCode.InternalServerError, e);
ASP.NET以外のコンテキストで使用する必要があります(ASP.NET Coreの他の回答を参照)。
HttpStatusCode
はSystem.Net
の列挙型です。
OkObjectResult
のような内部サーバーエラーを表すカスタムObjectResultクラスを作成するのはどうですか。 Ok()
やBadRequest()
と同じように、InternalServerErrorを簡単に生成して返すことができるように、独自の基本クラスに単純なメソッドを置くことができます。
[Route("api/[controller]")]
[ApiController]
public class MyController : MyControllerBase
{
[HttpGet]
[Route("{key}")]
public IActionResult Get(int key)
{
try
{
//do something that fails
}
catch (Exception e)
{
LogException(e);
return InternalServerError();
}
}
}
public class MyControllerBase : ControllerBase
{
public InternalServerErrorObjectResult InternalServerError()
{
return new InternalServerErrorObjectResult();
}
public InternalServerErrorObjectResult InternalServerError(object value)
{
return new InternalServerErrorObjectResult(value);
}
}
public class InternalServerErrorObjectResult : ObjectResult
{
public InternalServerErrorObjectResult(object value) : base(value)
{
StatusCode = StatusCodes.Status500InternalServerError;
}
public InternalServerErrorObjectResult() : this(null)
{
StatusCode = StatusCodes.Status500InternalServerError;
}
}
MVC .NET CoreでJSONレスポンスを返したい場合は、次のものも使用できます。
Response.StatusCode = (int)HttpStatusCode.InternalServerError;//Equals to HTTPResponse 500
return Json(new { responseText = "my error" });
これはJSON結果とHTTPStatusの両方を返します。私はjQuery.ajax()に結果を返すためにそれを使います。