【问题标题】:How to set HTTP status code from ASP.NET MVC 3?如何从 ASP.NET MVC 3 设置 HTTP 状态代码?
【发布时间】:2012-08-20 04:37:29
【问题描述】:

我们在前端使用 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);
}

它有点成功了。看截图: http status code http://zerogravpro.com/temp/pic.png

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

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

【问题讨论】:

  • 我相信他真正想要的是在响应状态行(被圈出)中设置状态码,而不是请求头。
  • 请求没有状态码,就算你能做到,修改Request头信息又有什么意义,你已经收到了?

标签: c# .net asp.net-mvc-3


【解决方案1】:

What is the proper way to send an HTTP 404 response from an ASP.NET MVC action?有扩展讨论

你想要做的是设置Response.StatusCode而不是添加一个Header。

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

【讨论】:

  • @SweatCoder 返回带有 StatusCode 400 的内容不是一个好主意。手机浏览器(chrome、opera 等)不接收内容,只接收状态代码,从而破坏了您的客户端代码期望 json。因此,像尼克建议的那样使用 HttpStatusCodeResult 是正确的解决方案。
  • @CarlR 最好澄清所涉及的技术的哪一部分施加了这种限制。 (MVC、浏览器本身、JavaScript 库?)
  • @jpmc26 手机浏览器。
  • @CarlR,现代的RESTful Web 服务经常返回 HTTP 状态代码,正文解释错误情况。
【解决方案2】:

如果您只想返回错误代码,您可以执行以下操作:

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

参考:MSDN article on Mvc.HttpStatusCodeResult

否则,如果您想返回其他信息,请使用

Response.StatusCode = id

而不是

Response.AddHeader("Status Code", id); 

【讨论】:

  • HttpStatusCodeResult 具有保持控制器可测试的额外好处。使用 Response 引入了对 HttpContext 的依赖。
  • 如果您将 Action for jquery ajax 调用与 dataType = json 一起使用,这将不起作用,因为 jquery 需要返回 json 数据并且上面的空响应会出错。
  • HttpStatusCodeResult 遇到的问题是我有 AJAX 调用的操作返回 JsonResults,而 HttpStatusCodeResult 不是 JsonResult。您可以只返回一个ActionResult,因为JsonResult 是一个ActionResult,但这会使操作签名产生误导。
【解决方案3】:

如果您无法将 json 结果放入您的视图中,请尝试添加:

Response.TrySkipIisCustomErrors = true;

在此之前:

Response.StatusCode = 400;

关于这篇文章的更多细节:https://stackoverflow.com/a/37313866/9223103

【讨论】:

    猜你喜欢
    • 2011-07-01
    • 2011-11-27
    • 2013-12-06
    • 2012-07-10
    • 2018-10-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多