如何将数据发布到另一个Web应用程序(跨域)

时间:2010-01-21 10:09:08

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

请考虑以下情况,

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

我希望找到实现此功能的最佳方法。

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

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

如果你可以提供一些关于使用RESTful webservices来实现这一点的见解,或者使用一些HttpModule拦截App1上的请求并修改对app2的重定向响应或者你可能认为适合的任何其他方法,我会真的很高兴。

编辑: 使用查询字符串对我来说不是一个选项。

6 个答案:

答案 0 :(得分:1)

我需要使用Feed agregation进行类似的操作,并从不同域上的网页内容构建rss feed。

用户获取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. 获取内容页面
  3. 它将该内容解析为HTMLDocument对象
  4. 一旦你有了这个功能,你就可以调用它将url传递给远程页面并获得一个html doucment。 HTMLDocument对象中的函数将允许您执行类似dom查询的javascript,例如:

    docObject.GetElementById("id");
    

    然后我有不同的功能,根据我从中返回数据的页面/网站,对这个对象做了不同的事情。

    但这里有一个致命的缺陷......

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

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

    然而......

    这不会帮助您获取与用户/登录相关的详细信息,因为这类信息不会分发给大家。

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

    仅仅基于网址拉取网页只会给其他网站没有身份验证信息,除非该网站接受了问题字符串中的用户登录详细信息并且您已经拥有它们。

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

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

    这最好是一个类,而不仅仅是像我这里一样简单的方法。

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

    它很整洁但除了将所有其他最喜欢的信息来源拉到1页之外没有任何功能目的。

答案 1 :(得分:0)

我已经构建了类似你所描述的东西,我发现使用<form>标签POST到app2是最可靠的方式......基本上,你发现它运行良好的方式。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

如果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.

在本质上,您希望尽可能地控制和应用来自Applications域的请求到任何外部接口。

答案 5 :(得分:0)

  

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

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

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