Вопрос

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

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

Это было полезно?

Решение

Вы можете избежать прокси, используя такой метод, как 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, вам не придется беспокоиться о самостоятельном форматировании.

Другие советы

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

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

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

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

Посмотрите мой пост об этом:

Браузеры

Нет разрешают междоменные сценарии, и хотя 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
}
scroll top