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

问题描述 投票:5回答:2

我有一个奇怪的问题,返回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属性时函数'返回'。这有发生在其他人身上吗?谁知道解决方案?

c# .net json asp.net-mvc
2个回答
9
投票

我终于弄明白了问题所在。在这里发布这个作为其他任何可能正在为此而拔毛的人的答案。

设置以下内容:

Response.TrySkipIisCustomErrors = true;

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

似乎服务器“返回”,只要它看到BadRequest状态代码被写入Response


1
投票

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

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.