PAYATHON 2026

如何从外部测试 ASP.NET customErrors 错误页?

数据小许

结论

外部请求本身不会让 ASP.NET 任意抛出异常。要从 QA 客户端触发 customErrors,应用需要提供一个外部可访问的测试故障点,例如 QA 环境专用页面,或详情流程中的故障注入开关。故障点必须在 ASP.NET 请求处理中产生未处理异常或 HTTP 500,且异常未被应用自己的错误处理代码捕获。

当前配置将远程请求的默认错误页设为 /Error/Error.aspx,并将 HTTP 500 映射到 /Error/ServerError.html。在 mode="RemoteOnly" 下,本机请求通常会显示详细错误,因此应从远程 QA 客户端发起测试。

添加仅限 QA 的测试入口

可以在 QA 部署中添加一个仅供测试的页面,例如 ThrowTestError.aspx。页面代码故意抛出未处理异常:

protected void Page_Load(object sender, EventArgs e)
{
    throw new HttpException(500, "QA test exception");
}

从 QA 客户端请求该页面,例如:

https://qa.example.com/ThrowTestError.aspx

请求进入 ASP.NET 后会抛出异常,可用于验证 500 错误页映射是否按预期工作。此页面应只部署到 QA 环境,或通过访问控制限制为 QA 人员使用;不要在生产环境保留可公开触发异常的入口。

验证交易后的特定流程

独立测试页面只能验证 ASP.NET 的错误页配置,无法覆盖交易成功后、详情页显示前的业务路径。要测试这段流程,可在 QA 环境的相应位置加入受控故障点,例如在交易获批后、读取或构造详情页数据时,根据 QA 专用配置触发异常。这样可以验证实际的错误处理路径。

此时交易可能已经成功。测试时应避免通过刷新或重试重复提交交易,并确认异常处理不会把已成功的交易误判为失败。也可以让故障点模拟详情数据读取失败,避免再次提交交易。

检查错误是否被应用捕获

customErrors 处理的是 ASP.NET 请求中的未处理错误。如果异常被 HandleProcessingError() 或其他 try/catch 捕获,应用就会继续执行自己的处理逻辑,ASP.NET 通常不会接管并显示 customErrors 页面。根据描述,流程会调用 HandleProcessingError(),并在交易不成功时显示 Error.aspx 的 StaticError 面板。这与 ASP.NET 根据 HTTP 500 映射错误页,是两条不同的处理路径。

测试时应先确认故障点抛出的异常是否到达 ASP.NET 错误处理管线,以及最终响应是否为 HTTP 500。如果应用捕获异常并自行显示面板,应测试相应的业务处理结果。要验证 customErrors,则必须确保异常未被捕获。

注意事项

  • redirectMode="ResponseRewrite" 会在服务器端重写错误响应,不会要求浏览器再次跳转;浏览器地址栏可能仍显示原请求地址。
  • 从本机测试时,RemoteOnly 可能会显示详细错误,与远程 QA 用户看到的内容不同。
  • customErrors 只负责呈现 ASP.NET 错误响应,不能代替应用对已提交交易的状态核对和幂等处理。

备注:内容仅供参考。