【发布时间】:2014-06-18 17:05:10
【问题描述】:
我有一个HttpModule,它可以清除BeginRequest 中的url 中的连字符,这样我就可以拥有一个名为MyFile.asp 的脚本文件,但是让它通过像/my-file.asp 这样的端点来调用。 (是的,它是经典 ASP,尚未迁移到 .NET。)
代码如下所示:
'if not an asp file, skip it
If Not Request.Path.EndsWith(".asp") Then Return
'if the physical file exists, bail out, to let that file service the request
If ("~" & Request.RawUrl).ToServerFileObject.Exists Then Return
'if a dehyphenated version of the file exists
If ("~" & Request.RawUrl.RemoveHyphens).ToServerFileObject.Exists Then
'transfer to that file
application.Server.TransferRequest("~" & Request.RawUrl.RemoveHyphens, True)
Return
End If
当我运行它并请求myfile.asp 时,代码会看到该文件存在于磁盘上,然后返回,IIS 使用它来为请求提供服务。当我请求my-file.asp 时,我期待它会看到该文件不存在,然后看到myfile.asp 确实存在于磁盘上,然后传输到它。
但是相反,这个处理程序只是不断地被调用,每次,Request.RawUrl 被设置为my-file.asp。就像传输正在工作,但没有更新请求,这对我来说没有任何意义。
【问题讨论】:
-
A server.transfer 不会更改 url 而是获取文件并将其返回到同一 url 下的浏览器。您需要执行 Response.Redirect。然而,由于这是经典的 asp,我不确定这里的细节。
-
传输不会结束当前请求;它说“停止处理这个,并处理新的 URL”,但客户端不知道发生了什么,仍然看到原始请求的 URL。
-
@Adam:我想要它这样做,但我希望它返回与请求的文件不同的文件。我不想
Redirect,因为我希望它对用户不可见。 -
@Cory:但这不是它正在做的事情。它正在传输,但文件名相同。
-
那么您是否尝试过在调试器中调试此代码?您应该能够在开头放置一个断点,并按照代码的逻辑和路径查看每个变量包含的内容。也许您的一种扩展方法没有按照您的想法进行。
标签: asp-classic server.transfer