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

时间:2016-01-25 21:00:15

标签: 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>

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

所以,要解决这个问题,在error.aspx内,Page_Load(),我设置

Response.StatusCode = 500;

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

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

这可能是因为在Global.asax.cs中处理异常这一事实,在处理之后,执行此操作:

Server.TransferRequest("/errorpages/error.aspx?someExceptionInfo=" + exceptionInfo);

所以这个图表显示了我的想法: error workflow

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

问题(其中一个):

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

0 个答案:

没有答案