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

9

我在返回错误的json数据时遇到了一个奇怪的问题,状态码是400。

在我的控制器中,我有如下代码:

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 - Bharadwaj
2个回答

21

我最终弄清了问题所在。将此作为答案发布在此,供其他可能因此抓狂的人参考。

请设置如下内容:

Response.TrySkipIisCustomErrors = true;

在设置状态码之前,确保已经设置好了这个参数。我也发现了为什么它在我的本地机器上能够工作,而在测试/UAT服务器上不能工作的原因。在我的web.config文件中,CustomErrors被设置为关闭,而在服务器上被设置为打开

看起来服务器在看到写入ResponseBadRequest状态代码后会立即'返回'。


1
太好了!顺便说一下,在IIS 10下你不需要它,但在IIS7下仍然需要。至少这是我的经验(不一致性是个大问题,在开发和生产之间切换会带来意想不到的挑战)。 - Mike Keskinov
1
感谢您发布答案。我在将项目发布到AWS Elasticbeanstalk服务器时遇到了同样的问题。 - Rafael
1
非常感谢你的答案和解释,让我明白了为什么它没有起作用。现在它对我有用了。 - aspnetdeveloper
谢谢,这救了我的命! - hyphen

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允许内容协商,并将遵循客户端请求)。

希望这有所帮助。


嘿,谢谢。不幸的是,我已经尝试过那个方法,但没有成功。我已经添加了最终有效的答案。虽然我很想知道你提到的这些东西的“最佳实践”的来源。 - reggaemahn
@JeevanJose 很有趣,您在使用上述代码时遇到了什么问题?是完全相同的错误吗?就最佳实践而言,我基于大多数.NET专家在编写API时推荐的做法(Shawn Wildermuth在Pluralsight上有一些特别好的课程,包括:https://app.pluralsight.com/library/courses/web-api-design/table-of-contents https://app.pluralsight.com/library/courses/implementing-restful-aspdotnet-web-api/table-of-contents 和最后一个是https://app.pluralsight.com/library/courses/aspdotnet-bestpractices-models/table-of-contents)。 - Fernando Rodriguez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接