使用Server.Transfer时不调用自定义HttpModule

时间:2013-11-20 07:26:35

标签: asp.net

我的项目中有代码,它将包含文本的URL作为查询字符串更改为数字以从数据库中获取数据。我正在检查页面加载中的查询字符串,如果它包含名称而不是数字,我将其映射到数字键。现在我必须再次执行页面生命周期。我有两个选择要么使用

        Response.Redirect 

但我不希望客户端浏览器中的URL发生变化,所以我选择了

        Server.Transfer

我开始面临的问题是我有一个自定义的httpmodule,用于记录数据库中的URL。我意识到了

         BeginRequest

后,http模块中的

没有触发

        Server.Transfer

我的应用程序在

的情况下工作正常
       Response.Redirect.

我不确定Server.Transfer是如何以及为何跳过我的HttpModule以及它是如何工作的?

1 个答案:

答案 0 :(得分:1)

Server.Transfer是一个完全服务器端机制 - 它根据Page文件的路径实例化新的.aspx类,并在那里传输执行(包括构建的所有状态信息)在对象中)。没有新的请求,没有任何东西再次通过管道(因此HttpModules不会重新执行),因为托管部分感兴趣这仍然是相同的请求 - 响应刚刚从不同的页面创建而不是它是最初的计划。

Response.Redirect属于标准HTTP机制。在服务器端,它抛出异常以中断当前执行管道并返回3xx状态代码。然后,浏览器在新URL下发出对资源的新请求。这两个请求都通过服务器端的完整管道。

因此,您的问题的答案归结为HttpModules正在为每个即将发出的请求执行,但在Server.Transfer的情况下,没有新的请求。