el uso de jQuery AJAX con los web services asp.net siempre se convierte en error: en lugar de éxito:

Problema

Tengo una página aspx con código jQuery para enviar una request ajax a un file de service web de asmx (en el mismo website). La respuesta que se devuelve no es consistente, sin embargo, dispara consistentemente la callback jQuery de "error" en lugar de la callback "exitosa". El código de estado varía de forma incoherente entre 200, 12030 y 12031. El text de responseText del post a la callback varía de manera incoherente entre [vacío] y el XML real que devuelve el service web json. Depuré el código y el service web realmente se ejecuta sin excepciones.

Código ASPX

// Código omitido por brevedad

 <script type="text/javascript"> jQuery(document).ready(function() { jQuery.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "CallDequeue.asmx/Dequeue", data: "{}", dataType: "json", success: function(Msg) { alert('success:' + Msg.responseText); }, error: function(Msg) { alert('failed:' + Msg.status + ':' + Msg.responseText); } }); }); </script> 

// Código omitido por brevedad

Código de service web

 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ScriptService] public class CallDequeue : System.Web.Services.WebService { [WebMethod] public string Dequeue() { return "{\"d\":{\"FirstName\":\"Keivan\"}}"; } } 

Cuando marca el service como ScriptService, maneja automáticamente la serialization JSON. No debe serializar manualmente la respuesta.

Si desea que el retorno vuelva como "Nombre", puede usar una class DTO para controlar la syntax. Simplemente devolviendo una cadena, volvería como {'d': 'Keivan'} en lugar de {'d': {'FirstName': 'Keivan'}}.

 [ScriptService] public class CallDequeue : System.Web.Services.WebService { public class PersonDTO { public string FirstName; } [WebMethod] public PersonDTO Dequeue() { var p = new PersonDTO(); p.FirstName = "Keivan"; return p; } } 

Algunos cambios a la syntax de llamada:

 jQuery(document).ready(function() { jQuery.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "CallDequeue.asmx/Dequeue", data: "{}", dataType: "json", success: function(Msg) { // Unless you're using 2.0, the data comes back wrapped // in a .d object. // // This would just be Msg.d if you return a string instead // of the DTO. alert('success:' + Msg.d.FirstName); }, error: function(Msg) { alert('failed:' + Msg.status + ':' + Msg.responseText); } }); }); 

Puede leer más acerca del contenedor .d de ASP.NET AJAX aquí , si le interesa.

Actualizar:

Usando ASP.NET 2.0, necesita instalar las Extensiones ASP.NET AJAX v1.0 . Además, asegúrese de que su web.config esté configurado para ASP.NET AJAX (más específicamente, la sección HttpHandlers).

Esta pregunta probablemente te ayudará.

De lo contrario, convertí este service web a un método de página y funcionó de inmediato. ¿Tienes esa opción?

CS:

 public partial class test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } [WebMethod] public static string Dequeue() { return "{\"d\":{\"FirstName\":\"Keivan\"}}"; } } 

ASPX:

 <script type="text/javascript"> jQuery(document).ready(function() { jQuery.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "test.aspx/Dequeue", data: "{}", dataType: "json", success: function(Msg) { alert('success:' + Msg.responseText); }, error: function(Msg) { alert('failed:' + Msg.status + ':' + Msg.responseText); } }); }); 

Consulte este y otros artículos de Encosia para get más información.

dices que es json, pero devuelve xml. veo una ligera desconnection allí.

Una respuesta tan simple. Mi web.config no estaba habilitado para ajax, por lo que todas las llamadas (independientemente de que mi service web fuera un service de scripts) devolvían XML en lugar de json puro.

Intenta marcar tu método web con [ScriptMethod]

Como en:

 [WebMethod] [ScriptMethod] 

Mi agradecimiento a todos los que respondieron aquí.

Asegúrese de agregar estos attributes al frente de los methods que se utilizarán

 [WebMethod] [ScriptMethod] 

¿No está seguro de cuándo se necesita ScriptMethod?

Curiosamente, NO tenía el [Script Service] y el [WebMethod] en su código de descarga.

De todos modos, los errores aJax 500 12030 12031 se han ido después de los cambios anteriores.