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

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

我遇到了一个恼人的问题,我认为这是由 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/

相关文章:

c# - 如何将 DataTable 转换为 List<object>?

c# - aspx页面中的三元运算符

c# - 在 C# 中存储使用 MD5CryptoServiceProvider 散列的密码是否安全?

asp.net - Base64 字符串图像数据在 IE 中显示?

asp.net-mvc - 如何与 Entity Framework 创建外键关系?

javascript - 是否可以使用 C# 从使用 Javascript 动态添加的行中获取值?

c# - 向 ASP 控件添加自定义事件

c# - 寻找一种在运行时操作 .Net CIL 的方法

asp.net-mvc - 在我自己的 OWIN 中间件中使用 Ninject DI

c# - 从部分 View 获取ApplicationUser