42

项目:在 .net 4.0 框架下运行的 ASP MVC 4:

在 VS 2010 express 下运行应用程序(或在我的本地计算机上部署并在 IIS 7.5 下运行)时,操作的以下(伪代码)结果按预期工作

[HttpPost]
public ActionResult PostWord(Model model)
{
   ....
   Response.StatusCode = 400;
   Return new JsonResult { data = new {fieldName = "Word", error = "Not really a word!" } };

(并且我已经分配了 JsonResult 对象的 ContentType 和 ContentEncoding 属性,行为没有区别)

当可部署的移动到 Web 主机(使用 IIS 7)时,萤火虫告诉我响应是预期的(400),但响应中没有 JSON(即没有任何类型的文本)。如果我删除线

Response.StatusCode = 400;

从动作来看,响应中完美地形成了 JSON,但是响应状态码当然是 200(OK),这干扰了消费 javascript 和适当的函数调用。

关于可能发生的事情以及如何解决这个问题的任何想法?谢谢

4

3 回答 3

58

我遇到了同样的问题;为了确保正确的答案不会被埋没在评论中(就像对我一样),我想重申@Sprockincat 的评论:

至少对我来说,这确实是 IIS 自定义错误的问题,可以通过以下方式解决:

Response.TrySkipIisCustomErrors = true;

@Sprockincat - 你应该为此获得荣誉。我只是让它更明显,因为它是对一个很难诊断的问题的微妙修复。

于 2013-07-17T06:03:56.207 回答
3

我创建了一个 JsonResult 的子类,它允许您指定 HttpStatusCode。

public class JsonResultWithHttpStatusCode : JsonResult
{

    private int _statusCode;
    private string _statusDescription;

    public JsonResultWithHttpStatusCode(object data, HttpStatusCode status) 
    {
        var code = Convert.ToInt32(status);
        var description = HttpWorkerRequest.GetStatusDescription(code);
        Init(data, code, description);
    }

    public JsonResultWithHttpStatusCode(object data, int code, string description)
    {
        Init(data, code, description);
    }

    private void Init(object data, int code, string description)
    {
        Data = data;
        _statusCode = code;
        _statusDescription = description;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.StatusCode = _statusCode;
        context.HttpContext.Response.StatusDescription = _statusDescription;
        base.ExecuteResult(context);
    }
}

然后您可以将此作为结果返回,状态代码将在响应中设置。您还可以在测试结果中测试状态代码。

于 2017-09-19T12:11:12.733 回答
1

对于任何寻找这个的人 - 在 ASP.NET Core 中,您可以设置StatusCode.JsonResult

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.jsonresult.statuscode

于 2020-11-15T09:20:15.610 回答