返回Mvc.JsonResult并设置Response.StatusCode

项目:运行在.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和适当的函数调用。

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

我有这个完全相同的问题; 为了确保正确的答案没有被埋没在评论中(就像我一样),我想重申@ Sprockincat的评论:

至less对我来说,这确实是一个与IIS自定义错误的问题,可以解决:

 Response.TrySkipIisCustomErrors = true; 

@Sprockincat – 你应该得到这个功劳。 我只是让它更明显,因为它是一个很难诊断的问题的微妙的解决办法。

我创build了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); } } 

然后你可以返回这个作为你的结果和状态代码将设置响应。 您也可以在testing中testing结果的状态代码。