我的项目中有代码,它将包含文本的URL作为查询字符串更改为数字以从数据库中获取数据。我正在检查页面加载中的查询字符串,如果它包含名称而不是数字,我将其映射到数字键。现在我必须再次执行页面生命周期。我有两个选择要么使用
Response.Redirect
但我不希望客户端浏览器中的URL发生变化,所以我选择了
Server.Transfer
我开始面临的问题是我有一个自定义的httpmodule,用于记录数据库中的URL。我意识到了
BeginRequest
后,http模块中的
没有触发
Server.Transfer
我的应用程序在
的情况下工作正常 Response.Redirect.
我不确定Server.Transfer是如何以及为何跳过我的HttpModule以及它是如何工作的?
答案 0 :(得分:1)
Server.Transfer
是一个完全服务器端机制 - 它根据Page
文件的路径实例化新的.aspx
类,并在那里传输执行(包括构建的所有状态信息)在对象中)。没有新的请求,没有任何东西再次通过管道(因此HttpModules不会重新执行),因为托管部分感兴趣这仍然是相同的请求 - 响应刚刚从不同的页面创建而不是它是最初的计划。
Response.Redirect
属于标准HTTP机制。在服务器端,它抛出异常以中断当前执行管道并返回3xx状态代码。然后,浏览器在新URL下发出对资源的新请求。这两个请求都通过服务器端的完整管道。
因此,您的问题的答案归结为HttpModules
正在为每个即将发出的请求执行,但在Server.Transfer
的情况下,没有新的请求。