如何从Controller返回特定的状态代码而没有内容?

时间:2016-06-07 21:58:28

标签: c# asp.net-core asp.net-core-mvc asp.net-core-webapi

我希望下面的示例控制器返回没有内容的状态代码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();   
    }
}

5 个答案:

答案 0 :(得分:188)

  

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


更多详情:

答案 1 :(得分:3)

最好的方法是:

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

'StatusCodes'具有各种返回状态,您可以在此链接https://httpstatuses.com/

中查看所有返回状态。

选择状态代码后,返回一条消息。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

如果有人想使用NestedScrollView( headerSliverBuilder: (BuildContext ctx, isScrolled) { return <Widget>[ SliverAppBar( title: Text('Applying to this job opportunity'), pinned: true, titleSpacing: 0, floating: true, expandedHeight: 180, flexibleSpace: //some widgets ) ] } ) 进行此操作,则可能在Web API项目中,下面可能会有所帮助。

IHttpActionResult

答案 4 :(得分:0)

查看如何创建当前的对象结果。这是BadRequestObjectResult。只是ObjectResult的扩展,带有值和StatusCode。

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.");
}