2012-03-17 57 views
9

我們最近一直在研究一個相當現代化的網絡應用程序,並準備好將它部署到alpha/beta並獲得一些真實世界的體驗。從webservices託管靜態內容到不同的域,如何避免跨域?

我們有基於ASP.Net的Web服務(Web API)和一個JavaScript前端是使用主幹100%的客戶端MVC。

我們已經購買了我們的域名,併爲這個問題的緣故我們的部署是這樣的:

webservices.mydomain.com(web服務)

mydomain.com(JavaScript的前端)

如果JavaScript的嘗試去跟上我們吹了跨域問題的子域名的web服務,我和CORS玩耍了,但我並不滿足於跨瀏覽器的支持,所以我就指望這一點作爲選項。

在我們的開發PC上,我們使用IIS反向代理將所有請求轉發到mydomain.com/webservices到webservices.mydomain.com - 這解決了我們所有的問題,因爲瀏覽器認爲所有的東西都在同一個域中。

所以我的問題是,在一個公共的部署,這是怎麼問題最常見的解決了嗎?反向代理是否是正確的方式?如果有的話,是否有託管服務爲這種情況提供反向代理?有更好的方法來部署這個?

我想用CloudFront的CDN作爲我們所有的服務器/服務與亞馬遜託管的,我真的在努力尋找的,如果CDN雖然可以支持這種類型的設置信息。

感謝

+1

也許我的個人實現過於簡單(如果有的話,我也會對其他人的評論感興趣)。 我想缺少的是前/後之間的數據傳輸是什麼?在我的簡單實現中,前端通過JSONP與後端(WCF服務)進行通信,以實現「真正的」跨域實現。 如果我需要「代理」,那麼它的一個「應用代理」 - 在mydomain.com的前端將與mydomain.com上的處理程序(即ashx)進行通信,該處理程序在myotherdomain.com上將http請求「代理」到WCF。 – EdSF 2012-03-17 05:37:42

+0

你使用JQuery還是純JavaScript? (在JQuery的情況下,你可以使用這個:http://usejquery.com/posts/the-jquery-cross-domain-ajax-guide) – ONOZ 2012-03-26 09:51:45

+1

對於WebAPI,你可以查看這個帖子,關於啓用CORS和JSONP應該工作跨越瀏覽器http://goo.gl/KjT6y – cecilphillip 2012-03-26 14:36:13

回答

1

你所要做的是跨子域調用,而不是完全跨域。 這就是技巧:http://www.tomhoppe.com/index.php/2008/03/cross-sub-domain-javascript-ajax-iframe-etc/

問如何解決這個問題最常見。我的回答是:這個問題通常是AVOIDED。在現實世界中,您可以設置您的域名,例如您不必爲了讓您的應用程序運行或設置代理服務器來爲您轉發呼叫而設置此類方法。 JSONP也是一個黑客解決方案。

+0

出於好奇,我將如何設置我的域名以避免此問題?在我看來,「網絡應用程序」尚未準備好迎接黃金時段,即您還無法構建和運行純粹的JavaScript網絡應用程序。 CORS =糟糕的支持,JSONP = Hack /限制功能,Inter-iframe coms = Hack。 – Tyler 2012-03-26 21:53:19

+0

只需將負載均衡器設置爲mydomain.com/service並將反向代理設置爲web服務,所有問題都消失了。 – Tisho 2012-06-13 10:48:16

0

您可以簡單地使用JSONP AJAX的請求,然後跨域不是一個問題。

如果AJAX請求返回一些HTML,它可以逃進一個JSON字符串。

雖然第二個有點尷尬。

0

你有2/3層

在Web服務代碼behin類,添加此屬性附加傷害:<System.Web.Script.Services.ScriptService()> _

也許你需要在你的網絡的節點的System.Web添加此。配置:

<webServices> 
     <protocols> 
      <add name="AnyHttpSoap"/> 
      <add name="HttpPost"/> 
      <add name="HttpGet"/> 
     </protocols> 
     </webServices> 

在客戶端接口

- 在子域上添加對服務的web引用(例如, webservices.mydomain。COM/svc.asmx) 的Visual Studio使「代理類」

-add功能母版的|網頁|控制的behin 代碼-Simply從客戶端調用這個函數

您可以使用AJAX功能與scriptmanager或使用另一個系統如JQuery。

如果您的主要網站在.NET 3.5或以上的編譯,你需要一個參考你的web.config文件添加到命名空間System.Web.Extensions程序和申報。

0

如果具有帶寬(網絡I/O和CPU)來處理這種情況,反向代理是一個很好的解決方案。一個好的反向代理甚至會緩存靜態調用,以幫助緩解代理引入的網絡延遲。

另一種選擇是設置適當的跨域策略文件和/或頭。在一些雲供應商中這樣做可能很難甚至不可能。我最近遇到了字體文件問題,而IE對跨域調用不滿意。我們無法獲得我們用來設置正確標題的雲存儲提供商,因此我們在本地託管它們,而不必處理反向代理。

1

要允許此Web服務從腳本調用,使用ASP.NET AJAX,以下行添加到第一個Web服務代碼隱藏:

[System.Web.Script.Services.ScriptService] 
0

easyXDM是跨域的Javascript插件可能值得探索。它在瀏覽器支持它時使用標準,並且在瀏覽器不支持標準時抽象出所需的各種黑客。從easyXDM.net:

easyXDM是一個JavaScript庫,讓你作爲一個開發者 容易解決的同源 策略設置到位的限制,進而使其易於溝通和揭露的JavaScript API跨域限制。

在覈心easyXDM提供了一種能夠通過兩個窗口之間的基於 串消息的傳輸堆棧,消費者(主 文件)和一個提供者(使用iframe包括在文檔)。它 使用的幾種可用技術之一,一直 選擇最有效的一個當前瀏覽器做到這一點。對於所有的 實現,傳輸棧提供了雙向性,可靠性,排隊和發送者驗證。

一個easyXDM的目標是支持那些在 所有常用的瀏覽器,併爲所有人提供相同的功能。一爲達到這個 策略是按照規定的標準,再加上採用特徵檢測,以確保使用最有效的一個 。

引述容易XDM的作者:

...網站如LinkedIn,Twitter和Disqus以及應用程序由諾基亞經營 和其他人建立在提供 消息框架的頂部及其應用通過easyXDM。

所以easyXDM顯然不是一些poxy hack,但我承認它很大程度上依賴於您的項目。

Web的當前狀態是,如果要推送信封,則必須使用功能檢測和填充,或者只需強制用戶升級到HTML5瀏覽器。如果這讓你感到不安,你並不孤單,但是polyfills是一種暫時的邪惡,它需要從網頁的位置到達我們希望的位置。請參閱this SO question