服务器未返回状态码为400(.net)的JSON

我有一个奇怪的问题,返回400状态代码与json错误。

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

if(!ModelState.IsValid) { string[] errors = ModelState.Values .SelectMany(x => x.Errors) .Select(x => x.ErrorMessage).ToArray(); Response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest; return Json(new { success = false, errors = errors }, JsonRequestBehavior.DenyGet); } 

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

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

我终于弄明白了问题所在。 在这里发布这个作为其他任何人可能会把头发拉过来的答案。

设置以下内容:

 Response.TrySkipIisCustomErrors = true; 

设置状态代码之前 ,请确保已设置此项。 我也弄清楚为什么它在我的本地机器上而不是在测试/ uat服务器上工作。 在我的web.configCustomErrors设置为Off,而在服务器上则设置为On

一看到服务器’ 返回 ‘,就会看到写入ResponseBadRequest状态代码。

好吧,即使您是显式转换,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允许内容协商,并将遵循客户端请求的内容)。

希望有所帮助。