2008-10-27 106 views
3

我正在開發一些客戶端Javascript,它在不同的域上使用一些JSON Web服務。我讀過一些瀏覽器不允許跨域腳本編寫,我應該在本地服務器上創建一個代理來提供數據。跨瀏覽器腳本代理

有人可以請我指出一個簡單的例子,說明如何在ASP.Net中做到這一點?

回答

3

您可以通過使用技術像JSONP避免代理。假設您正在討論的Web服務支持JSONP(例如,Flickr或Twitter都提供了JSONP API),或者您可以控制Web服務發回的數據,則可以使用具有JSONP的庫在域之間發送JSON數據。

例如,在jQuery中,你可以做一個遠程調用JSON:

jQuery.getJSON("http://www.someothersite.com/webservice?callback=?", function(result) 
{ 
    doStuffWithResult(result); 
}); 

因爲呼叫是到另一個領域,jQuery將自動使用一些詭計使一個跨域調用。 jQuery會自動替換?在帶有回調函數名稱的url中,Web服務可以使用該名稱來格式化正在返回的JSON數據。

如果您是控制Web服務的人,您可以通過獲取名爲「callback」的請求參數來處理JSONP請求,該參數將設置爲您需要使用的回調函數名稱。回調函數接受一個參數,這是您想要發回的JSON數據。所以,如果回調參數設置爲「jsonp2342342」,你會希望Web服務這樣的迴應:

jsonp2342342({key: value, key2: value}); 

如果你已經使用Web服務支持JSONP,你將不必擔心自己做格式化。

0

瀏覽器允許跨域腳本編寫,雖然w3c在xmlHTTPRequest對象的建議中留下了空間,但我們仍然需要等待一段時間才能看到它以安全的方式實現...

+0

IE8(測試版)有跨域請求的實現......但是,你需要等待。 – scunliffe 2008-10-27 13:43:18

0

我給一個尋求問題一般答案的人的僞代碼版本。

SomeAjaxAbstraction.Request('proxyScript', { 
    parameters: { 
     address: 'http://somewhere.com/someapi?some=query' 
    } 
}); 

然後在proxyScript:

var address = GET['address']; 
if(ValidUrl(address) && ConnectionAllowed(address)) { 
    // Validating address and whitelisting services is an exercise to the reader 
    var response = SomeHttpGetFunction(address); 
    echo XssAndBadStuffFilter(response); 
} else { 
    // Handle errors 
} 
6

一般來說,代理在您的Web服務器上運行 - 很可能是您的情況下的IIS - 並將請求「中繼」到另一個域上的另一臺服務器。

下面是一個在C#.NET中實現的一個例子

Fast, Streaming AJAX proxy

+0

+1用於回答提問與嘗試強制餵食不同策略的問題。 FWIW,鏈接中的項目已經移動,如果可能的話更新您的答案:http://www.codeproject.com/Articles/25218/Fast-Scalable-Streaming-AJAX-Proxy-continuouslyde – 2016-11-16 15:14:27

2

你可以寫一個簡單的.NET頁面以獲取遠程頁面,並在網站上顯示它:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Net; 
using System.IO; 

namespace Proxy 
{ 
    public partial class _Proxy : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      string proxyURL = string.Empty; 
      try 
      { 
       proxyURL = HttpUtility.UrlDecode(Request.QueryString["u"].ToString()); 
      } 
      catch { } 

      if (proxyURL != string.Empty) 
      { 
       HttpWebRequest request = (HttpWebRequest)WebRequest.Create(proxyURL); 
       request.Method = "GET"; 
       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

       if (response.StatusCode.ToString().ToLower() == "ok") 
       { 
        string contentType = response.ContentType; 
        Stream content = response.GetResponseStream(); 
        StreamReader contentReader = new StreamReader(content); 
        Response.ContentType = contentType; 
        Response.Write(contentReader.ReadToEnd()); 
       } 
      } 
     } 
    } 
} 

看到我的帖子:http://www.johnchapman.name/aspnet-proxy-page-cross-domain-requests-from-ajax-and-javascript/