You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在IIS托管的ASP.NET Core中配置<httpErrors>实现自定义错误响应

解决方案

1. 配置Web.config

需要同时配置customErrors和httpErrors,分场景处理不同错误:

1.1 应用正常运行时的错误处理

修改system.web和system.webServer节点:

<system.web>
  <customErrors mode="RemoteOnly" redirectMode="ResponseRewrite">
    <error statusCode="404" redirect="/Error/404" />
    <error statusCode="500" redirect="/Error/500" />
  </customErrors>
</system.web>
<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Auto">
    <remove statusCode="404" subStatusCode="-1" />
    <remove statusCode="500" subStatusCode="-1" />
    <error statusCode="404" path="/Error/404" responseMode="ExecuteURL" />
    <error statusCode="500" path="/Error/500" responseMode="ExecuteURL" />
  </httpErrors>
  <aspNetCore processPath="dotnet" arguments=".\YourApp.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
</system.webServer>
  • existingResponse="Auto":让IIS根据响应内容自主判断是否替换,配合后续中间件实现精准控制。
  • responseMode="ExecuteURL":直接返回错误页内容,避免重定向,保留原状态码。

1.2 应用无法启动时的错误处理

当ASP.NET Core应用无法启动时,Core中间件失效,需单独配置静态错误页:

<httpErrors errorMode="Custom" existingResponse="Auto">
  <!-- 保留其他错误配置 -->
  <error statusCode="500" path="/StaticErrors/500.html" responseMode="File" />
</httpErrors>

提前在站点根目录创建StaticErrors文件夹,放入静态的500.html页面。

2. 添加ASP.NET Core中间件控制响应透传

在Program.cs的请求管道中添加中间件,区分API与页面请求,控制IIS是否干预响应:

var app = builder.Build();

// 放置在路由、授权等中间件之前
app.Use(async (context, next) =>
{
    await next();

    if (context.Response.StatusCode >= 400)
    {
        // 根据实际业务调整API请求判断逻辑,比如路径前缀、请求头
        bool isApiRequest = context.Request.Path.StartsWithSegments("/api") 
                          || context.Request.Headers.Accept.Any(h => h.Contains("application/json"));

        if (isApiRequest)
        {
            // 通知IIS跳过自定义错误,透传API的JSON响应
            context.Features.Get<IISHttpFeature>()?.TrySkipIisCustomErrors = true;
            context.Response.Headers["X-Responded-JSON"] = "true";
        }
        // 非API请求,交由IIS返回自定义错误页
    }
});

// 后续中间件配置
app.UseRouting();
app.UseAuthorization();
app.MapControllers();

app.Run();
  • TrySkipIisCustomErrors:进程内托管模式下依然有效,并非仅适用于ASP.NET MVC,通过IISHttpFeature即可设置。

3. 场景验证

  • 访问无效URL(如/non-existent-page):返回自定义404页。
  • API请求不存在资源(如/api/users/9999):透传API返回的JSON格式404响应。
  • API参数错误(如/api/users?invalidParam):透传API返回的JSON格式400响应。
  • IIS无法启动应用:直接返回静态500.html页面。

内容的提问来源于stack exchange,提问作者Oleg Bevz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:53:21