我有一个奇怪的问题,返回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属性时函数'返回'。这有发生在其他人身上吗?谁知道解决方案?
我终于弄明白了问题所在。在这里发布这个作为其他任何可能正在为此而拔毛的人的答案。
设置以下内容:
Response.TrySkipIisCustomErrors = true;
在设置状态代码之前,请确保已设置此项。我也弄清楚为什么它在我的本地机器上运行而不在test / uat服务器上运行。在我的web.config
中,CustomErrors
被设置为Off,而在服务器上它被设置为On。
似乎服务器“返回”,只要它看到BadRequest
状态代码被写入Response
。
好吧,即使您是显式转换,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允许内容协商,并将遵循客户端请求的内容)。
希望有所帮助。