【问题标题】:Server not returning JSON with status code 400 (.net)服务器未返回带有状态代码 400 (.net) 的 JSON
【发布时间】:2016-09-15 18:09:17
【问题描述】:

我遇到了一个奇怪的问题,即返回 400 状态码和 json 出错。

在我的控制器中,我有类似的东西:

if(!ModelState.IsValid)
{
    string[] errors = ModelState.Values
                            .SelectMany(x => x.Errors)
                            .Select(x => x.ErrorMessage).ToArray<string>();

    Response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest;
    return Json(new { success = false, errors = errors }, JsonRequestBehavior.DenyGet);
}

这在我的开发机器上运行良好。我可以在 ajax 错误方法中得到错误。但是当我部署到服务器时,服务器不再返回 JSON。我总是得到 responseText 而不是 reponseJSON。如果我删除 Response.StatusCode 它工作正常。

这让我相信,当我设置 Response 对象的 StatusCode 属性时,函数会“返回”。这有发生在其他人身上吗?有谁知道解决办法吗?

【问题讨论】:

  • 让它JsonRequestBehavior.AllowGet

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


【解决方案1】:

我终于弄清楚了问题所在。在此处发布此内容作为其他任何可能为此而烦恼的人的答案。

设置如下:

Response.TrySkipIisCustomErrors = true;

确保在您设置状态代码之前设置了此项。我还弄清楚了为什么它在我的本地机器上运行,而不是在测试/uat 服务器上运行。在我的web.config 中,CustomErrors 设置为 Off,而在服务器上它设置为 On

似乎服务器在看到BadRequest 状态代码被写入Response 后立即“返回”。

【讨论】:

  • 太棒了!顺便说一句,您在 IIS 10 下不需要它,但在 IIS7 下仍然需要它。至少这是我的经验(不一致会让人头疼,在开发和生产之间移动会带来意想不到的挑战)
  • 感谢您发布答案。在 AWS Elasticbeanstalk 服务器中发布时,我遇到了同样的问题。
  • 非常感谢您对为什么它不起作用的回答和解释。它对我有用。
  • 谢谢,这救了我的命!
【解决方案2】:

好吧,即使您是显式转换,Response.StatusCode 也是 Response 的子元素。

在大多数情况下,我找到并遵循创建 WebAPI 的“最佳实践”的最简单方法:

首先,您的方法签名将从:​​

public JsonResult Action() { ... }

public IHttpActionResult Action { ... }

那么,您将使用以下内容,而不是返回 Json()

return Content(HttpStatusCode.BadRequest, new {success = false, errors = errors }, Configuration.Formatters.JsonFormatter);

其中最后一个变量 Configuration.Formatters.JsonFormatter 是可选的——请记住,Json 是默认返回类型(或者 ASP.NET 允许内容协商并将遵循客户端的请求)。

希望对您有所帮助。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
相关资源
最近更新 更多