服务器未返回状态码为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.config
, CustomErrors
设置为Off,而在服务器上则设置为On 。
一看到服务器’ 返回 ‘,就会看到写入Response
的BadRequest
状态代码。
好吧,即使您是显式转换,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允许内容协商,并将遵循客户端请求的内容)。
希望有所帮助。