jquery web-services json response.contenttype

jquery - ¿Puedo devolver JSON desde un servicio web.asmx si el ContentType no es JSON?



web-services response.contenttype (3)

Me gustaría publicar un formulario usando ajax y jquery en un servicio web .asmx y devolver el valor del servicio web como JSON.

Estoy usando ASP.NET 4.0. Sé que para devolver JSON desde un servicio web es necesario configurar (1) dataType: "json" (2) contentType: "application / json; charset = utf-8", (3) type: "POST" (4) establecer los Datos a algo. He probado esto y funciona bien (es decir, mi servicio web devuelve los datos como JSON) si se establecen ** todos **.

Pero, digamos que en mi caso, quiero hacer una publicación de formulario estándar, es decir, test1 = value1 y test2 = value2, de modo que contentType no es JSON, pero quiero volver JSON {test1: value1}. Esto no parece funcionar porque contentType es " application / x-www-form-urlencoded " no " application / json; charset = utf-8 ".

¿Alguien puede decirme por qué no puedo hacer esto? Me parece una locura que tenga que enviar explícitamente JSON para recuperar JSON, pero si no usa JSON (es decir, el tipo de contenido post urlencoded), el servicio web devolverá XML.

Cualquier idea es muy apreciada :)


También debe establecer contentType en la solicitud JSON también. Esto asegurará que no tenga application / x-www-form-urlencoded en la solicitud. En cambio, le dará lo que quiera: application / json; charset = utf-8.

$.ajax({ url: ''/your/site'', contentType: ''application/json'', dataType: ''json'', data: jsonString, type: ''post'', success: function (data) { /* do stuff */ } });


Los encabezados de solicitud y respuesta son diferentes storys. Por lo tanto, no es necesario enviar un tipo de datos específico para recibirlo.

En el caso de jQuery, simplemente use la función subyacente .ajax() con dataType establecido en ''json''. El resto depende de su secuencia de comandos / servicio de llamada.


Si va a utilizar WFC RESTfull Service en lugar de .asmx webservice, puede implementar todos sus requisitos a partir de su pregunta. Pero el uso del servicio web .asmx con JSON como salida requiere que uses al menos contentType: ''application/json'' . En diferentes lugares puede encontrar una razón: motivo de seguridad (consulte Secuestro JSON).

Probablemente ''x-www-form-urlencoded'' no sea su problema real. Si usa dataType: "json" los parámetros también se enviarán en la forma "test1 = value1 & test2 = value2" !!! La única diferencia es que todos los valores deben ser codificados con JSON. Y jQuery no hace la codificación JSON de los datos . (Puede buscar en el código de jQuery). La diferencia principal es que "Aceptar: aplicación / json" se establecerá explícitamente en el encabezado de la solicitud.

Mire la llamada de JQuery ajax a httpget webmethod (c #) que no funciona y que escribí recientemente. En esta publicación se le pidió un ejemplo de solicitud GET. Pero es casi lo mismo. La única diferencia es que los datos después de la codificación se agregarán a la URL (para la solicitud GET). Para la solicitud POST, los datos se enviarán en el cuerpo. Por cierto, si uno establece "processData: false" (ver http://api.jquery.com/jQuery.ajax/ ) los datos GET también se enviarán dentro del cuerpo. Así que lea mi ejemplo de código de JQuery ajax call a httpget webmethod (c #) no funciona . Espero que recibas ideas sobre cómo puedes implementar lo que quieras.

Creo que tuvo problemas para codificar datos complejos para su llamada al servicio web .asmx. Aquí hay un ejemplo con datos "complejos":

[WebMethod] [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] public OutputData AjaxGetMore (InputData input) { return new OutputData () { id = input.id, message = new List { "it''s work!", "OK!" }, myInt = new int[] { input.myInt[0] + 1, input.myInt[1] + 1, 20, 75 }, myComplexData = new InternalData () { blaBla = "haha", iii = new int[] { 1, 2, 3, 4, 5 } } }; }

dónde

public class InternalData { public string blaBla { get; set; } public int[] iii { get; set; } } public class OutputData { public string id { get; set; } public List message { get; set; } public int[] myInt { get; set; } public InternalData myComplexData { get; set; } } public class InputData { public string id { get; set; } public int[] myInt { get; set; } public InternalData data { get; set; } }

y en el lado del cliente

var myData = { id: "li1234", myInt: [100, 200], data : {blaBla: "Hahhh!", iii: [10,20,30]}} var myDataForjQuery = {input:$.toJSON(myData)}; $.ajax({ type: "GET", url: "/Service1.asmx/AjaxGetMore", // + idAsJson, data: myDataForjQuery, // idAsJson, //myData, dataType: "json", contentType: "application/json; charset=utf-8", success: function(msg) { // var msg = {__type: "Testportal.outputData", id: "li1234", message: "it''s work!", myInt:101} alert("message=" + msg.d.message + ", id=" + msg.d.id + ", myInt=" + msg.d.myInt); }, error: function(res, status) { if (status ==="error") { // errorMessage can be an object with 3 string properties: ExceptionType, Message and StackTrace var errorMessage = $.parseJSON(res.responseText); alert(errorMessage.Message); } } });

( $.toJSON proviene del complemento JSON) Puede modificar este ejemplo a HTTP POST, si lo desea.

Un pequeño consejo más. Si usa jQuery 1.4.x, puede intentar usar ''none'' como dataType. Consulte la documentación: "Si no se especifica ninguno, jQuery intentará obtener los resultados de manera inteligente, en función del tipo MIME de la respuesta (un tipo MIME XML arrojará XML, en 1.4 JSON arrojará un objeto JavaScript, en 1.4 script ejecutará el script, y todo lo demás se devolverá como una cadena) "

Atentamente