【问题标题】:How to POST Data to another web application (cross domain)如何将数据发布到另一个 Web 应用程序(跨域)
【发布时间】:2011-01-07 16:12:08
【问题描述】:

请考虑以下场景,

有两个 Web 应用程序 App1 和 App2。用户将通过表单在 App1 上提交他的信息。单击 App1 上的特定按钮/链接时,应将相同的数据发布到 App2 上的页面,并且用户也应重定向到 App2 上的同一页面。

我需要一些帮助来找出实现此功能的最佳方法。

我已经尝试过的方法之一是在运行时创建一个临时 HTML 表单,将表单的 action 属性设置为 App2 Page,并使用 javascript submit 获取表单。然后可以使用 response.form 对象在 App2 页面上获取数据。

这种方法效果很好,但我仍然想知道是否有其他方法可以实现所需的功能。

如果您能提供一些关于使用 RESTful Web 服务来实现这一点的见解,或者使用一些 HttpModule 在 App1 拦截请求并修改对 app2 的重定向响应或您可能认为适合该目的的任何其他方法,我真的很感激.

编辑: 使用查询字符串不是我的选择。

【问题讨论】:

  • 能否简单介绍一下App1和App2的用途?现在听起来有点像,例如注册成为 Stackoverflow 或 Serverfault 的成员,但在填写注册表之前不选择特定论坛,这对我来说似乎很奇怪......我想如果你描述了你从功能的角度来尝试完成,为您提供优质的解决方案建议会更容易。
  • 为了解释练习的目的,让我们以 Stackoverflow 和 ServerFault 本身为例。我想要实现的是,如果用户已注册 StackOverFlow,则用户数据将存储在网站上。但是现在,如果用户也决定加入 ServerFault,他们只需要点击一个链接,上面写着“使用来自 StackOverflow 的数据”,然后砰!他们的 ServerFault 配置文件填充了与之前在 StackOverFlow 中输入的数据相同的数据。
  • 正如我之前提到的,我通过在运行时创建一个临时 HTML 表单并使用 javascript 发布来实现这一点,但我只是想看看还有哪些其他选项可以实现它..感谢您的帮助:)

标签: c# javascript asp.net post cross-domain


【解决方案1】:

我已经构建了类似于您所描述的内容,并且我发现使用 <form> 标记 POST 到 app2 是最可靠的方式......基本上,您发现效果很好的方式。

【讨论】:

  • 对不起,我无法理解您的方法.. 使用标签发布?能否请您详细说明...?
  • 哈哈,对不起,我的 HTML 代码正在被解析!我已经反引号了。
【解决方案2】:

如果您已经致力于使用 javascript,那么为什么不发布 ajax 帖子,并根据响应更改 window.location?

【讨论】:

  • Ajax 帖子可以与在 app2 上侦听的 Web 服务一起使用 .. 但该服务必须以某种方式或其他方式保存数据.. 我不确定这会如何发生.. 做您对如何使用 web 服务在 App2 上存储数据有一些建议,可以在浏览器从 app1 重定向后打开页面时使用?
【解决方案3】:

您可以使用 HttpServerUtility.Transfer 这将保留您的表单内容并将用户转移到新页面。

http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.transfer.aspx

【讨论】:

  • 我认为,Server.Transfer 可以在同一个应用程序中工作,而且无需实际发布数据。你有一些代码示例来说明你的建议吗?
【解决方案4】:

如果 App2 驻留在不同的域中,通常最好创建自己的提交界面,并让该界面处理从 App1 到 App2 的发布。

(Browser) -> Submits form to App1 -> 
    (App1) -> validate input
           -> stores local info
           -> creates an HttpRequest/POST object
           -> posts to App2
      (App2) -> handles the post
      <- returns the response
    -> confirms the results of App2
  <- returns the results to the browser.

本质上,您希望尽可能控制来自您的应用程序域的请求并将其代理到任何外部接口。

【讨论】:

    【解决方案5】:

    我需要通过提要聚合和从不同域的网页内容构建 rss 提要来做类似的事情。

    用户获取 app1 页面,填写详细信息并在服务器上提交 app1 我有一个看起来像这样的方法...

    HTMLDocument FetchURL( string url )
    {
        WebClient wc = new WebClient();
        string remoteContent = wc.DownloadString(url);
        // mshtml api is very weird but lets just say you have to do things this way ...
        HtmlDocument doc = new HTMLDocument();
        IHTMLDocument2 doc2 = (IHTMLDocument2)doc;
        doc2.write(new object[] { remoteContent });
    
        return (HTMLDocument)doc2;
    }
    

    这个函数做了两件事......

    1. 获取“url”处的内容页面
    2. 它将内容解析为 HTMLDocument 对象

    一旦你有了这个函数,你就可以调用它,将它的 url 传递给远程页面并取回一个 html 文档。 HTMLDocument 对象中的函数将允许您执行 javascript 之类的 dom 查询,例如:

    docObject.GetElementById("id");
    

    然后,我有不同的函数,根据我从中返回数据的页面/站点对这个对象执行不同的操作。

    然而这里有一个致命的缺陷......

    这对于结构变化不大且由代码构建的网站可能非常有效,但在动态较少的网站上效果不佳。

    以 stackoverflow 为例,它很容易提取一个问题和该问题的可接受答案,因此我可以使用此代码在我自己的网站上从此处提取和发布内容。

    然而……

    这不会帮助您了解用户/登录相关的详细信息,因为此类信息通常不会分享给所有人。

    这有点像我尝试将 facebook 个人资料链接到我自己的网站,我必须通过某种形式的 api,要求用户在发出请求之前验证他们的详细信息。

    仅基于 url 拉取网页不会向其他站点提供任何身份验证信息,除非该站点接受 quesrystring 中的用户登录详细信息并且您已经拥有它们。

    但是,您可以通过拆分我的示例方法来链接请求,请求登录页面解析结果,填写表单,然后使用相同的 Web 客户端实例回发以登录,然后请求 url。

    您的想法是您将有一个表单,要求用户在您的站点上输入他们的远程站点的登录详细信息,然后您可以根据该表单找到他们的个人资料页面。

    最好将其外包给一个类,而不是像我这里的简单方法。

    在我的情况下,虽然我只是追求一些简单的东西(英国广播公司前 40 名图表),我不仅从 bbc 还从亚马逊、谷歌和 youtube 等地方提取信息,然后我建立了一个页面 :)

    它很简洁,但除了将所有其他喜欢的信息来源拉到一页之外,没有任何功能用途。

    【讨论】:

      【解决方案6】:

      注意:我正在回答我自己的问题 只是为了标记一个正确的答案 反对。所有的建议 由这里的各个成员提供 以他们自己的方式正确,但他们 不适合我的要求。 因此,我不能接受其中任何一个 正确。

      我实现的方法是创建一个自定义控件,该控件具有一个可配置的属性,其中包含发布数据的 URL,另一个接受字典对象作为要发布的数据输入。

      此控件将在内部创建一个 HTML 表单,其操作属性设置为用户指定的 URL,并从字典对象创建数据字段。然后,此表单将发布在托管此控件的页面上的按钮单击事件中。

      【讨论】:

        猜你喜欢
        • 2023-03-26
        • 1970-01-01
        • 2012-02-19
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 2017-01-30
        • 1970-01-01
        • 2023-03-05
        相关资源
        最近更新 更多