C# 带有查询字符串的转接调用调用当前页而不是给定页

C# 带有查询字符串的转接调用调用当前页而不是给定页,c#,asp.net,C#,Asp.net,我没有太多的运气发现这件事 我有一个ASP页面,该页面通过查询字符串从其他地方的代码调用: [domainpath]/FulfilmentReceipt.aspx?fulfilmentId=226F7486-3D30-439D-92BB-94972234A809 在页面\u Load中有一个服务器.Transfer调用,该调用应将响应执行移动到另一个具有不同查询字符串的页面(下面的格式()似乎工作正常): 接下来是我不明白的地方。转账调用似乎被路由回第一页的fulfillmentreceive

我没有太多的运气发现这件事

我有一个ASP页面,该页面通过查询字符串从其他地方的代码调用:

[domainpath]/FulfilmentReceipt.aspx?fulfilmentId=226F7486-3D30-439D-92BB-94972234A809
页面\u Load
中有一个
服务器.Transfer
调用,该调用应将响应执行移动到另一个具有不同查询字符串的页面(下面的
格式()
似乎工作正常):

接下来是我不明白的地方。转账调用似乎被路由回第一页的fulfillmentreceive.aspx,但带有新的查询字符串。这会导致一个错误,因为查询字符串的
fulfillmentid
部分现在丢失。为什么不按预期调用
确认收据

我可以确认
confirmationreceive
页面从未通过调试调用到流程中,并且
fulfillmentreceive
已加载两次。Global.asax文件中根本没有代码,因此没有路由,而且
确认回执
页面本身没有
重定向
传输
调用,非常简单

此外,浏览器地址栏中呈现的错误页面显示新的查询字符串,但作为原始URL的一部分。我原以为看到的URL不应该因为
Server.Transfer
而改变

有什么想法吗

非常感谢

更新

我没有取得任何真正的进展,但按照里希霍芬的建议,我得到了一些结果。当调用来自浏览器时,使用
Response.Redirect
而不是
Server.Transfer
确实会给出所需的结果。但是调用是由无法处理重定向响应的第三方库发出的

使用
preserveForm
选项尝试
Server.Transfer
。为了澄清,传输最终调用了
fulfillmentreceive.aspx?bId={0}&f={1}&print=true
。错误的页面,正确的查询字符串

更多更新

通过重构
confirmationreceive
页面以接受传递给
fulfillmentreceive
的查询字符串,并更改
服务器。Transfer
调用以简单地转移到
confirmationreceive
,而不指定查询字符串,我已经解决了问题。然后,传输将使用原始查询字符串转到正确的位置


尽管出于好奇,这个问题仍然存在。仅仅是因为
Server.Transfer
无法正确处理包含查询字符串的URL吗?

Server.Transfer和Response.Redirect经常混淆。如果要传递新的查询字符串值,应使用Response.Redirect

Server.Transfer更改IIS/ASP.NET正在处理的单个请求的行为。它在服务器上启动一个新请求,但对于最终用户来说,该请求仍然是同一页。实际上,您正在将控制权移交给一个新页面。您可以传递一个参数,一个布尔值,以保留表单值。但一般来说,如果要更改查询字符串路径,大多数时候都应该使用Response.Redirect,以便URL显示在用户的浏览器中(用户代理将收到302重定向,而不是200 OK)

“转接呼叫似乎被路由回FulfillmentReceive.aspx”


听起来像confirmationreceive.aspx可能重定向回“fulfillmentreceive.aspx”。但由于您没有传递“True”,因此收据查询字符串id丢失。如果将“true”作为第二个参数传递给Server.Transfer,则示例可能会起作用。但是,如果是我的代码,最好的办法是用响应来改变它。重定向并在Fiddler或其他工具中观察响应轨迹,以查看引擎盖下到底发生了什么。

Server.Transfer和Response.Redirect经常混淆。如果要传递新的查询字符串值,应使用Response.Redirect

Server.Transfer更改IIS/ASP.NET正在处理的单个请求的行为。它在服务器上启动一个新请求,但对于最终用户来说,该请求仍然是同一页。实际上,您正在将控制权移交给一个新页面。您可以传递一个参数,一个布尔值,以保留表单值。但一般来说,如果要更改查询字符串路径,大多数时候都应该使用Response.Redirect,以便URL显示在用户的浏览器中(用户代理将收到302重定向,而不是200 OK)

“转接呼叫似乎被路由回FulfillmentReceive.aspx”


听起来像confirmationreceive.aspx可能重定向回“fulfillmentreceive.aspx”。但由于您没有传递“True”,因此收据查询字符串id丢失。如果将“true”作为第二个参数传递给Server.Transfer,则示例可能会起作用。然而,如果是我的代码,最好的办法就是用一个响应来改变它。重定向并在Fiddler或其他工具中观察响应轨迹,以查看引擎盖下到底发生了什么。

正如上面最初作为更新发布的一样,我通过重构ConfirmationReceivement页面来接受传递给的查询字符串,从而解决了我的问题FulfillmentReceive并更改服务器.Transfer调用,以简单地传输到确认收据,而不指定查询字符串。然后,传输将使用原始查询字符串转到正确的位置


这并不理想,因为某些处理现在要做两次(将查询字符串转换为更有用的内容)但是它工作得很好,所以我很高兴。

正如上面作为更新发布的一样,我通过重构ConfirmationReceive页面来接受传递给FulfillmentReceive的查询字符串并更改服务器来解决我的问题。Transfer call只需转移到ConfirmationReceive,而不指定查询字符串。然后,传输将使用原始查询字符串转到正确的位置

这并不理想,因为有些处理现在要做两次(将查询字符串转换为m)
Server.Transfer(String.Format("confirmationReceipt.aspx?bId={0}&f={1}&print=true", basketId, franchiseeId)))