【问题标题】:Why paypal Redirect is executed after Page_Load?为什么在 Page_Load 之后执行 paypal Redirect?
【发布时间】:2015-05-11 05:36:26
【问题描述】:

亲爱的贝宝,

我想知道为什么调用Response.AppendHeader 时“返回重定向网址”页面无法加载。你看,我试图在用户在 paypal 的页面上付款后自动下载文件,所以我将以下代码放在我的 Page_Load 上

If Not IsNothing(Request.QueryString("paymentId")) Then
            Dim paypalUtils As New PayPalUtils
            paypalUtils.ProcessPayPalResponse(Request.QueryString("paymentId").ToString(), Request.QueryString("PayerID").ToString())
            TransmitFile()
        End If

我的TransmitFile 实现很简单

Protected Sub TransmitFile()
    Response.ContentType = "application/sla"
    Response.AppendHeader("Content-Disposition", "attachment; filename=" & Path.GetFileNameWithoutExtension(hidFileName.Value) & ".stl")
    Response.TransmitFile(Sistema.SavePath & Path.GetFileNameWithoutExtension(hidFileName.Value) & ".stl")
    Response.End()
End Sub

问题是,以某种方式调用Response.AppendHeader 或以下任何行会阻止贝宝正确重定向到我在 API 上指定的正确 url。

如果我在 Page_Load 上评论 TransmitFile,一切都会按预期进行(Paypal 会将我重定向到我的网站)。如果没有,我成功地自动下载文件,但我卡在这个页面上

我做错了什么?

【问题讨论】:

  • 如果我正确理解您的代码,您是从 PayPal 重定向传输 Response 中的文件吗?或者您的paypalUtils.ProcessPayPalResponse(...) 调用是否完成了收到的响应并在调用TransmitFile() 之前重定向到您应用中的另一个页面?
  • 是的。我正在从贝宝的重定向中传输Response 中的文件。paypalUtils.ProcessPayPalResponse(...) 唯一要做的就是执行付款
  • 在这种情况下,当您设置 Response.TransmitFile() 时,您的应用程序会在您的应用程序处理传入请求时尝试将文件作为响应发送回 PayPal。它停留在“正在加载”的原因可能是因为 PayPal 网站上没有设置任何内容来响应这种类型的响应。您需要一个Response.Redirect() 来响应文件的内部页面,以便买家获取文件。
  • 好的,我创建了一个名为 PaymentProcessor.aspx 的页面,该页面仅将 Response.Redirect() 转换为 Default.asp(具有 Response.TransmitFile() 的页面)。我将 paypal 的返回重定向 URL 更改为 PaymentProcessor.aspx,然后我'我仍然得到同样的错误。贝宝永远加载页面。我调试并且 PaymentProcessor.aspx Page_Load 执行得很好。它重定向到 Default.aspx 没有问题,但是。我再也看不到任何页面(除了贝宝加载的东西)
  • 经过更多测试,我意识到我之前的评论可能并不完全正确。 :P 该文件看起来确实可以下载;但是,问题在于下载后重定向到页面。关键实际上是首先在页面的<head> 部分显示带有<meta http-equiv="refresh" ... /> 标记的页面,然后刷新页面并启动下载。我会看看我是否可以为你整理一个更详细的答案。

标签: .net vb.net redirect paypal paypal-sandbox


【解决方案1】:

您的代码实际上是正确的,下载的传输方式是正确的 - 正是 .NET 处理文件传输、重定向和页面显示的方式导致了混乱。

您有多种选择,具体取决于您希望网站上的体验如何。

  1. 在显示重定向页面时使用 AJAX 和 iFrame 异步下载文件。 See this StackOverflow question 以获得更多答案。 walkthrough on Encosia 的链接非常详细,应该可以提供良好的用户体验。

  2. 重定向到设置为自动刷新并在自动刷新时下载的页面。这绕过了使用Response.TransmitFile()Response.End() 使得无法然后 使用Response.Redirect() 的.NET 限制。要进行自动刷新,请将以下行添加到 HTML 源代码的 <head> 部分:

    <meta http-equiv="refresh" content="1; url=<%= this.RedirectUrl %>">
    

    this.RedirectUrl 在页面后面的代码中引用了一个属性,该属性设置为您希望重定向到的任何位置。处理完重定向之后,就是您运行代码以发送文件时。

我能够测试 #2 并使其正常工作。我敢肯定还有更多的可能性,但希望这会让事情对你有用。

【讨论】:

  • 好的,让我们关注第二种解决方案(您测试的那个)。正如你所说,我使用了这条线&lt;meta http-equiv="refresh" content="1; url=http://localhost:58109/Default.aspx"&gt;,我可以让paypal将我重定向到PaymentProcessor.aspx,问题是当我被重定向到Default.aspxDefault.aspx.vbPage_Load被执行并且文件是正确的下载了但 Default.aspx 永远不会重新渲染,浏览器 Url 仍然播种PaymentProcessor.aspx 有什么问题?
  • 这是您需要尝试显示哪些页面以使其完全按照您想要的方式工作的地方。 &lt;meta&gt; 标签中的 url 本质上是传递文件的页面,所以我不会依赖它作为用户的登录页面。 AJAX 解决方案可能是一个更好的解决方案,因为您可能会在文件交付后编写重定向脚本,但不幸的是,我不太熟悉这样做。
猜你喜欢
  • 1970-01-01
  • 2014-12-22
  • 2018-11-14
  • 1970-01-01
  • 2019-10-03
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
相关资源
最近更新 更多