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