返回Mvc.JsonResult并设置Response.StatusCode

时间:2013-06-19 04:42:18

标签: json asp.net-mvc-4 http-status-codes

项目:在.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属性,行为没有区别)

当deployable移动到Web主机上时(使用IIS 7),firebug告诉我响应符合预期(400)但响应中没有JSON(即没有任何类型的文本)。如果我删除该行

Response.StatusCode = 400;

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

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

3 个答案:

答案 0 :(得分:52)

我有同样的问题;为了确保评论中没有正确答案(就像我一样),我想重申@ Sprockincat的评论:

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

Response.TrySkipIisCustomErrors = true;

@Sprockincat - 你应该对此感到荣幸。我只是让它更加明显,因为它是一个非常难以诊断的问题的微妙修复。

答案 1 :(得分:2)

我已经创建了一个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);
    }
}

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

答案 2 :(得分:0)

对于任何需要它的人-在ASP.NET Core中,您可以设置StatusCode的{​​{1}}属性。

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