2009-08-07 85 views
4

我们有一个ASP.Net应用程序托管在我们的网络上并暴露给特定的客户端。该客户希望能够将数据从他们自己的服务器导入到我们的应用程序中。数据是通过HTTP请求检索的,并且是CSV格式的。问题是他们不希望将他们的服务器暴露给我们的网络,并且正在请求在客户端进行导入(所有客户端都来自与其服务器相同的网络)。JavaScript中的跨域数据访问

所以,需要做的事情是:

  1. 他们请求导入页面从我们的服务器
  2. 页面上的客户端脚本问题得到CSV格式到他们的服务器请求数据
  3. 数据被发送回我们的应用程序

当两台服务器都在同一个域上时,这不是一个挑战:一个简单的隐藏的iframe或类似的东西可以做到这一点,但在这里我是什么获取是跨域“拒绝访问”错误。他们也拒绝更改数据格式以返回JSON或XML格式的数据。

我尝试和迄今为止学到的是:

  1. 隐藏的iframe - “拒绝访问”
  2. XMLHttpRequest的 - 行为取决于浏览器的安全设置:可以工作,可以工作,同时唠叨用户安全警告,或可能不会在所有
  3. 动态脚本标签工作 - 如果他们能以JSON格式已返回数据
  4. IE客户端数据绑定会工作 - 同样的“拒绝访问”错误

在放弃之前还有什么我可以尝试的,并且表示如果不将他们的服务器暴露给我们的应用程序,更改他们的数据格式或更改他们的浏览器安全设置,这是不可能的? (顺便说一下,DNS技巧不是一个选项)。

回答

2

这可能是你的客户太晚了,但因为你必须有对两个域的控制,你可以尝试EasyXDM。它是一个包装跨浏览器怪癖的库,它提供了一个易于使用的API,使用该浏览器的最佳可用机制(例如postMessage,如果可用,其他机制,如果不可用)在不同域之间进行客户端脚本通信。注意:你需要控制两个域以使其工作(其中“控制”意味着你可以在两者上放置静态文件)。但是您不需要任何服务器端代码更改。

+0

嗨,我不再在那里工作了,我甚至不记得问题的所有细节,但感谢您的好链接! :) – vit 2010-05-05 10:20:15

+0

无论如何,因为这将解决原来的问题,我会接受这个答案。 – vit 2010-07-19 01:48:41

3

JSONP可能是你的答案,如果他们可以服务器数据的JSON格式。除此之外,您将永远遇到Same Origin Policy跨域调用问题。你有没有考虑做服务器端调用来执行HTTP请求到他们的服务器?

+0

不,他们的服务器无法从我们的服务器访问。 – vit 2009-08-07 11:26:23

+0

我发现jsonp可以工作,但是如果你的服务受到windows/ntlm身份验证的威胁,你可能会遇到问题 – David 2011-10-27 12:49:37

1

你的客户端是由你的应用程序提供的JavaScript,对吧?

然后,您的客户端只能向您的应用发送请求(跨站点脚本预防),您发现错误?

假设是,那么解决方案是让您的应用程序提供“代理”服务。您的浏览器代码可以向您的服务器索取一些数据。你的服务器可以自由地向它喜欢的任何服务器发出Http请求(没有浏览器对象)。因此,您需要实施一些小服务来获取该CVS数据并将其呈现给您的应用程序。

如果您的客户正在使用它,您甚至可以选择将该CSV数据映射到JSON。

+0

代理服务器不能正常工作,因为他们的服务器只能从他们自己的网络上看到,并且不能从我们的服务器访问。 – vit 2009-08-07 11:25:33

+1

所以他们的浏览器可以看到你和他们的服务器。但是你看不到他们的服务器。 (道歉,你确实在说这个问题。)很难过去。 – djna 2009-08-07 13:02:25

0

你不能在他们的服务器上托管JS文件吗?这应该允许该文件中的脚本将ajax调用回到其服务器。

+1

否 - 同源策略与* page *服务于的域相关,而不是* script *服务的域。 – NickFitz 2009-08-07 11:36:25

+0

你是对的,对我感到羞耻:) – JonoW 2009-08-07 12:35:23

0

你可以试试闪光灯。如果你会把这个yourdomain.com/crossdomain。xml在你的根目录下,你将能够从mysite.com发出跨域请求。

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
<allow-access-from domain="www.mysite.com" to-ports="25" /> 
</cross-domain-policy> 
+0

不应该把它放在服务器上我是从数据库请求数据,而不是我们自己的服务器? – vit 2009-08-07 11:59:37

+0

据我所知,你没有直接访问他们的服务器。因此,如果网域中存在一个页面,其中包含必要的CSV信息,则此页面可以使用Flash将数据发送到您的域。 – 2009-08-07 12:30:36