2009-05-22 17 views
8

Puedo llamar a mi servicio web utilizando jQuery SI el contentType = "application/x-www-form-urlencoded; charset = utf-8 "El servicio web ASMX no devuelve JSON, solo puede POST usar application/x-www-form-urlencoded contentType

Esto, sin embargo, volver xml: <string>[myjson]</string>

Si trato de artículo al servicio utilizando "application/json; charset = UTF-8" recibo un error 500 con un StackTrace vacía y ExceptionType . Mi función de servicio web nunca se ve afectada, así que no estoy muy seguro de cómo solucionar esta situación.

Mis métodos y clases están decorados con los atributos adecuados y están configurados para usar JSON como su tipo de respuesta (al igual que mis archivos wsdl y disco). Tengo las extensiones Ajax instaladas y las entradas necesarias en web.config.

Esto se encuentra en una granja de servidores de SharePoint, pero no estoy seguro de que haga una gran diferencia. Implementé los cambios web.config en todos los WFE así como también instalé las extensiones ajax. De nuevo, el servicio funciona, simplemente no aceptará nada más que el tipo de contenido predeterminado.

No está seguro de lo que me falta aquí, amigos ...

mi ajax llamada:

$.ajax({ 
type: "POST", 
url: "/_vti_bin/calendar.asmx/Test", 
dataType: "json", 
data: "{}", 
contentType: "application/json; charset=UTF-8", 
success: function(msg){ 
    alert(msg); 
    }, 
error: function(xhr, msg){ alert(msg + '\n' + xhr.responseText); } 
}); 

Mi clase de servicio web:

[WebService(Namespace = "http://namespace")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ScriptService()] 
public class CalendarService : WebService 
{ 
    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string Test() 
    { 
     return "Hello World"; 
    } 
} 
+0

Lo mismo ocurre en ASP.NET MVC 1.0 cuando se realiza una solicitud AJAX. –

Respuesta

0

no está seguro de si podría ser esta simple, pero estoy usando jQuery para devolver la llamada a JSON desde mis métodos web.

la principal diferencia que veo es el atributo de la clase

[System.Web.Script.Services.ScriptService]

[WebService(Namespace = "http://MyNameSpace")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.Web.Script.Services.ScriptService] 
    public class Web : System.Web.Services.WebService{ 

     [WebMethod] 
     public string TestMethod(){ 
     return "Testing"; 
     } 

    } 

Tengo que asumir que está utilizando el 3.5 framework porque esa es la única forma de exponer los métodos web JSON.

Mis llamadas forman jQuery parecen prácticamente idénticas, por lo que no hay problema.

+0

intenté esto y sigo obteniendo el contenedor XML ... –

-1

Parece que debe especificar json como formato de respuesta en la etiqueta scriptMethod. Esto es de vb.net, pero estoy seguro de que usted consigue la idea:

ResponseFormat: = ResponseFormat.Json

+0

como puede ver en el código pegado, estoy suministrando el formato de respuesta al atributo ScriptMethod. –

0

Si está probando esto en IE, intente eliminar el juego de caracteres de declaración de su atributo contentType (es decir, debe tener este aspecto:

contentType: "application/json", 

todavía tengo que descubrir por qué, pero iE parece conseguir sus bragas en un giro al hacer llamadas de JSON con la parte "charset=UTF-8".

alt text

0

Creo que estás en busca de la WebInvoke o WebGet de atributos, que le permite especificar la plantilla Uri, tipo de carrocería, solicitar y responseformats, por ejemplo:

[WebGet(ResponseFormat= WebMessageFormat.Json)] 

This Enlace puede ayudar . Hay un artículo similar para WebInvoke (usado principalmente para publicaciones).

+1

La pregunta era sobre el servicio web ASMX; WebGet se aplica a los contratos de WCF. –

0

Utilizo bastante las llamadas JQuery AJAX JSON al servicio web ASMX. Funciona perfectamente en todos los navegadores. Estoy usando .NET 2.0 con las extensiones ASP.NET AJAX instaladas (incluido en 3.5).

Mi clase tiene los mismos decoradores que tú. Mis métodos solo tienen el decorador [WebMethod(EnableSession = true)]. Mi web.config sin embargo, tiene la siguiente entrada en su sección httpHandlers:

<add verb="*" path="*jsonservice.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 

Mi llamado jQuery se ve de la siguiente manera:

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "path/to/service/jsonservice.asmx/MethodName", 
    data: JSON.stringify(DTO), 
    dataType: "json", 
    success: function(rtrn) { alert("good"); }, 
    error: function(req, msg, err) { alert("bad"); } 
}); 

This article es la raíz de mis conocimientos.

3

Tengo esto funcionando en 2.0 usando servicios web, pero he implementado protección de .d (vea el filtro de datos a continuación). También estoy devolviendo una variedad de objetos. NOTA: la clase del objeto es estática, o al menos no funcionaría correctamente para mí.

$.ajax({ 
     type: "POST", 
     contentType: "application/json; charset=utf-8", 
     data: "{}", 
     dataFilter: function(data) 
     { 
      var msg; 
      if (typeof (JSON) !== 'undefined' && 
       typeof (JSON.parse) === 'function') 
       msg = JSON.parse(data); 
      else 
       msg = eval('(' + data + ')'); 
      if (msg.hasOwnProperty('d')) 
       return msg.d; 
      else 
       return msg; 
     }, 
     url: "webservice/ModifierCodesService.asmx/GetModifierList", 
     success: function(msg) 
     { 
      LoadModifiers(msg); 
     }, 
     failure: function(msg) 
     { 
      $("#Result").text("Modifiers did not load"); 
     } 
    }); 

Aquí es una snippett de mi servicio web:

...

[WebService(Namespace = "http://mynamespace.com/ModifierCodesService/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
[ScriptService] 
public class ModifierCodesService : System.Web.Services.WebService 
{ 

    /// <summary> 
    /// Get a list of Modifiers 
    /// </summary> 
    /// <returns></returns> 
    [WebMethod(EnableSession = true)] 
    public Modifier[] GetModifierList() 
    { 
     return GetModifiers(); 
    } 
     /// <summary> 
     /// Modifiers list from database 
     /// </summary> 
     /// <returns></returns> 
     private Modifier[] GetModifiers() 
     { 
      List<Modifier> modifier = new List<Modifier>(); 
      ModifierCollection matchingModifiers = ModifierList.GetModifierList(); 
      foreach (Modifier ModifierRow in matchingModifiers) 
      { 
       modifier.Add(new Modifier(ModifierRow.ModifierCode, ModifierRow.Description)); 
      } 
      return modifier.ToArray(); 
     } 
    } 

...

el código objeto:

public static class ModifierList 
    { 

     /// <summary> 
     /// Returns the Modifier Collection. 
     /// </summary> 
     /// <param name="prefix"></param> 
     /// <returns></returns> 
     public static ModifierCollection GetModifierList() 
     { 
+1

SO cambio de línea cadena pública Prueba() { a cadena estática pública Prueba() { y ver si eso funciona para usted. –

1

tengo estado luchando con esto hoy con una aplicación para iPhone que habla con un servicio web .Net.

Descubrí que si cambiaba mi Tipo de contenido a la aplicación/jsonrequest se procesaba sin problemas y podía procesar los datos en mi servidor web.

Solo por sonrisas, agregué la línea mencionada anteriormente a mi web.config, pero no hizo que la aplicación/json funcionara.

Cuestiones relacionadas