Кросс-браузерный сценарий прокси - PullRequest
3 голосов
/ 27 октября 2008

Я разрабатываю некоторый клиентский Javascript, который использует некоторые веб-сервисы JSON в другом домене. Я читал, что некоторые браузеры не допускают междоменных сценариев и что мне нужно создать прокси на моем локальном сервере для обслуживания данных.

Может кто-нибудь указать мне простой пример того, как это сделать в ASP.Net?

Ответы [ 5 ]

6 голосов
/ 27 октября 2008

Вообще говоря, прокси-сервер работает на вашем веб-сервере - скорее всего, в вашем случае IIS - и «ретранслирует» запросы на другой сервер в другом домене.

Вот пример того, что реализовано в C # .NET

Быстрый, потоковый AJAX прокси

3 голосов
/ 27 октября 2008

Вы можете избежать прокси, используя такую ​​технику, как JSONP . Предполагая, что веб-служба, с которой вы разговариваете, поддерживает JSONP (например, Flickr или Twitter оба предлагают API-интерфейс JSONP) или вы имеете контроль над данными, которые отправляет веб-служба, вы можете отправлять данные JSON между доменами, используя библиотеку с JSONP. .

Например, в jQuery вы можете сделать удаленный вызов JSON:

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

Поскольку вызов осуществляется в другой домен, jQuery автоматически использует некоторые хитрости для выполнения междоменного вызова. JQuery автоматически заменит? в URL с именем функции обратного вызова, которую веб-служба может использовать для форматирования возвращаемых данных JSON.

Если вы управляете веб-службой, вы можете обработать запрос JSONP, получив параметр запроса «обратный вызов», который будет установлен на имя функции обратного вызова, которое вам нужно использовать. Функция обратного вызова принимает один параметр, который представляет собой данные JSON, которые вы хотите отправить обратно. Итак, если для параметра обратного вызова задано значение «jsonp2342342», вам нужно, чтобы веб-служба отвечала следующим образом:

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

Если используемый вами веб-сервис уже поддерживает JSONP, вам не придется беспокоиться о самостоятельном форматировании.

2 голосов
/ 08 июля 2010

Вы можете написать простую страницу .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/

0 голосов
/ 27 октября 2008

Я дам версию с псевдокодом для людей, которые ищут общий ответ на вопрос.

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
}
0 голосов
/ 27 октября 2008

Нет браузеры разрешают междоменные сценарии, и хотя w3c оставил место для этого в своей рекомендации по объекту xmlHTTPRequest, нам все еще придется подождать некоторое время, чтобы увидеть его реализацию безопасным ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...