ASP.NET MVC在发送状态为500的响应时显示错误页面

时间:2015-01-05 15:28:26

标签: c# asp.net-mvc json http iis

我在服务器中执行以下操作:

[HttpPost]
public JsonResult SearchContracts(SearchViewModel vm)
{
    List<string> errors;

    if (IsValid(vm, out errors))
    {
        return Json(service.Search(vm), JsonRequestBehavior.AllowGet);
    }
    else
    {
        HttpContext.Response.StatusCode = 500;

        return Json(new { Errors = errors }, JsonRequestBehavior.AllowGet);
    }
}

在当地,它很棒。当请求无效时,它返回带有错误的JSON,并且响应的HTTP状态代码为500

部署后,IIS不再使用所描述的JSON,而是返回this famed error page

以下web.config包含customErrors部分的详细信息:

<customErrors mode="Off" defaultRedirect="~/error.htm">
    <error statusCode="404" redirect="~/errorhandling/pagenotfound" />
</customErrors>

我尝试将其转为On,但都没有效果。

我应该在哪里更改以停止接收那个丑陋的错误页面而不是我的美丽JSON?

修改

我将状态代码更改为400,现在我将文本Bad Request作为回复,而不是JSON:

Bad request text

3 个答案:

答案 0 :(得分:7)

来自this link

解决了对web.config的修改并添加以下属性:

<system.webServer>
    ...
    <httpErrors existingResponse="PassThrough"></httpErrors>
    ...
</system.webServer>

另一个奇怪的微软故事。

答案 1 :(得分:2)

您正在使用服务器错误而不是客户端错误。根据{{​​3}}的5XX错误:

  

“服务器无法满足明显有效的请求。”

在这种情况下,您的服务器工作正常,客户端发送错误请求。请改用客户端错误(4XX)。

答案 2 :(得分:0)

如果您需要同时使用自定义错误页面,有时会返回httpErrors部分中定义的http状态的自定义数据,该怎么办: - 在web.config中设置existingResponse="Auto"(httpErrors部分,您定义自定义错误页面的位置); - 在您的操作中设置TrySkipIisCustomErrors = true(一个返回4xx状态和内容); - 清除global.asax中的服务器错误(在Application_Error() - Server.ClearError()中)并重新设置状态代码(Reponse.StatusCode = ((HttpException)Server.GetLastError()).GetHttpCode()