【问题标题】:Url doesn't change using Server.Transfer within an HttpModule在 HttpModule 中使用 Server.Transfer 不会更改 URL
【发布时间】: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


【解决方案1】:

看起来Request.RawUrl 始终保留最初请求的值,即使在传输之后也是如此,但是还有其他属性,例如 Request.AppRelativeCurrentExecutionFilePathRequest.FilePath 确实显示了传输到 的 url ,所以我改用其中一个,我可以做我现在需要的。感谢所有提出建议的人。

【讨论】:

    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多