我没有太多运气找到这个... ...
我有一个ASP页面,使用查询字符串从其他地方的代码调用:
[domainpath]/FulfilmentReceipt.aspx?fulfilmentId=226F7486-3D30-439D-92BB-94972234A809
在Page_Load
中有一个Server.Transfer
调用应该将响应执行移动到另一个具有不同查询字符串的页面(下面的Format()
似乎工作正常BTW):
Server.Transfer(String.Format("confirmationReceipt.aspx?bId={0}&f={1}&print=true", basketId, franchiseeId)))
接下来是我不明白的一点。转移呼叫似乎被路由回第一页的 FulfilmentReceipt.aspx ,但是使用新的查询字符串。这会导致错误,因为现在缺少查询字符串的fulfilmentId
部分。为什么这不按预期调用confirmationReceipt
?
我可以通过调试进程确认confirmationReceipt
页面从未被调用,fulfilmentReceipt
被加载两次。 Global.asax 文件中根本没有代码,因此没有路由,confirmationReceipt
页面本身没有Redirect
或Transfer
来电,非常简单
此外,浏览器地址栏中呈现的错误页面显示新的查询字符串,但作为原始URL的一部分。我原以为所看到的网址不应因Server.Transfer
而改变。
有什么想法吗?
非常感谢。
更新
我没有取得任何实际进展,但遵循里希特霍芬的建议给出了各种结果。当呼叫来自浏览器时,使用Response.Redirect
代替Server.Transfer
DOES会提供所需的结果。但是,呼叫是由无法处理重定向响应的第三方库进行的。
使用Server.Transfer
选项试用preserveForm
没有任何区别。为了澄清,转移最终会调用FulfilmentReceipt.aspx?bId={0}&f={1}&print=true
。错误的页面,正确的查询字符串。
更新
我通过重构confirmationReceipt
页面来接受传递给fulfilmentReceipt
的查询字符串并将Server.Transfer
调用更改为只转移到confirmationReceipt
而未指定请求参数。使用原始查询字符串转移到正确的位置。
出于好奇,这个问题仍然存在。只是Server.Transfer
无法正确处理包含查询字符串的网址吗?
答案 0 :(得分:1)
最初发布为上面的更新,我通过重构confirmReceipt页面来接受传递给fulfillilmentReceipt的查询字符串并更改Server.Transfer调用以简单地转移到confirmationReceipt而不指定查询字符串来解决我的问题。使用原始查询字符串转移到正确的位置。
这并不理想,因为现在有些处理已经完成了两次(将查询字符串转换成更有用的东西),但它很有效,所以我很高兴。
答案 1 :(得分:0)
Server.Transfer和Response.Redirect经常混淆。如果要传递新的查询字符串值,则应使用Response.Redirect。
Server.Transfer更改IIS / ASP.NET正在处理的单个请求的行为。它在服务器上启动新请求,但对于最终用户,请求仍然是同一页面。你基本上把控制权交给了新的一页。您可以传递一个参数,一个布尔值,以保留表单值。但一般情况下,如果要更改查询字符串路径,大多数情况下应使用Response.Redirect,以便URL显示在用户的浏览器中(用户代理将接收302重定向而不是200 OK)。
“转接呼叫似乎已路由回FulfilmentReceipt.aspx”
听起来像confirmationReceipt.aspx可能有一个重定向回“FulfilmentReceipt.aspx”。但由于您未传递“True”,因此收据查询字符串ID将丢失。如果将'true'作为第二个参数传递给Server.Transfer,那么您的示例可能会有效。但是,如果是我的代码,那么最好的选择就是使用Response.Redirect更改它,并观察Fiddler或其他工具中的响应跟踪,以确切了解引擎盖下的内容。