Recentemente, o Ajax encontrou problemas de domínio cruzado ao visitar o WebService. Pesquise informações on -line e as resumisse da seguinte maneira (muitos deles pensam que os copiaram bem)
<< Use JSON para transferir dados, confie no JSONP para o domínio cruzado >>
Primeiro, vou adicionar meu código implementado:
Código front-end:
$ .ajax ({type: "get", url: "http: //localhost/service1.asmx/getElevatorStatusjSondata? jsonCallback =?", Datatype: "JSONP", JSONP: "JSON", Dados: ",", sucess: function (resultado) {var data (vars "; I ++) {alerta (dados [i] .id + "-" Data [i] .Name);Código do servidor:
/// <summary> /// Obter status Data Information /// </summary> /// <lorpts> </returns> [webmethod] public void getElevatorStatusjsondata () {list <list <viceRinfo>> elevatordatas = new List <Lista <PotityInfo>> (); LIST <SENNDDICDATE> searchlist = xmlSerializeHelper.xmlderializeFromFile <List <SendDicDate>> (@configutil.servicePath + configutil.getconfigbyKey ("xmlpath") + "consulivo de consulta.xml", encobing.utf8); foreach (item sendDicDate no searchlist) {string key = item.portno + "-" + item.bordrate + "-" + item.sendType; List <PomeInfo> deviceInfolist = (List <PomeInfo>) context.cache.get (key); elevatordatas.add (DeviceInfolist); } String resultado = ""; DATACONTRATTJSONSERILIZER JSON = NOVA DATACONTRATRJSONSERIALIZER (elevatordatas.getType ()); usando (MemoryStream Stream = new MemoryStream ()) {json.WriteObject (Stream, Elevatordatas); resultado = coding.utf8.getString (stream.toArray ()); } String jsonCallback = httpContext.current.request ["jsonCallback"]; resultado = jsonCallback + '(' + resultado + ')'; HttpContext.current.Response.write (resultado); HttpContext.current.Response.end (); }c#
O exposto acima é o código de implementação que chama o servidor C# e o seguinte é o lado Java. Os parâmetros podem ser diferentes, mas os princípios são os mesmos
Java:
String callbackFunName = context.request ["callbackParam"]; Context.Response.Write (callbackFunName + "([{/" name/":/" John/"}])");PS: O parâmetro JSONP do cliente é usado para passar os parâmetros através do URL e passar o nome do parâmetro do parâmetro jsonpcallback. É difícil pronunciar e em termos simples:
jsonp: ""
jsonpcallback: ""
A propósito: no navegador Chrome, você também pode definir o contexto do cabeçalho. no servidor para alcançar o objetivo das solicitações de domínio cruzado, e não há necessidade de definir os seguintes parâmetros do Ajax
Datatype: "JSONP", JSONP: "CallbackParam", JSONPCALLBACK: "JSONPCallback1"
Os dados podem ser obtidos no modo de solicitação AJAX normal.
O seguinte é o princípio. Parece muito razoável quando você lê o que os outros explicaram:
1. Um problema bem conhecido. O AJAX solicita diretamente arquivos ordinários sem permissão para acessar os domínios. Não importa se você é uma página estática, página da Web dinâmica, serviço da Web ou WCF, desde que seja uma solicitação de domínio cruzado, ele não estará correto;
2. No entanto, descobrimos que, ao ligar para os arquivos JS na página da web, eles não são afetados por serem domínios cruzados (não apenas isso, também descobrimos que todas as tags com o atributo "SRC" têm recursos de domínio cruzado, como como
3. Portanto, pode -se julgar que, nesta fase, se você deseja acessar dados entre domínios através da Web Pure (controles ActiveX, proxy do servidor, futuros websockets HTML5, etc., é tentar carregar os dados em um arquivo de formato JS no servidor remoto para o cliente ligar e processar outros;
4. Por acaso, sabemos que existe um formato de dados de caracteres puro chamado JSON que pode descrever concisamente dados complexos. O melhor é que o JSON é suportado nativamente pelo JS, para que o cliente possa processar dados nesse formato quase como desejar;
5. Esta solução está saindo. O cliente da Web chama o arquivo de formato JS (geralmente com JSON como o sufixo) gerado dinamicamente no servidor de domínio cruzado da mesma maneira que o script de chamada. É óbvio que a razão pela qual o servidor deseja gerar arquivos JSON dinamicamente é carregar os dados necessários pelo cliente.
6. Depois que o cliente chama com sucesso o arquivo JSON, ele obtém os dados de que precisa. O resto é processar e exibi -lo de acordo com suas próprias necessidades. Essa maneira de obter dados remotos parece muito semelhante ao Ajax, mas na verdade é diferente.
7. Para facilitar o cliente a usar dados, um protocolo informal de transmissão foi formado gradualmente. As pessoas chamam de JSONP. Um dos pontos -chave deste protocolo é permitir que os usuários passem um parâmetro de retorno de chamada para o servidor. Quando o servidor retornar dados, ele usará esse parâmetro de retorno de chamada como um nome de função para envolver os dados JSON, para que o cliente possa personalizar suas próprias funções para processar automaticamente os dados de retorno.
É fácil para os desenvolvedores inteligentes pensarem que, desde que o script JS fornecido pelo servidor seja gerado dinamicamente, o chamador pode passar por um parâmetro e dizer ao servidor "quero um código JS que chama a função XXX, retorne -o para mim", para que o servidor possa gerar o script JS e responder de acordo com as necessidades do cliente.
<! xmlns = "http://www.w3.org/1999/xhtml"> <head> <title> </title> <script type = "text/javascript"> // a função de chamada após a consulta de informações de voo é o resultado do voo de vôo = a função (dados) {ALERT. '+' Yu piao '+data.Tickets+' zhang. }; // Forneça o endereço da URL do serviço JSONP (independentemente do tipo de endereço, o valor final de retorno é um pedaço do código JavaScript) var url = "http://flightquery.com/jsonp/flightresult.aspx?code=ca1998&callback=flighthandler"; // Crie uma tag de script e defina seus atributos var script = document.createElement ('script'); script.setattribute ('src', url); // Adicione a etiqueta de script à cabeça e a chamada inicia //document.getElementsByTagName('head'iChild'.0 ].AppendChild(Script); </script> </ad Head> <body> </body> </html> <! xmlns = "http://www.w3.org/1999/xhtml"> <head> <title> página sem título </title> <script type = "text/javascript" src = jQuery.min.js "> </script> <script typet =" text/javsscrint "> jQscring (javeryscript (javeryscript (javery.min.js"> </script> <script (text/"text/javsscrint"> jQscring (javery.Js (script> <script ". Tipo: "Get", Async: False, URL: "http://flightquery.com/jsonp/flightresult.aspx?code=ca1998", Datatype: "JSONP", JONSONP: "Callback", // Passado para a solicitação Handler ou Page para obter o nome do parâmetro do JONET do JSONP " JSONPCALLBACK: "FLIGHTHandler", // Nome da função de retorno de chamada JSONP personalizado, o padrão é o nome da função aleatória gerado automaticamente por jQuery, ou você pode escrever "?", Zhang. ');Não é um pouco estranho? Por que não escrevi a função Flighthandler desta vez? E na verdade correu com sucesso! Haha, este é o crédito do jQuery. Quando o jQuery lida com o JSONP Type Ajax (não posso deixar de reclamar. Embora o jQuery também classifique o JSONP em Ajax, eles realmente não são a mesma coisa), ele gerará automaticamente uma função de retorno de chamada e retire os dados do método de atributo de sucesso para chamá -lo. Não é muito bom?