Pergunta

Estou desenvolvendo algum cliente lado Javascript que está usando alguns serviços web JSON em um domínio diferente. Eu li que alguns navegadores não permitem scripting cross-domain e que eu deveria criar um proxy no meu servidor local para servir os dados.

Pode alguém por favor me aponte para um exemplo simples de como fazer isso em ASP.Net?

Foi útil?

Solução

Você pode ser capaz de evitar um proxy usando uma técnica como JSONP . Supondo que o serviço web que você está falando suportes JSONP (por exemplo, Flickr ou Twitter ambos oferecem uma API JSONP) ou você tem controle sobre os dados do serviço Web envia de volta, você pode enviar dados JSON entre domínios usando uma biblioteca que possui JSONP .

Por exemplo, em jQuery, você pode fazer uma chamada JSON remoto:

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

Como a chamada é para outro domínio, jQuery automaticamente usa alguns truques para fazer uma chamada de domínio cruzado. jQuery irá substituir automaticamente o? na URL com um nome de função de retorno de chamada que o serviço web pode usar para formatar os dados JSON que estão sendo devolvidos.

Se você é o que controla o serviço web, você pode lidar com a solicitação JSONP, obtendo o parâmetro de solicitação chamado "retorno", que será definido para o nome da função de retorno de chamada que você precisa usar. A função de callback tem um parâmetro, que é os dados JSON que deseja enviar de volta. Então, se o parâmetro de retorno é definido como "jsonp2342342", você vai querer o serviço web para responder assim:

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

Se o serviço web que você já está usando suporta JSONP, você não terá que se preocupar em fazer o mesmo formatação.

Outras dicas

De um modo geral, as corridas de proxy em seu servidor web - muito provavelmente o IIS no seu caso -. E 'relés' as solicitações para outro servidor em um domínio diferente

Aqui está um exemplo de uma implementado em C # .NET

Rápido, procuração Transmissão AJAX

Você pode escrever uma página simples .NET para recuperar a página remoto e exibi-lo em seu site:

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());
                }
            }
        }
    }
}

Veja o meu post sobre isso: http://www.johnchapman.name/aspnet-proxy-page-cross-domain-requests-from-ajax-and-javascript/

Não navegadores permitem scripting cross-domain, e embora W3C tem espaço esquerda para isso em sua recomendação sobre a XMLHttpRequest-objeto, ainda temos que esperar algum tempo para vê-lo implementado de forma segura way ...

Vou dar uma versão pseudo-código para as pessoas que procuram uma resposta geral à questão.

SomeAjaxAbstraction.Request('proxyScript', {
    parameters: {
        address: 'http://somewhere.com/someapi?some=query'
    }
});

Então, em 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
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top