核心解决方案
在ASP.NET中,通过配置web.config的<customErrors>和<httpErrors>节点,结合全局异常过滤器(Global Exception Filter)与状态码页面定制,可构建安全、友好的错误处理机制,以下为详细实现方案:

配置 web.config 实现基础错误重定向
场景:隐藏敏感堆栈信息,定向到友好错误页。
<system.web>
<customErrors mode="On" defaultRedirect="~/Error/General">
<error statusCode="404" redirect="~/Error/NotFound" />
<error statusCode="500" redirect="~/Error/InternalServer" />
</customErrors>
</system.web>
- mode:
On:始终启用自定义错误RemoteOnly:仅对远程客户端生效(生产环境推荐)
- 关键点:
- 需创建对应的Controller(如
ErrorController)和视图 - 支持传递原始错误路径:
Request.QueryString["aspxerrorpath"]
- 需创建对应的Controller(如
IIS托管场景的增强配置(ASP.NET Core / MVC 5+)
问题:customErrors仅处理.NET层异常,需补充IIS级错误拦截。
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" />
<error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" />
<error statusCode="500" path="/Error/InternalServer" responseMode="ExecuteURL" />
</httpErrors>
</system.webServer>
- existingResponse=”Replace”:强制覆盖IIS默认错误页
- responseMode=”ExecuteURL”:动态执行服务端路由(非静态文件重定向)
全局异常过滤器深度处理
场景:记录错误日志,动态返回JSON或视图。

// MVC 5 示例
public class GlobalExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
var ex = context.Exception;
Log.Error(ex, "全局异常"); // 使用NLog/Serilog记录
context.ExceptionHandled = true;
// API请求返回JSON
if (context.HttpContext.Request.IsApiRequest())
{
context.Result = new JsonResult(new { error = "操作失败" });
}
// 页面请求返回视图
else
{
context.Result = new ViewResult {
ViewName = "Error",
ViewData = new ViewDataDictionary(ex.Message)
};
}
}
}
注册位置:Global.asax 或 Startup.cs
// MVC 5
GlobalFilters.Filters.Add(new GlobalExceptionFilter());
// ASP.NET Core
services.AddControllersWithViews(options =>
{
options.Filters.Add<GlobalExceptionFilter>();
});
状态码页中间件(ASP.NET Core专属)
优势:更灵活的非异常HTTP错误处理(如404)
// Startup.Configure
app.UseStatusCodePagesWithReExecute("/Error/{0}"); // {0}自动替换为状态码
// ErrorController
public IActionResult Index(int statusCode)
{
return statusCode switch
{
404 => View("NotFound"),
500 => View("InternalServer"),
_ => View("General")
};
}
开发环境与生产环境差异化处理
安全准则:生产环境禁止暴露诊断信息

// ASP.NET Core 示例
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage(); // 显示详细错误
}
else
{
app.UseExceptionHandler("/Error/InternalServer"); // 生产环境友好页
app.UseHsts(); // 强制HTTPS
}
安全与用户体验最佳实践
- 禁止传递原始错误到客户端
// 错误页ViewModel中过滤敏感信息 public class ErrorViewModel { public string SafeMessage { get; set; } // 用户可见信息 // 不包含Exception对象或堆栈 } - 404页面优化
- 提供搜索框和常用链接
- 记录404路径用于修复死链
- 自动化监控
- 通过
GlobalExceptionFilter集成错误告警(如邮件/Slack)
- 通过
你的实战经验分享
遇到过高并发下的错误页性能问题吗? 我们曾通过静态化404/500页面(如生成HTML文件)降低服务器压力,QPS提升8倍,欢迎在评论区分享你的优化方案或踩坑经历!
疑问点探讨:
- 如何为Web API和MVC页面设计统一错误格式?
- 在Kubernetes集群中如何集中管理错误日志?
期待你的见解!
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/12163.html