VB.Net ASPX Server.Execute将PathInfo视为服务器路径的一部分



我有一个 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 修饰符结合使用。

所以我找到了解决这个问题的方法,尽管它有点复杂。

在我的实现IHttpHandlerMakePagePdfHandler.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)

最新更新