如何从ASP.NET MVC 3设置HTTP状态代码?

Her*_*der 51 .net c# asp.net-mvc-3

我们在前端使用OpenWeb js库,当发生某些类型的错误时,他们需要.NET中间层向他们发送特定的HTTP头状态代码.我试图通过这样做来实现这一点:

public ActionResult TestError(string id) // id = error code
{
    Request.Headers.Add("Status Code", id);
    Response.AddHeader("Status Code", id);
    var error = new Error();
    error.ErrorID = 123;
    error.Level = 2;
    error.Message = "You broke the Internet!";

    return Json(error, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)

它有点中途了.请参见屏幕截图: http状态代码http://zerogravpro.com/temp/pic.png

注意我在响应头中获得了400的状态代码,但我确实需要请求头中的400.相反,我得到"200 OK".我怎样才能做到这一点?

我进行调用的URL结构很简单:/ Main/TestError/400

Ste*_*tty 96

有一个扩展的讨论在什么是从ASP.NET MVC动作发送HTTP 404响应的正确方法?

您想要做的是设置Response.StatusCode而不是添加标题.

public ActionResult TestError(string id) // id = error code
{
    Response.StatusCode = 400; // Replace .AddHeader
    var error = new Error();  // Create class Error() w/ prop
    error.ErrorID = 123;
    error.Level = 2;
    error.Message = "You broke the Internet!";

    return Json(error, JsonRequestBehavior.AllowGet);
}
Run Code Online (Sandbox Code Playgroud)

  • @CarlR,现代[RESTful](https://en.wikipedia.org/wiki/RESTful)Web服务通常返回HTTP状态代码,其中包含解释错误情况的正文. (3认同)

Nic*_*nes 61

如果要返回的只是错误代码,则可以执行以下操作:

public ActionResult TestError(string id) // id = error code 
{ 
      return new HttpStatusCodeResult(id, "You broke the Internet!");
}
Run Code Online (Sandbox Code Playgroud)

参考:关于Mvc.HttpStatusCodeResult的MSDN文章.

否则,如果要返回其他信息使用

Response.StatusCode = id
Run Code Online (Sandbox Code Playgroud)

代替

Response.AddHeader("Status Code", id); 
Run Code Online (Sandbox Code Playgroud)

  • HttpStatusCodeResult具有保持控制器可测试的额外好处.使用Response引入了对HttpContext的依赖. (8认同)
  • 如果你使用带有dataType = json的jquery ajax调用Action,这不起作用,因为jquery期望json数据返回并且上面的空响应将错误输出. (3认同)
  • 我在使用 `HttpStatusCodeResult` 时遇到的问题是,我让 AJAX 调用的操作返回了 `JsonResult`,而 `HttpStatusCodeResult` 不是一个 `JsonResult`。你可以只返回一个`ActionResult`,因为`JsonResult` 是一个`ActionResult`,但它会使动作签名产生误导。 (2认同)