166

我希望下面的示例控制器返回没有内容的状态代码 418。设置状态码很容易,但似乎需要做一些事情来表示请求的结束。在 ASP.NET Core 之前的 MVC 或 WebForms 中可能会调用但它在不存在Response.End()的 ASP.NET Core 中如何工作?Response.End

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();   
    }
}
4

5 回答 5

333

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


更多细节:

于 2016-06-07T23:07:04.883 回答
8

最好的方法是:

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

StatusCodes有各种退货状态,你可以在这里看到所有的。

一旦你选择了你的StatusCode,用一条消息返回它。

于 2020-04-20T13:13:12.057 回答
7

查看当前对象结果是如何创建的。这是 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.");
}
于 2019-11-19T18:26:17.643 回答
6

此代码可能适用于非 .NET Core MVC 控制器:

this.HttpContext.Response.StatusCode = 418; // I'm a teapot
return Json(new { status = "mer" }, JsonRequestBehavior.AllowGet);
于 2017-12-07T12:45:23.970 回答
6

如果有人想IHttpActionResult在 Web 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();
}
于 2019-07-15T05:42:17.137 回答