2010-10-14 14 views
5

Síntoma: Cuando realizo una solicitud de servicio web (desde JQuery usando .ajax, a ASP.NET archivo .asmx), si se hace usando GET en lugar de POST, el archivo .asmx siempre devuelve XML en lugar de JSON. Si cambio la llamada a las publicaciones, responde muy bien como JSON.ASP.NET WebService devuelve erróneamente XML en lugar de JSON solo cuando se usa Http Get pero web.config está configurado correctamente

Objetivo: ¿Cómo puedo obtener JSON en lugar de XML, utilizando HTTP GET?

Ya tengo un poco de google y no son los sospechosos habituales como falta de ScriptService o no registrar el controlador en web.config. ¿Se está comportando como si la fábrica de controladores de scripts solo estuviese trabajando en publicaciones? ¡Por favor, ayúdenme a orientarme en la dirección correcta aquí!

código del servidor:

namespace mynamespace 
{ 
    /// <summary> 
    /// Summary description for ServiceAddresses 
    /// </summary> 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [ToolboxItem(false)] 
    [System.Web.Script.Services.ScriptService] 
    public class MyService : System.Web.Services.WebService 
    { 
     [WebMethod] 
     [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] 
     public string HelloWorld() 
     { 
      return "Hello World at " + DateTime.Now.ToLongTimeString(); 
     } 
    } 
} 

El código de cliente:

function testhelloworld(postorget) { 
    var webMethod = '/servicedir/MyService.asmx/HelloWorld'; 
    $.ajax({ 
     type: ('GET'===postorget)?'GET':'POST', 
     url: webMethod, 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 
     data: "{}", 
     success: function(msg) { 
      $('#info').text(msg.d); 
     }, 
     error: function(xhr, ajaxOptions, thrownError) { 
      $('#info').text('Error: ' + xhr.responseText); 
     } 
    }); 
} 

Obras bien si cambio de servicio a UseHttpGet = false y solicitudes del cliente como POST. Devuelve XML si uso GET.

violinista dice solicitud es:

GET http://myserver/servicedir/MyService.asmx/HelloWorld?{} HTTP/1.1 
Host: myserver 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 (.NET CLR 3.5.30729) 
Accept: application/json, text/javascript, */* 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
X-Requested-With: XMLHttpRequest 
Referer: http://myserver/test/index.aspx 

Respuesta:

HTTP/1.1 200 OK 
Server: Microsoft-IIS/5.1 
Date: Thu, 14 Oct 2010 00:31:44 GMT 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
Cache-Control: private, max-age=0 
Content-Type: text/xml; charset=utf-8 
Content-Length: 115 

<?xml version="1.0" encoding="utf-8"?> 
<string xmlns="http://tempuri.org/">Hello World at 8:31:44 PM</string> 

partes pertinentes de web.config:

<webServices> 
    <protocols> 
    <add name="HttpGet"></add> 
    <add name="HttpPost"></add> 
    </protocols> 
</webServices> 
. . . 
     <remove verb="*" path="*.asmx"/> 
     <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
. . . 
    <remove name="ScriptHandlerFactory"/> 
    <remove name="ScriptHandlerFactoryAppServices"/> 
    <add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 
     <add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> 

exactamente lo mismo, pero con recompilar UseHttpGet = false y solicitando a través de POST funciona.

violinista dice solicitud POST es:

POST http://myserver/servicedir/MyService.asmx/HelloWorld HTTP/1.1 
Host: myserver 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.9) Gecko/20100824 Firefox/3.6.9 (.NET CLR 3.5.30729) 
Accept: application/json, text/javascript, */* 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Content-Type: application/json; charset=utf-8 
X-Requested-With: XMLHttpRequest 
Referer: http://myserver/test/index.aspx 
Content-Length: 2 
Pragma: no-cache 
Cache-Control: no-cache 

{} 

Respuesta:

HTTP/1.1 200 OK 
Server: Microsoft-IIS/5.1 
Date: Thu, 14 Oct 2010 00:37:03 GMT 
X-Powered-By: ASP.NET 
X-AspNet-Version: 2.0.50727 
Cache-Control: private, max-age=0 
Content-Type: application/json; charset=utf-8 
Content-Length: 33 

{"d":"Hello World at 8:37:03 PM"} 

preventivamente respondiendo a las no-respuestas:

Quiero utilizar GET porque me gustaría clientes a poder caché

Soy consciente de que existen problemas de seguridad con la obtención, por ejemplo, publicado en el blog de scott gu.

Sé que no podría usar las secuencias de comandos de ASP.NET y simplemente hacerlo yo mismo, o probar Jayrock. Pero, me gustaría entender por qué el stock ASP.NET ScriptHandler no está funcionando.

Respuesta

0

No está seguro acerca de los servicios web ASMX, pero usamos WCF y funciona con estos atributos en el método

[WebGet(RequestFormat = WebMessageFormat.Json, 
ResponseFormat = WebMessageFormat.Json] 
Cuestiones relacionadas