我正在开发一些客户端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