Server.Transfer调用查询字符串调用当前页面而不是给定页面

时间:2012-07-31 14:36:46

标签: c# asp.net

我没有太多运气找到这个... ...

我有一个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页面本身没有RedirectTransfer来电,非常简单

此外,浏览器地址栏中呈现的错误页面显示新的查询字符串,但作为原始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无法正确处理包含查询字符串的网址吗?

2 个答案:

答案 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或其他工具中的响应跟踪,以确切了解引擎盖下的内容。