ASP.NET MVC 在发送状态为 500 的响应时显示错误页面
ASP.NET MVC showing error page on when sending responses with status 500
我在服务器中有以下操作:
[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);
}
}
在本地,效果很好。当请求无效时,它 returns 一个带有错误的 JSON 并且响应有一个 500
作为 HTTP 状态代码。
部署后,IIS 返回我 this famed error page,而不是 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:
您使用的是服务器错误而不是客户端错误。根据 Wikipedia 5XX 错误:
"The server failed to fulfill an apparently valid request."
在这种情况下,您的服务器工作正常,但客户端发送了错误的请求。请改用客户端错误 (4XX)。
来自this link:
解决了编辑 web.config
并添加以下属性的问题:
<system.webServer>
...
<httpErrors existingResponse="PassThrough"></httpErrors>
...
</system.webServer>
另一个离奇的微软故事。
如果您需要为 httpErrors 部分中定义的 http 状态同时使用自定义错误页面和有时 return 自定义数据,请执行以下操作:
- 在 web.config 中设置 existingResponse="Auto"
(httpErrors 部分,这是您定义自定义错误页面的地方);
- 在您的操作中设置 TrySkipIisCustomErrors = true
(returns 4xx 状态和内容);
- 清除 global.asax 中的服务器错误(在 Application_Error()
- Server.ClearError()
中)并重新设置状态代码 (Reponse.StatusCode = ((HttpException)Server.GetLastError()).GetHttpCode()
)
我在服务器中有以下操作:
[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);
}
}
在本地,效果很好。当请求无效时,它 returns 一个带有错误的 JSON 并且响应有一个 500
作为 HTTP 状态代码。
部署后,IIS 返回我 this famed error page,而不是 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:
您使用的是服务器错误而不是客户端错误。根据 Wikipedia 5XX 错误:
"The server failed to fulfill an apparently valid request."
在这种情况下,您的服务器工作正常,但客户端发送了错误的请求。请改用客户端错误 (4XX)。
来自this link:
解决了编辑 web.config
并添加以下属性的问题:
<system.webServer>
...
<httpErrors existingResponse="PassThrough"></httpErrors>
...
</system.webServer>
另一个离奇的微软故事。
如果您需要为 httpErrors 部分中定义的 http 状态同时使用自定义错误页面和有时 return 自定义数据,请执行以下操作:
- 在 web.config 中设置 existingResponse="Auto"
(httpErrors 部分,这是您定义自定义错误页面的地方);
- 在您的操作中设置 TrySkipIisCustomErrors = true
(returns 4xx 状态和内容);
- 清除 global.asax 中的服务器错误(在 Application_Error()
- Server.ClearError()
中)并重新设置状态代码 (Reponse.StatusCode = ((HttpException)Server.GetLastError()).GetHttpCode()
)