Recientemente, AJAX encontró problemas de dominio cruzado al visitar WebService. Busque información en línea y los resumió de la siguiente manera (muchos de ellos piensan que los han copiado bien)
<< Use JSON para transferir datos, confíe en JSONP a Dominio cruzado >>
Primero, agregaré mi código implementado:
Código frontal:
$ .AJAX ({Tipo: "Get", URL: "http: //localhost/service1.asmx/getelevatorStatusjSondata? jsonCallback =?", DataType: "jsonp", jsonp: "json", data: "", éxito: function (resultado) {var data = eval); for (var i = 0; i data; i/ii <data. {alerta (datos [i] .id + "-" + datos [i] .name);Código de servidor:
/// <summary> /// Obtener información de datos de estado //// </summary> /// <<surnsurs> </surense> [webMethod] public void getELEVATATTSTATUSJSONDATA () {List <List <Diceinfo>> Elevatordatas = nueva Lista <DisedInfo>> (); LIST <SendDicDate> SearchList = XMLSerializeHelper.xmlDeserializeFiLeMfile <list <SendDicdate> (@configUtil.servicePath + configUtil.getConfigbyKey ("xmlpath") + "Información directiva de consultoría.xml", encodering.utf8); foreach (sendDicDate item en SearchList) {string key = item.portno + "-" + item.bordrate + "-" + item.sendType; Lista <viceInfo> DeviceInfolist = (List <SciceInfo>) context.cache.get (clave); Elevatordatas.add (DeviceInfolist); } String result = ""; DataContractJSonserializer JSON = new DataContractJSonserializer (Elevatordatas.gettype ()); usando (MemoryStream Stream = new MemoryStream ()) {json.writeObject (stream, elevatordatas); resultado = encoding.utf8.getString (stream.toarray ()); } String jsonCallback = httpcontext.current.request ["jsonCallback"]; resultado = jsonCallback + '(' + resultado + ')'; HttpContext.Current.Response.Write (resultado); HttpContext.Current.Response.end (); }do#
El anterior es el código de implementación que llama al servidor C#, y el siguiente es el lado Java. Los parámetros pueden ser diferentes, pero los principios son los mismos
Java:
Cadena CallbackFunName = context.Request ["CallbackParam"]; context.Response.Write (CallbackFunName + "([{/" name/":/" John/"}])");PS: El parámetro JSONP del cliente se usa para pasar los parámetros a través de la URL y pasar el nombre del parámetro del parámetro JSONPCallback. Es difícil de pronunciar y en términos simples:
JSONP: ""
JSONPCALLBACK: ""
Por cierto: en el navegador Chrome, también puede establecer la información del encabezado context.Response.AddHeader ("Access-Control-Allow-Origin", "*"); en el servidor para lograr el propósito de las solicitudes de dominio cruzado, y no es necesario establecer los siguientes parámetros de AJAX
DataType: "JSONP", JSONP: "CallbackParam", JSONPCallback: "JSONPCALLBACK1"
Los datos se pueden obtener en el modo de solicitud AJAX normal.
El siguiente es el principio. Se siente muy razonable cuando lees lo que otros explicaron:
1. Un problema bien conocido. AJAX solicita directamente archivos ordinarios sin permiso para acceder a través de dominios. No importa si es una página estática, página web dinámica, servicio web o WCF, siempre que sea una solicitud de dominio cruzado, no será correcto;
2. Sin embargo, descubrimos que al llamar a los archivos JS en la página web, no se ven afectados por si son de dominio cruzado (no solo eso, también encontramos que todas las etiquetas con el atributo "SRC" tienen capacidades de dominio cruzado, como
3. Por lo tanto, se puede juzgar que en esta etapa, si desea acceder a datos a través de dominios a través de puro web (controles activox, proxy del servidor, futuras websockets HTML5, etc., es intentar cargar los datos en un archivo de formato JS en el servidor remoto para que el cliente llame y el procesamiento adicional;
4. Sabemos que hay un formato de datos de personajes puros llamado JSON que puede describir de manera concisa datos complejos. Lo que es aún mejor es que JSON es compatible de forma nativa por JS, por lo que el cliente puede procesar datos en este formato casi como lo desee;
5. Esta solución está saliendo. El cliente web llama al archivo de formato JS (generalmente con JSON como sufijo) generado dinámicamente en el servidor de dominio cruzado de la misma manera que el script de llamadas. Es obvio que la razón por la cual el servidor quiere generar dinámicamente archivos JSON es cargar los datos necesarios por el cliente.
6. Después de que el cliente llama con éxito el archivo JSON, obtiene los datos que necesita. El resto es procesarlo y mostrarlo de acuerdo con sus propias necesidades. Esta forma de obtener datos remotos se ve muy similar a AJAX, pero en realidad es diferente.
7. Para facilitar al cliente usar datos, se ha formado gradualmente un protocolo de transmisión informal. La gente lo llama JSONP. Uno de los puntos clave de este protocolo es permitir a los usuarios pasar un parámetro de devolución de llamada al servidor. Cuando el servidor devuelve datos, usará este parámetro de devolución de llamada como nombre de función para envolver los datos JSON, de modo que el cliente pueda personalizar sus propias funciones para procesar automáticamente los datos de retorno.
Es fácil para los desarrolladores inteligentes pensar que mientras el script JS proporcionado por el servidor se genere dinámicamente, la persona que llama puede pasar un parámetro y decirle al servidor "Quiero una pieza de código JS que llame a la función XXX, por favor devuélvelo", para que el servidor pueda generar el script JS y responder de acuerdo con las necesidades del cliente.
< xmlns = "http://www.w3.org/1999/xhtml"> <fead> <title> </title> <script type = "text/javaScript"> // La función de devolución de llamada después de obtener la información de vuelo de la información de la información del manejo de vuelo de vuelo = función (datos) {alerta ('El resultado de vuelo es: PIAO Price'+Data. piao ' + data.tickets +' zhang. }; // Proporcionar la dirección de URL del servicio JSONP (independientemente del tipo de dirección, el valor de retorno final es una pieza de código JavaScript) var url = "http://flightquery.com/jsonp/flightresult.aspx?code=ca1998&callback=flighthandler"; // Crear una etiqueta de script y establecer sus atributos var script = document.createElement ('script'); script.setAttribute ('src', url); // Agregue la etiqueta de script al encabezado y la llamada inicia //document.getElementsBytagName('head')[0font>.appendChild(Script); </script> </head> <body> </body> </html> <! DocType html public "-// w3c // dtd xhtml 1.0 transitional // en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-pransitional.dtd"> ost. xmlns = "http://www.w3.org/1999/xhtml"> <head> <title> Página sin título </title> <script type = "text/javascript" src = jQuery.min.js "> </script> <script type =" text/javaScript "> jQuery (documento). "Get", async: false, url: "http://flightquery.com/jsonp/flightresult.aspx?code=ca19998", dataType: "jsonp", jsonp: "devolución de llamada", // pasada al controlador de solicitudes o la página para obtener el nombre de parámetro del nombre de la función de llamada de JSONP (generalmente predeterminado es: callback ", pasó al manejador de solicitud JSONPCALLBACK: "FLIGHTHANDLER", // Nombre de función de devolución de llamada JSONP personalizado, predeterminado es el nombre de la función aleatoria generado automáticamente por jQuery, o puede escribir "?", jQuery procesará automáticamente los datos para su éxito: function (json) {alert ('Información de vuelo de consulta: piAo Price:' + json.price + 'yuan y piao:' + ' + json.' '') }, error: function () {alerta ('fail');¿No es un poco extraño? ¿Por qué no escribí la función Flighthandler esta vez? ¡Y en realidad funcionó con éxito! Jaja, este es el crédito de jQuery. Cuando JQuery maneja el tipo JSONP AJAX (no puedo evitar quejarme. Aunque JQuery también clasifica a JSONP en AJAX, en realidad no son lo mismo), generará automáticamente una función de devolución de llamada y eliminará los datos para el método de atributo de éxito para llamarlo. ¿No es muy bueno?