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