如何从 ASP.Net 发布然后重定向到外部 URL?

Posted

技术标签:

【中文标题】如何从 ASP.Net 发布然后重定向到外部 URL?【英文标题】:How Do I Post and then redirect to an external URL from ASP.Net? 【发布时间】:2010-09-05 12:47:01 【问题描述】:

ASP.NET 服务器端控件回发到自己的页面。这使得您想要将用户重定向到外部页面,但由于某种原因(例如,用于身份验证)需要发布到该页面的情况会很痛苦。

如果您不想重定向,HttpWebRequest 可以很好地工作,并且 javascript 在某些情况下很好,但如果您确实需要服务器端代码来为帖子收集数据,则可能会变得棘手。

那么,您如何发布到外部 URL 并将用户重定向到 ASP.NET 代码隐藏代码的结果?

【问题讨论】:

【参考方案1】:

这就是我今天解决这个问题的方法。我从 C# Corner 上的this article 开始,但发现这个例子——虽然从技术上讲是合理的——有点不完整。他所说的一切都是正确的,但我需要访问几个外部站点才能将其拼凑起来才能完全按照我的意愿工作。

从技术上讲,用户根本没有提交表单并没有帮助;他们点击了一个链接来访问我们的支持中心,但要让他们登录到支持中心的网站上的 http 帖子。

此解决方案涉及使用HttpContext.Current.Response.Write() 为表单写入数据,然后在<body onload=""> 方法上使用一点Javascript 将表单提交到正确的URL。

当用户点击支持中心链接时,调用以下方法写入响应并重定向用户:

public static void PassthroughAuthentication()


    System.Web.HttpContext.Current.Response.Write("<body 
    onload=document.forms[0].submit();window.location=\"Home.aspx\";>");

    System.Web.HttpContext.Current.Response.Write("<form name=\"Form\" 
    target=_blank method=post 
    action=\"https://external-url.com/security.asp\">");

    System.Web.HttpContext.Current.Response.Write(string.Format("<input 
       type=hidden name=\"cFName\" value=\"0\">", "Username"));

    System.Web.HttpContext.Current.Response.Write("</form>");
    System.Web.HttpContext.Current.Response.Write("</body>");

此方法的关键在于 Javascript 的 onload 位,当页面主体加载时,它会提交表单,然后将用户重定向回我自己的主页。那一点不祥的原因是我在新窗口中启动外部站点,但不希望用户在刷新页面时重新提交隐藏的表单。再加上隐藏的表单将页面向下推了几个像素,这让我很紧张。

我会对任何人对此提出的更简洁的想法非常感兴趣。

埃里克·斯普尔

【讨论】:

【参考方案2】:

我从CodeProject开始这个例子

然后我没有添加到页面中,而是从 saalon(上图)借用并执行了 Response.Write()。

【讨论】:

【参考方案3】:

我会使用 HttpWebRequest 类在您的代码中进行表单发布。这是一个很好的帮助类来帮助您入门:

http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

从那里,您可以执行 Response.Redirect,或者您可能需要根据帖子的结果改变您的操作(如果有错误,将其显示给用户或其他)。老实说,我认为您已经在问题中找到了答案 - 听起来您认为这是一个帖子或重定向,而实际上您可以从后面的代码中完成它们。

【讨论】:

【参考方案4】:

我通过呈现一个自动发布(使用 JavaScript)到所需远程 URL 的表单来做到这一点 - 在 Web 表单的回发中收集发布所需的任何信息,然后为远程发布表单构建 html 和将其渲染回客户端。

我为此构建了一个实用程序类,其中包含远程 URL 和表单的名称/值对集合。

如果您拥有所涉及的两个页面,跨页发布将起作用,但如果您需要发布到另一个网站(例如 PayPal),则不会。

【讨论】:

【参考方案5】:

如果您使用的是 ASP.NET 2.0,则可以使用 cross-page posting 来执行此操作。

编辑:我错过了您询问外部页面的事实。为此,我认为您需要让您的 ASP.NET 页面生成一个 HTML 表单,其操作设置为远程 URL,方法设置为 POST。 (使用跨页面发布,这甚至可以是一个没有 UI 的不同页面,只有隐藏的表单元素。)然后添加一些 javascript 以在客户端收到回发结果后立即提交表单。

【讨论】:

【参考方案6】:

我需要在同一个窗口中打开,处理原始页面中可能出现的框架问题,然后在后面的代码中重定向到外部站点:

Private Sub ExternalRedirector(ByVal externalUrl As String)
    Dim clientRedirectName As String = "ClientExternalRedirect"
    Dim externalRedirectJS As New StringBuilder()

    If Not String.IsNullOrEmpty(externalUrl) Then
        If Not Page.ClientScript.IsStartupScriptRegistered(clientRedirectName) Then
            externalRedirectJS.Append("function CheckWindow() ")
            externalRedirectJS.Append("   if (window.top != window) ")
            externalRedirectJS.Append("       window.top.location = '")
            externalRedirectJS.Append(externalUrl)
            externalRedirectJS.Append("';")
            externalRedirectJS.Append("       return false;")
            externalRedirectJS.Append("   ")
            externalRedirectJS.Append("   else ")
            externalRedirectJS.Append("   window.location = '")
            externalRedirectJS.Append(externalUrl)
            externalRedirectJS.Append("';")
            externalRedirectJS.Append("   ")
            externalRedirectJS.Append("")
            externalRedirectJS.Append("CheckWindow();")

            Page.ClientScript.RegisterStartupScript(Page.GetType(), clientRedirectName, externalRedirectJS.ToString(), True)
        End If
    End If
End Sub

【讨论】:

以上是关于如何从 ASP.Net 发布然后重定向到外部 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如果会话过期,如何自动重定向? ASP.Net(从 SessionTimeout.aspx 到 Timeout.aspx)

如何将 MVC5 RedirectResult () 重定向到 Asp.net 中的整页?

asp.net c#从http重定向到https

从 asp.net web api 发布操作重定向

asp.net c# - 设置会话然后通过 global.asax 重定向用户

未经授权时如何将用户重定向到 ASP.NET 页面?