Publicação de vários domínios JSON ao ASP.NET com jQuery
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.
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 .