2010-04-26 21 views
5

Estoy intentando llamar a la función de servicio web a través del método GET usando jQuery, pero tengo un problema. Se trata de un código de servicio web:Llamar a la función de servicio web ASP.NET mediante el método GET con jQuery

[WebService(Namespace = "http://something.com/samples")] 
[ScriptService] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class TestWebService : System.Web.Services.WebService { 
    [WebMethod] 
    public string Test2() 
    { 
     string result = null; 

    try 
     { 
      result = "{'result':'success', 'datetime':'" + DateTime.Now.ToString() + "'"; 
     } 
     catch (Exception ex) 
     { 
      result = "Something wrong happened"; 
     } 

     return result; 
    } 

} 

Esa es la manera que yo llamo la función:

$.ajax({ type: "GET", 
     url: "http://localhost/testwebsite/TestWebService.asmx/Test2", 
     data: "{}", 
     contentType: "application/json", 
     dataType: "json", 
     error: function (xhr, status, error) { 
      alert(xhr.responseText); 
     }, 
     success: function (msg) { 
      alert('Call was successful!'); 
     } 
    }); 

método es llamado con éxito, pero la cadena resultante se cubre de etiquetas XML, así:

<string> 
{'result':'success', 'datetime':'4/26/2010 12:11:18 PM' 
</string> 

Y me sale un error debido a esto (se llama al manejador de errores). ¿Alguien sabe qué se puede hacer al respecto?

+0

¿Dónde está su '}' al final de la cadena JSON devuelta? –

+0

¿Te refieres a cadena json cubierta por etiquetas XML? Creo que hice algo mal cuando lo copié desde la ventana del navegador, debería estar allí, por supuesto. –

+0

Quizás, pero tampoco lo veo en el código del servicio web. –

Respuesta

0
  1. Regla para JSON: Sólo puede acceder a los datos desde el mismo dominio !

  2. La única excepción es cuando se utiliza jsonp (que es bastante complicado de implementar puesto que no hay serializador jsonp en el marco .NET).
    Si su están utilizando un servicio web estándar (y no WCF) se puede encontrar orientación howto implementar esta here.

+0

Por ahora debería ser suficiente para que pueda acceder a los datos dentro del mismo dominio. Pero incluso si abro una URL como esta http: //localhost/testwebsite/TestWebService.asmx/Test2 en el navegador de mi máquina local, veo XML renderizado. Lo único que necesito ahora es deshacerme de XML –

0

Asegúrese de añadir esto a sus opciones ajax:

contentType: "application/json; charset=utf-8" 

Su petición global debe ser similar a esto para conseguir JSON en lugar de XML:

$.ajax({ type: "GET", 
    url: "http://localhost/testwebsite/TestWebService.asmx/Test2", 
    data: "{}", 
    contentType: "application/json", 
    dataType: "json", 
    contentType: "application/json; charset=utf-8". 
    error: function (xhr, status, error) { 
     alert(xhr.responseText); 
    }, 
    success: function (msg) { 
     alert('Call was successful!'); 
    } 
}); 

ScottGu has a full breakdown on what's required here, pero parece que falta contentType en su caso (que uno me volvió loco durante un tiempo también).

+0

Cambiar contentType no tuvo ningún efecto –

+0

@the_V - ¿Qué error está alertando? también solo por patadas, ¿obtienes el mismo comportamiento con POST? –

+0

POST funciona bien, pero quiero que funcione con GET. Acerca del error: xhr.responseText está siguiendo - {'result': 'success', 'datetime': '27.04.2010 0:57:30'

0

Puede intentar configurar el ResponseFormat en sus métodos. Vea http://williamsportwebdeveloper.com/cgi/wp/?p=494 para ver cómo lo hicieron para JSON. Probablemente solo se ajuste a XML.

+0

He intentado añadir atributo siguiente a la definición del método: [ScriptMethod (ResponseFormat = ResponseFormat.Json, UseHttpGet = true, XmlSerializeString = false)] pero didn 't work –

0

lo necesario para decorar el método con el ScriptMethodAttribute:

[WebService(Namespace = "http://something.com/samples")] 
[ScriptService] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class TestWebService : System.Web.Services.WebService { 

    [WebMethod] 
    [ScriptMethod] 
    public string Test2() 
    { 
    [...] 
    } 
} 

Esto asegurará que el método devuelve JSON por defecto (el valor por defecto de ResponseFormat es Json).

+0

[ScriptMethod] atributo no tiene ningún efecto –

0

¿Usted intentó WebInvokeAttribute, que tiene miembros que definen Solicitud & formatos de respuesta, donde se pueden establecer para WebMessageFormat.Json.
Algo así como:
[WebInvoke(UriTemplate = "ServiceName", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, Method = "POST")]

0
  1. Usted puede utilizar controlador HTTP en lugar de servicio web.
  2. Puede analizar la respuesta xml con javascript en el cliente.
Cuestiones relacionadas