3

我正在开发一些在不同域上使用一些 JSON Web 服务的客户端 Javascript。我读过一些浏览器不允许跨域脚本,我应该在我的本地服务器上创建一个代理来提供数据。

有人可以指点我一个如何在 ASP.Net 中执行此操作的简单示例吗?

4

5 回答 5

6

一般来说,代理在您的 Web 服务器上运行 - 在您的情况下很可能是 IIS - 并将请求“中继”到不同域上的另一台服务器。

这是一个在 C# .NET 中实现的示例

快速的流式 AJAX 代理

于 2008-10-27T04:31:41.853 回答
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,则您不必担心自己进行格式化。

于 2008-10-27T04:20:01.533 回答
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/

于 2010-07-07T22:35:50.597 回答
0

没有浏览器允许跨域脚本,尽管 w3c 在其对 xmlHTTPRequest-object 的建议中为此留出了空间,但我们仍然需要等待一段时间才能看到它以安全的方式实现......

于 2008-10-27T02:26:22.993 回答
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
}
于 2008-10-27T02:34:12.323 回答