返回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结果的状态代码。
- 当优化设置为true时,MVC4 – Bundling不起作用
- 无法findtypes或名称空间IAppBuilder(使用指令缺less程序集引用)
- 无法在MVC4 Web API中加载文件或程序集“System.Net.Http,Version = 2.0.0.0”
- 如何在WebApi中添加和获取Header值
- Windows更新导致MVC3和MVC4停止工作
- 如何在OnActionExecuting中获取控制器和操作名称?
- 防伪cookie标记和表单字段标记在MVC 4中不匹配
- MVC4 StyleBundle:你可以在debugging模式下添加caching查询string吗?
- razor的意见是不给编译时错误