Прокси-сервер для межбраузерных сценариев
-
04-07-2019 - |
Вопрос
Я разрабатываю клиентский 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
Вы можете написать простую страницу .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
}