我遇到了一个恼人的问题,我认为这是由 IIS 8.5 引起的。通过我正在创建的 Web 应用程序,我创建了一个自定义 JSON HttpStatusResult 类(这是一个想法来自这个 stackoverflow 帖子),这使我能够返回 JSON 以及 500、400 或其他类型的 HTTP 响应状态代码。这是该代码:
public class JsonHttpStatusResult : JsonResult
{
private readonly HttpStatusCode _httpStatus;
public JsonHttpStatusResult(object data, HttpStatusCode httpStatus)
{
Data = data;
_httpStatus = httpStatus;
}
public override void ExecuteResult(ControllerContext context)
{
context.RequestContext.HttpContext.Response.StatusCode = (int)_httpStatus;
JsonRequestBehavior = JsonRequestBehavior.AllowGet;
base.ExecuteResult(context);
}
}
在使用 IISExpress 进行本地测试时,这正如我所期望的那样工作 - 如果我返回 500 Http 状态代码以及一些 JSON,则响应仅包含 JSON。但是,当我将网站发布到我们拥有的 IIS 8.5 Web 服务器时(不幸的是,我们还没有任何正在运行的 IIS 10 - 我不认为这会产生影响?),它反而返回默认的 500 错误响应页面,而不是 JSON:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>500 - Internal server error.</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;}
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;}
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;}
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}
-->
</style>
</head>
<body>
<div id="header"><h1>Server Error</h1></div>
<div id="content">
<div class="content-container"><fieldset>
<h2>500 - Internal server error.</h2>
<h3>There is a problem with the resource you are looking for, and it cannot be displayed.</h3>
</fieldset></div>
</div>
</body>
</html>
所以这就是我所困惑的问题 - 如何让 IIS 返回我的自定义 500 JSON 错误结果,而不是默认的 500 页面?我环顾四周,看到一些帖子提到这些是需要的两行重要代码:
HttpContext.Response.Clear();
HttpContext.Response.TrySkipIisCustomErrors = true;
但是,我不知道在发送自定义错误响应时如何设置这些,因为一旦我返回 JSON 错误响应,如下例所示:
return new JsonHttpStatusResult(new
{
ResponseMessage = ex.Message
},
HttpStatusCode.InternalServerError);
然后我无法设置响应,因为调用返回后不再运行任何代码?一旦我的自定义 Json 结果类创建了响应,我是否可以通过某种方式挂钩响应,我看到了类似的东西通过这篇文章,但不幸的是它似乎没有解释我应该如何使用它?
值得一提的是,我尝试返回 JSON 错误响应的原因是因为这些操作是由前端的 Ajax 调用的,然后这些错误由前端的 javascript 处理/显示,这就是我为什么要这样做的原因。我试图传回的不仅仅是“500 内部服务器错误”消息。