Pergunta

Got tipo de um problema complicado.

Eu estou trabalhando em um projeto onde precisamos permitir impressões de recibos quando os usuários check-out no nosso site em um quiosque. Por razões ligadas aos condutores e formatação, estou usando automação COM com a Palavra de lidar com a impressão dos recibos. Eu envolto este código em um serviço web que roda em uma máquina local.

O plano era para colocar um simples chamada ajax jQuery no HTML da página para o url da máquina local executando o serviço web. Esta chamada ajax contém um objeto JSON da ordem, que é desserializado pelo serviço web e impresso. Funciona bem se eu usar localhost, no entanto na produção Vou entrar em conflito com nenhum domínio cruz governar chamadas ajax.

Um proxy não funcionará porque o código em execução no website não pode entrar em contato com o serviço web local executando o serviço de impressão. Depois de picar ao redor na web, descobri que usando JSONP pode ser uma solução para isso, mas eu não consigo descobrir como fazê-lo trabalho. A maioria dos tutoriais assumir que você está tentando obter alguns dados remotos em vez de simplesmente postar dados. Os serviços de impressão web retorna vazio.

Como faço para configurar o meu serviço web (asmx) para trabalhar com JSONP e qual seria o meu código jQuery parece? Atualmente ele é algo como isto:

function printReceipt(data) {
   $.ajax({
       type: "POST",
       url: "http://192.9.200.165/ContestWebService/Service1.asmx/PrintOrderReceiptJson",
       data: data,
       dataType: "json",
       contentType: "application/json; charset=utf-8",
       error: function(xhr, msg) { alert(xhr.statusText); }
    });
}

Qualquer alternativas mais simples para JSONP, ou quaisquer outras soluções possíveis que podem não ter considerado que seria útil também.

Foi útil?

Solução

JSONP simplesmente adiciona uma tag script para a seção head e só assim é limitado a solicitações GET. Para configurar o serviço de web asmx para lidar com JSONP você terá que lidar com a serialização manualmente:

[WebMethod]
[ScriptMethod(UseHttpGet=true, ResponseFormat=ResponseFormat.Json)]
public string Foo()
{
    var json = new JavaScriptSerializer().Serialize(new 
    {
        Prop1 = "some property",
    });
    string jsoncallback = HttpContext.Current.Request["jsoncallback"];
    return string.Format("{0}({1})", jsoncallback, json);
}

E o lado do cliente:

$.getJSON("http://192.9.200.165/ContestWebService/Service1.asmx/PrintOrderReceiptJson?jsoncallback=?",
    function(data) {
        alert(data);
    });

Outra alternativa para chamadas AJAX de domínio cruzado é usar o Flash .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top