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

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

如果你不想重定向, HttpWebRequest工作得很好,并且在某些情况下JavaScript很好,但是如果你确实需要服务器端代码来为post获取数据,那么它会变得棘手。

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

这是我今天解决了这个问题。 我从这篇关于C#Corner的文章开始,但发现这个例子 – 虽然技术上合理 – 但有点不完整。 他说的一切都是正确的,但我需要打几个外部网站把它拼凑起来,完全按照我的意愿工作。

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

这个解决方案涉及使用HttpContext.Current.Response.Write()来编写表单的数据,然后使用一些Javascript

  

将表单提交到正确的URL的方法。

当用户单击“支持中心”链接时,将调用以下方法来编写响应并重定向用户:

 public static void PassthroughAuthentication() { System.Web.HttpContext.Current.Response.Write(""); System.Web.HttpContext.Current.Response.Write("
"); System.Web.HttpContext.Current.Response.Write(string.Format("", "Username")); System.Web.HttpContext.Current.Response.Write("
"); System.Web.HttpContext.Current.Response.Write(""); }

这个方法的关键在于Javascript的onload位,当页面正文加载时,提交表单,然后将用户重定向回我自己的主页。 这一点不足的原因是我在新窗口中启动了外部网站,但是如果他们刷新页面,则不希望用户重新提交隐藏的表单。 再加上那个隐藏的forms将页面向下推了几个像素,让我神经紧张。

我会对任何人在这个问题上有任何清洁的想法感兴趣。

Eric Sipple

我从CodeProject开始这个例子

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

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

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

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

我通过渲染一个自动发布(使用JavaScript)到所需远程URL的表单来完成此操作 – 在Web表单的回发中收集post所需的任何信息,然后为远程发布表单构建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