IIS 8.5覆盖自定义JSON错误响应,而是返回默认的500错误响应页面。如何获得IIS 8.5返回我的自定义错误?

时间:2020-08-07 12:16:02

标签: c# asp.net asp.net-mvc iis iis-8.5

我遇到了一个令人讨厌的问题,我认为这是由IIS 8.5引起的。使用我正在创建的Web应用程序,我创建了一个自定义JSON HttpStatusResult类(这是一个想法from this stackoverflow post),使我能够在500、400或其他类型的HTTP响应状态代码旁返回JSON。 。这是该代码:

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结果类创建了响应,是否可以通过某种方式将其挂接到响应中,我看到了类似的with this post,但不幸的是,它似乎并不能解释我应该如何做。用这个吗?

值得一提的是,我尝试返回JSON错误响应的原因是,这些操作是由前端的Ajax调用的,然后这些错误由前端的javascript处理/显示,为什么我尝试传递的不只是“ 500个内部服务器错误”消息。

1 个答案:

答案 0 :(得分:0)

然后,找到解决问题的方法,我要做的就是将其添加到system.webServer元素内的web.config中:

<httpErrors existingResponse="PassThrough"/>

不需要更改任何其他设置,也不需要最终修改响应。看来此设置会导致IIS在发生错误时将现有响应传递通过。