在 error.aspx 中设置 StatusCode 会触发另一个 Page_Load()

Ale*_*rMP 5 c# asp.net iis

在 中web.config,错误页面设置为/errorpages/error.aspx

<httpErrors errorMode="Custom" existingResponse="Replace" >
     <remove statusCode="500" subStatusCode="-1" />
     <error statusCode="500" path="/errorpages/error.aspx" responseMode="ExecuteURL" />
</httpErrors>
Run Code Online (Sandbox Code Playgroud)

但是当页面/errorpages/error.aspx在浏览器中加载时,状态代码为 200。这会导致各种问题,例如当我有一个位于错误 URL 中的 JS 文件时,我不会得到特定的错误,而是得到 JS 错误就像unexpected <(页面使用相同的逻辑404.aspx)。

所以,为了解决这个问题,在里面error.aspx,在Page_Load(),我设置

Response.StatusCode = 500;
Run Code Online (Sandbox Code Playgroud)

页面返回500状态码,可以在浏览器中观察到。

问题是,如果我在 中放置一个断点Page_Load()/errorpages/error.aspx它就会被击中两次。第一次进入StatusCodeis时200,它会将其设置为500,所以我怀疑 IIS 会尝试处理 from web.config,它会再次加载页面。再次StatusCode200,并且更改为500,但这一次它不会触发另一次执行。

这可能是由于 Global.asax.cs 中正在处理异常,处理后执行:

Server.TransferRequest("/errorpages/error.aspx?someExceptionInfo=" + exceptionInfo);
Run Code Online (Sandbox Code Playgroud)

所以这张图显示了我认为正在发生的事情: 错误工作流程

可以只设置一个状态代码而不是调用TransferRequest,并让 IIS 处理它,并通过 Session 传递异常信息。但我担心在某些时候它可能会导致某种重定向循环或生产服务器上的某些情况。

问题(其中之一):

  • 如何确保不会出现重定向循环?
  • 如何配置 IIS 以使错误页面返回状态代码而不实际写入Response.StatusCode = ***
  • 当我设置 时,如何阻止我的应用程序重复执行页面StatusCode