1

我没有太多运气找到关于这个的很多信息……</p>

我有一个 ASP 页面,它是从其他地方的代码中调用的,带有一个查询字符串:

[domainpath]/FulfilmentReceipt.aspx?fulfilmentId=226F7486-3D30-439D-92BB-94972234A809

Page_Load有一个Server.Transfer调用应该将响应执行移动到具有不同查询字符串的另一个页面(Format()顺便说一句,下面似乎可以正常工作):

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 的一部分。我曾认为看到的 URL 不应该因为Server.Transfer.

有任何想法吗?

非常感谢。

更新

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

尝试Server.Transfer使用该preserveForm选项没有任何区别。为了澄清,转移最终调用FulfilmentReceipt.aspx?bId={0}&f={1}&print=true. 错误的页面,正确的查询字符串。

更多更新

我已经通过重构confirmationReceipt页面以接受传递给的查询字符串fulfilmentReceipt并将Server.Transfer调用更改为简单地转移到confirmationReceipt而不指定查询字符串来解决我的问题。传输比使用原始查询字符串转到正确的位置。

尽管出于好奇,这个问题仍然存在。只是Server.Transfer不能正确处理包含查询字符串的网址吗?

4

2 回答 2

1

正如最初作为上面的更新发布的那样,我通过重构confirmationReceipt 页面以接受传递给fulfilmentReceipt 的查询字符串并将Server.Transfer 调用更改为简单地传输到confirmationReceipt 而不指定查询字符串来解决我的问题。传输比使用原始查询字符串转到正确的位置。

这并不理想,因为一些处理现在完成了两次(将查询字符串转换为更有用的东西),但它可以工作,所以我很高兴。

于 2012-10-02T14:35:55.083 回答
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 或其他工具中的响应跟踪,以确切了解幕后情况。

于 2012-07-31T15:09:44.453 回答