2008-10-27 88 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/