【问题标题】:Return Mvc.JsonResult plus set Response.StatusCode返回 Mvc.JsonResult 加上设置 Response.StatusCode
【发布时间】:2013-06-15 12:02:08
【问题描述】:

项目:在 .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)时,firebug 告诉我响应符合预期(400),但响应中没有 JSON(即没有任何类型的文本)。如果我删除该行

Response.StatusCode = 400;

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

对可能发生的情况以及如何解决此问题有任何想法吗?谢谢

【问题讨论】:

  • 为什么要返回400?这不就是一个带有友好错误信息的错误页面吗
  • stackoverflow.com/questions/6123425/… 也许我应该做不同的事情,但无论如何都会返回 JSON - 响应代码提供回发函数信息以便知道如何处理 JSON。 200 对我来说意味着“根据要求更新数据库”。
  • 我会检查 JSON 中的错误字段而不是 http 状态码
  • IIS7默认隐藏了详细的错误信息,所以在返回错误时你不会得到任何内容。尝试更改 iss7 设置以返回详细的错误消息并查看是否有效
  • 这可能是 IIS 自定义错误的问题。也许尝试设置Response.TrySkipIisCustomErrors = true;link

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


【解决方案1】:

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

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

Response.TrySkipIisCustomErrors = true;

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

【讨论】:

  • 感谢您,非常宝贵!
  • @Robert 如果我能在明年每天都支持这个答案,我会的!谢谢你!这个 frikkin 的问题让我在过去的 12 个小时里一直在挖掘!谢谢谢谢谢谢谢谢。感谢布伦特的开篇文章!
  • 我还必须添加 因为 existingResponse="Replace" 会忽略 TrySkipIisCustomErrors!
  • 和很多人一样,我以前也遇到过奇怪的 IIS 问题,但老实说,这个问题很重要。
【解决方案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);
    }
}

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

【讨论】:

  • 请将其合并到 Mvc API 中。天哪,这是大多数人认为必不可少的。
  • 我只想扩展到包括 <T> IE : public class JsonResultWithHttpStatusCode<T>
  • @Pogrindis T 是什么?
【解决方案3】:

对于任何寻找此功能的人 - 在 ASP.NET Core 中,您可以设置 JsonResultStatusCode 属性。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-30
    • 2011-02-28
    • 2013-09-05
    • 2020-10-26
    • 2019-05-16
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多