我遇到了一个恼人的问题,我认为这是由 IIS 8.5 引起的。通过我正在创建的 Web 应用程序,我创建了一个自定义 JSON HttpStatusResult 类(这是一个想法 from this stackoverflow post ),它使我能够返回 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 结果类创建了响应,我是否可以通过某种方式 Hook 响应,我看到了类似的东西 with this post ,但不幸的是它似乎没有解释我应该如何使用它?
值得一提的是,我尝试返回 JSON 错误响应的原因是因为这些操作是由 Ajax 从前端调用的,然后这些错误由前端的 javascript 处理/显示,我为什么我试图传回的不仅仅是“500 内部服务器错误”消息。
最佳答案
好吧,找到了解决我的问题的方法,在我的例子中,我所要做的就是将其添加到 system.webServer
元素中的 web.config 中:
<httpErrors existingResponse="PassThrough"/>
最终不需要更改任何其他设置或修改响应。看来此设置会导致 IIS 在出现错误时传递现有响应。
关于c# - IIS 8.5 覆盖自定义 JSON 错误响应,而是返回默认的 500 错误响应页面。如何让 IIS 8.5 返回我的自定义错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63301670/