如何在ASP.Net中发布并重定向到外部URL?

38

ASP.NET服务器端控件将数据提交到自己的页面,而想要将用户重定向到外部页面并需要在该页面上进行提交(例如进行身份验证)时,这会带来不便。

HttpWebRequest非常适合您不希望重定向的情况,而JavaScript在某些情况下也可以使用,但如果您确实需要从服务器端代码获取数据进行提交,则可能会变得棘手。

那么,在ASP.NET代码后台中既能够将数据提交到外部URL又能够将用户重定向到结果的方法是什么呢?

6个回答

15

这是我今天解决这个问题的方法。我从C# Corner上的这篇文章开始,但发现示例虽然在技术上正确,但有些不完整。他说的一切都是对的,但我需要访问一些外部站点才能将其拼凑到我想要的样子。

并没有帮助的是,用户根本没有提交表单;他们是点击链接进入我们的支持中心,但为了将他们登录,必须向支持中心的网站进行http post请求。

这个解决方案使用 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 部分,当页面主体加载完成时,它会提交表单,然后将用户重定向回我的主页。这个奇妙的部分的原因是我在新窗口中启动外部网站,但不希望用户在刷新页面时重新提交隐藏的表单。此外,这个隐藏的表单会将页面下移几个像素,这让我很烦恼。

如果有更好的想法,我非常感兴趣。

Eric Sipple


7

我是从CodeProject中学习到这个示例的。

然后,我借鉴了saalon(上面)的方法,而不是将内容添加到页面中,我使用了Response.Write()。


5

我建议你使用HttpWebRequest类在代码后台中进行表单提交。以下是一个很好的帮助类来帮助你入门:

<链接>

从那里开始,你可以直接执行Response.Redirect操作,或者根据提交的结果来改变你的操作(例如如果出现错误,向用户显示错误信息等)。实际上,我认为你已经在问题中找到了答案 - 听起来像是需要进行post或redirect操作,但实际上它们都可以在代码后台中完成。


3

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

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

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

3
我通过呈现一个自动提交的表单(使用JavaScript),将其提交到所需的远程URL来完成此操作——在Web表单的postback中收集发帖所需的任何信息,然后构建用于远程发布的HTML并将其呈现回客户端。
我建立了一个实用类,其中包含了远程URL和表单的一组名称/值对。
跨页面发布将在您拥有所涉及的两个页面的情况下起作用,但如果您需要发布到另一个站点(例如PayPal),则不起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接