web-dev-qa-db-ja.com

ASP.NET Core RC2 Web ApiからHTTP 500を返すにはどうすればいいですか?

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呼び出し元に返させるだけですか。開発のために、どうすれば正確な例外スタックを見ることができますか?

126
Mickael Caruso

私が見ることができるものからControllerBaseクラスの中にヘルパーメソッドがあります。 StatusCodeメソッドを使うだけです:

[HttpPost]
public IActionResult Post([FromBody] string something)
{    
    //...
    try
    {
        DoSomething();
    }
    catch(Exception e)
    {
         LogException(e);
         return StatusCode(500);
    }
}

また、コンテンツをネゴシエートするStatusCode(int statusCode, object value)オーバーロードを使うこともできます。

169
Federico Dipuma

特定の番号をハードコードしたくない場合は、Microsoft.AspNetCore.Mvc.ControllerBase.StatusCodeMicrosoft.AspNetCore.Http.StatusCodesを使用して応答を作成できます。

return  StatusCode(StatusCodes.Status500InternalServerError);
119
Edward Comeau

あなたの応答にボディが必要な場合は、呼び出すことができます

return StatusCode(StatusCodes.Status500InternalServerError, responseObject);

これは応答オブジェクトと共に500を返します...

19
David McEleney

現在(1.1)の時点でこれを処理するためのより良い方法はStartup.csConfigure()でこれをすることです:

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のブログ から取得したものです。

15
gldraphael
return StatusCode((int)HttpStatusCode.InternalServerError, e);

ASP.NET以外のコンテキストで使用する必要があります(ASP.NET Coreの他の回答を参照)。

HttpStatusCodeSystem.Netの列挙型です。

11
Shimmy

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;
    }
}
7
Airn5475

MVC .NET CoreでJSONレスポンスを返したい場合は、次のものも使用できます。

Response.StatusCode = (int)HttpStatusCode.InternalServerError;//Equals to HTTPResponse 500
return Json(new { responseText = "my error" });

これはJSON結果とHTTPStatusの両方を返します。私はjQuery.ajax()に結果を返すためにそれを使います。

1
Tekin