我正在開發一些客戶端Javascript,它在不同的域上使用一些JSON Web服務。我讀過一些瀏覽器不允許跨域腳本編寫,我應該在本地服務器上創建一個代理來提供數據。跨瀏覽器腳本代理
有人可以請我指出一個簡單的例子,說明如何在ASP.Net中做到這一點?
我正在開發一些客戶端Javascript,它在不同的域上使用一些JSON Web服務。我讀過一些瀏覽器不允許跨域腳本編寫,我應該在本地服務器上創建一個代理來提供數據。跨瀏覽器腳本代理
有人可以請我指出一個簡單的例子,說明如何在ASP.Net中做到這一點?
您可以通過使用技術像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,你將不必擔心自己做格式化。
否瀏覽器允許跨域腳本編寫,雖然w3c在xmlHTTPRequest對象的建議中留下了空間,但我們仍然需要等待一段時間才能看到它以安全的方式實現...
我給一個尋求問題一般答案的人的僞代碼版本。
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
}
一般來說,代理在您的Web服務器上運行 - 很可能是您的情況下的IIS - 並將請求「中繼」到另一個域上的另一臺服務器。
下面是一個在C#.NET中實現的一個例子
+1用於回答提問與嘗試強制餵食不同策略的問題。 FWIW,鏈接中的項目已經移動,如果可能的話更新您的答案:http://www.codeproject.com/Articles/25218/Fast-Scalable-Streaming-AJAX-Proxy-continuouslyde – 2016-11-16 15:14:27
你可以寫一個簡單的.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/
IE8(測試版)有跨域請求的實現......但是,你需要等待。 – scunliffe 2008-10-27 13:43:18