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

时间:2008-08-07 19:13:05

标签: javascript c# asp.net forms postback

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

如果您不想重定向,HttpWebRequest效果很好,并且在某些情况下JavaScript很好,但如果您确实需要服务器端代码来为帖子获取数据,则可能会变得棘手

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

6 个答案:

答案 0 :(得分:11)

今天我解决了这个问题。我从C#Corner的this article开始,但发现这个例子 - 虽然技术上合理 - 但有点不完整。他说的一切都是对的,但是我需要打几个外部网站把它拼凑起来,按照我想要的方式工作。

用户在技术上根本没有提交表格没有帮助;他们点击了一个链接转到我们的支持中心,但要将它们记录在http帖子中,必须将其发送到支持中心的网站。

此解决方案涉及使用HttpContext.Current.Response.Write()为表单编写数据,然后在

上使用一些Javascript
<body onload=""> 

将表单提交到正确的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

答案 1 :(得分:5)

我从CodeProject

开始使用此示例

然后我没有添加到页面,而是从saalon(上面)借来并做了一个Response.Write()。

答案 2 :(得分:3)

我会使用HttpWebRequest类在您的代码中执行表单发布。这是一个很好的帮助类,可以帮助你开始:

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

从那里,你可以做一个Response.Redirect,或者你可能需要根据帖子的结果改变你的动作(如果有错误,显示给用户或其他什么)。我认为你的问题中已经有了答案,说实话 - 听起来你认为这是一个帖子或重定向,而实际上你可以从你的代码背后做到。

答案 3 :(得分:2)

如果您使用的是ASP.NET 2.0,则可以使用cross-page posting

执行此操作

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

答案 4 :(得分:2)

我通过将自动发布(使用JavaScript)的表单呈现到所需的远程URL来完成此操作 - 在Web表单的回发中收集帖子所需的任何信息,然后为远程发布表单构建HTML将它渲染回客户端。

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

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

答案 5 :(得分:2)

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

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