我有一个 aspx 文件Content.aspx
.当您访问content.aspx/FAQ
时,它会使用 Request.PathInfo
中的值来确定要从数据库中加载/显示的内容(在本例中为 FAQ 数据(。
这非常有效。
直到你把/Content.aspx/FAQ
传给Server.Execute()
.然后,它会引发异常,指出执行页面的处理程序时发生错误。当我深入研究 InnerException 时,我看到消息The file '/Content.aspx/FAQ' does not exist.
这让我相信Execute()
没有正确处理 PathInfo,而是被视为磁盘上路径的实际部分。
有没有办法让Execute()
方法正确处理这些 PathInfo 参数?不幸的是,现在改变这个应用程序这样做的方式为时已晚,因为这种"参数传递"用于此目的而不是传统的查询字符串,而查询字符串主要用于更复杂的参数或与 PathInfo 修饰符结合使用。
所以我找到了解决这个问题的方法,尽管它有点复杂。
在我的实现IHttpHandler
的MakePagePdfHandler.vb
中(不确定这有多重要,所以为了清楚起见,包括它(,我检查路径是否存在,如果不存在,我知道附加了一个PathInfo
部分。从那里,我可以重定向回我的处理程序,并将PathInfo
附加到处理程序,然后我们可以再次检查File.Exists()
并将请求的PathInfo
与我们尝试Server.Execute()
的 URI 中检测到的路径信息进行比较,如果它们匹配,则从要执行的 URI 中删除路径信息,手柄上的路径信息将"落空"或"涓滴"为如果它像往常一样存在。
Dim pathInfo as String
If Not File.Exists(Context.Server.MapPath(path)) Then
Dim parts = link.Split("/") ' link contains the URI to Execute
pathInfo = "/" + parts(parts.length - 1)
If context.Request.PathInfo <> pathInfo Then
context.Response.Redirect(String.Format("{0}{1}?{2}", context.Request.Path, pathInfo, context.Request.QueryString))
Exit Sub
End If
End If
If pathInfo IsNot Nothing Then
link = link.replace(pathInfo, "")
End If
context.Server.Execute(link, strWriter)