lunes, 30 de septiembre de 2013

Como usar parametros JSON desde un servicio asmx

Como desarrolladores muchas veces estamos deseando utilizar la última versión del lenguaje, framework o herramienta, pero no siempre es posible.
Algunas veces es política de la empresa trabajar siempre una versión por detrás de la final, para asegurarse la estabilidad de la plataforma.
Otras veces viene impuesto por la situación, no hay dinero para comprar licencias o el sistema es muy antiguo y nadie se atreve a migrarlos (PL/1, COBOL, AS400)
El uso de JSON en aplicaciones web se ha convertido el algo muy común en los últimos años, pero si te ha tocado mantener un sistema antiguo en .net quizás no sepas que tus servicios web asmx son lo suficientemente inteligentes como para saber responder con JSON si la petición recibida viene en ese formato.
El HTTPHandler llamado ScriptHandlerFactory que será el responsable de decidir si servicio asmx trata los parámetros de entrada y salida como JSON o XML. Para la serialización y deserialización del JSON se utilizará la clase JavaScriptSerializer.
Según la versión de ASP.NET que se use en la aplicación web serán necesarios más o menos cambios en la configuración:
  • ASP.NET 2.0: hay que instalar ASP.NET AJAX en el servidor. Además hay que cambiar el httphandler asociado a los ficheros asmx en el web.config
        <httphandlers>
          <remove path="*.asmx" verb="*" />
          <add path="*.asmx" verb="*" validate="false"
               type="System.Web.Script.Services.ScriptHandlerFactory, 
                     System.Web.Extensions, Version=1.0.61025.0,
                     Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        </httphandlers>
  • ASP.NET 3.5: no es necesario instalar nada a mayores, ya que System.Web.Extendions ya está incluido en el framework. Las plantillas de visual studio deberían de contener la correcta configuración del httphandler para asmx, pero puedes confirmar si existe la correcta configuración en el web.config
    <remove path="*.asmx" verb="*" />
    <add path="*.asmx" verb="*" validate="false"
       type="System.Web.Script.Services.ScriptHandlerFactory, 
          System.Web.Extensions, Version=3.5.0.0,
          Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  • ASP.NET 4.0 o superior: no solo está todo incluido en el framework, además el httphandler asociado al asmx ya está configurado correctamente a nivel de machine.config, así que no es necesario tocar nada a nivel de aplicación.

A nivel de código en el servidor lo único que hay que hacer es anotar el servicio con el atributo [System.Web.Script.Services.ScriptService]

Por otro lado en el lado cliente, al ahora de hacer la petición al servidor tenemos que asegurarnos de lo siguiente:

  • La url será la del fichero asmx y el nombre del método separado por “/”. Suponiendo que tenemos el servicio persona.asmx con el método add, la url sería: localhost/servicios/persona.asmx/add
  • Por defecto las peticiones serán post, aunque se puede configurar para que acepten get, no está considerado una buena práctica
  • El content-type de la petición debe ser “application/json”


El JavaScriptSerializer no es el más rápido del mundo. Además, como ya hemos comentado anteriormente en nocompila.com, hay que tener en cuenta como formatea las fechas en JSON.

Aunque algunos desarrolladores puedan llamar a estos servicios REST por el mero hecho de utilizar JSON en los parámetros, tal y como hemos explicado anteriormente en nocompila.com a eso no se le puede llamar servicio REST. Es tan solo un servicio que devuelve JSON.

No hay comentarios:

Publicar un comentario