コントローラから特定のステータスコードを返し、コンテンツを返さない方法は?


119

以下の例のコントローラーで、コンテンツのないステータスコード418を返します。ステータスコードの設定は簡単ですが、リクエストの終了を知らせるために実行する必要があることがあるようです。ASP.NET Coreより前のMVCまたはWebFormsで呼び出される可能性がありますがResponse.End()Response.End存在しないASP.NET Coreではどのように機能しますか?

public class ExampleController : Controller
{
    [HttpGet][Route("/example/main")]
    public IActionResult Main()
    {
        this.HttpContext.Response.StatusCode = 418; // I'm a teapot
        // How to end the request?
        // I don't actually want to return a view but perhaps the next
        // line is required anyway?
        return View();   
    }
}

回答:


246

this.HttpContext.Response.StatusCode = 418; // I'm a teapot

リクエストを終了するには?

他の解決策を試してください:

return StatusCode(418);


を使用StatusCode(???)して、任意のHTTPステータスコードを返すことができます。


また、専用の結果を使用できます。

成功:

  • return Ok() ←Httpステータスコード200
  • return Created() ←HTTPステータスコード201
  • return NoContent(); ←HTTPステータスコード204

クライアントエラー:

  • return BadRequest(); ←Httpステータスコード400
  • return Unauthorized(); ←HTTPステータスコード401
  • return NotFound(); ←Httpステータスコード404


詳細:


62
there is no dedicated result for 418 ここに深刻な欠けている機能、マイクロソフト。
ジェス

1
私が見つけたように私は私の答えを更新したNoContent();HTTPエラーコード204を返した
ルカシュMakowej

1
ここにControllerBaseクラスへのリンクがあります。ここでは、これらすべてのすぐに使える結果タイプが定義されています。docs.microsoft.com/en-us/aspnet/core/api/...
テクネチウム

3
それでも、名前空間(github.com/aspnet/HttpAbstractions/blob/dev/src/…StatusCodesから使用できます。Microsoft.AspNetCore.Http
Lukasz Makowej 2017

1
はい、動作します。または使用できますStatusCode(StatusCodes.Status412PreconditionFailed);
Lukasz Makowej '21

4

このコードは、非.NET Core MVCコントローラーで機能する可能性があります。

this.HttpContext.Response.StatusCode = 418; // I'm a teapot
return Json(new { status = "mer" }, JsonRequestBehavior.AllowGet);

4

誰かがこれをIHttpActionResultWeb APIプロジェクトに参加させたい場合は、以下が役立つでしょう。

// GET: api/Default/
public IHttpActionResult Get()
{
    //return Ok();//200
    //return StatusCode(HttpStatusCode.Accepted);//202
    //return BadRequest();//400
    //return InternalServerError();//500
    //return Unauthorized();//401
    return Ok();
}

1

現在のオブジェクト結果がどのように作成されるか見てください。BadRequestObjectResultは次のとおりです。値とStatusCodeを持つObjectResultの単なる拡張。

https://github.com/aspnet/Mvc/blob/master/src/Microsoft.AspNetCore.Mvc.Core/BadRequestObjectResult.cs

408の場合と同じ方法でTimeoutExceptionObjectResultを作成しました。

/// <summary>
/// An <see cref="ObjectResult"/> that when executed will produce a Request Timeout (408) response.
/// </summary>
[DefaultStatusCode(DefaultStatusCode)]
public class TimeoutExceptionObjectResult : ObjectResult
{
    private const int DefaultStatusCode = StatusCodes.Status408RequestTimeout;

    /// <summary>
    /// Creates a new <see cref="TimeoutExceptionObjectResult"/> instance.
    /// </summary>
    /// <param name="error">Contains the errors to be returned to the client.</param>
    public TimeoutExceptionObjectResult(object error)
        : base(error)
    {
        StatusCode = DefaultStatusCode;
    }
}

クライアント:

if (ex is TimeoutException)
{
    return new TimeoutExceptionObjectResult("The request timed out.");
}

1

それを行う最善の方法は次のとおりです。

return this.StatusCode(StatusCodes.Status418ImATeapot, "Error message");

'StatusCodes'にはあらゆる種類の戻りステータスがあり、このリンクhttps://httpstatuses.com/でそれらすべてを確認できます。

StatusCodeを選択したら、メッセージでそれを返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.