如何从 ASP.Net 发布然后重定向到外部 URL?
-
08-06-2019 - |
题
ASP.NET 服务器端控件回发到自己的页面。这使得您想要将用户重定向到外部页面,但由于某种原因(例如为了身份验证)需要发布到该页面的情况变得很痛苦。
一个 HttpWebRequest
如果您不想重定向,那么效果很好,并且 JavaScript 在某些情况下也很好,但如果您确实需要服务器端代码来将数据集中在一起以供发布,则可能会变得棘手。
那么如何发布到外部 URL 并将用户重定向到 ASP.NET 代码隐藏代码的结果呢?
解决方案
今天我就解决了这个问题。我从 本文 在 C# Corner 上,但发现该示例虽然技术上合理,但有点不完整。他说的一切都是对的,但我需要访问一些外部网站才能将其拼凑在一起,才能完全按照我想要的方式工作。
从技术上来说,用户根本没有提交表单,这并没有什么帮助。他们点击链接进入我们的支持中心,但要将其登录到 http 帖子中,必须访问支持中心的网站。
该解决方案涉及使用 HttpContext.Current.Response.Write() 为表单写入数据,然后在
<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 位,当页面正文加载时,它会提交表单,然后将用户重定向回我自己的主页。出现这种胡言乱语的原因是我在新窗口中启动外部站点,但不希望用户在刷新页面时重新提交隐藏的表单。另外,隐藏的表格将页面向下推了几个像素,这让我很紧张。
我对任何人对此有更清晰的想法非常感兴趣。
埃里克·西普尔
其他提示
我从这个例子开始 代码项目
然后,我没有添加到页面,而是从 saalon(上面)借用并执行了 Response.Write()。
我将使用 HttpWebRequest 类在您的代码后面执行表单发布。这是一个很好的帮助类,可以帮助您入门:
http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx
从那里,您可以执行 Response.Redirect,或者您可能需要根据帖子的结果改变您的操作(如果有错误,将其显示给用户或其他)。老实说,我认为您已经在问题中得到了答案 - 听起来您认为这是一个帖子或重定向,但实际上您可以从后面的代码中完成这两个操作。
我通过渲染一个自动发布(使用 JavaScript)到所需远程 URL 的表单来完成此操作 - 在 Web 表单的回发中收集发布所需的任何信息,然后为远程发布表单构建 HTML 并将其渲染回来给客户。
我为此构建了一个实用程序类,其中包含远程 URL 和表单的名称/值对的集合。
如果您拥有所涉及的两个页面,则跨页面发布将起作用,但如果您需要发布到另一个网站(例如 PayPal),则跨页面发布将不起作用。
如果您使用的是 ASP.NET 2.0,则可以使用以下命令执行此操作 跨页面发布.
编辑:我错过了您正在询问的事实 外部的 页。为此,我认为您需要让 ASP.NET 页面生成一个 HTML 表单,其操作设置为远程 URL,方法设置为 POST。(使用跨页面发布,这甚至可能是一个没有 UI、只有隐藏表单元素的不同页面。)然后添加一些 javascript,以便在客户端收到回发结果后立即提交表单。
我需要在同一窗口中打开,处理原始页面中可能存在的框架问题,然后在代码隐藏中重定向到外部站点:
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