Consumiendo un servicio WCF (Windows Communication Foundation) en Xamarin

Hola que tal amigos, esta es la primer entrada en este blog en el que estaré compartiendo temas relacionados a .NET, y también es mi contribución al primer calendario de adviento de Xamarin en español organizado por el buen Luis Beltran.

El tema original con el que iba a contribuir al calendario de adviento era “Dependency Injection en Xamarin Forms con Autofac” pero decidí cambiarlo de ultimo minuto para poder ir desarrollando una pequeña aplicación para validar facturas y así tener temas de los cuales yo pueda ir blogueando, entonces no desesperen que les prometo que en un futuro hare el post de Xamarin y Autofac. (Pinky swear :v).

Dicho lo anterior les comento que vamos a aprovechar que en México el Servicio de Administración Tributaria (SAT) expone un SVC (Servicio WCF) con el cual vamos a estar trabajando, dicho servicio en ejecución podemos encontrarlo aquí:
https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc

Por otra parte la documentación de ese servicio podemos encontrarla aquí:
Web Service de Validación de CFDI

Construir cliente WCF en Windows

Lo primero que tenemos que hacer es construir un cliente WCF el cual se puede generar automáticamente mediante la herramienta de utilidad de metadatos de ServiceModel (SvcUtil. exe). Para esto los pasos a seguir son los siguientes:
Primero debemos navegar a la herramienta Svcutil.exe en la siguiente ubicación:

C:\Program Files\Microsoft SDKs\Windows\v1.0.\bin
ó
C:\Program Files(x86)\Microsoft SDKs\Windows\v1.0.\bin

En la siguiente imagen vemos que en este caso tengo mas de una version de “Tools” y que en lugar de estar en Program Files (Archivos de programa) la herramienta esta en Program Files (x86).

En este caso voy a entrar a la carpeta NETFX 4.6.1 Tools pero pude haber entrado a una de las carpetas que tienen una version superior, una vez dentro de la carpeta buscamos el archivo SvcUtil.exe

Una vez que ya vimos que si tenemos ese archivo abrimos el Command Prompt (Símbolo del sistema o cmd) en la ubicación donde se encuentra la herramienta SvcUtil y una vez ahi ejecutamos el siguiente comando.

SvcUtil.exe https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc /out:MiPath\ConsultaCFDIService.cs

donde MiPath lo deberán sustituir por la ruta en donde van a guardar el Cliente WCF por ejemplo en mi caso MiPath seria C:\Users\SaGon\OneDrive\Escritorio\Servicios; quedando el comando de la siguiente manera:

SvcUtil.exe https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc /out:C:\Users\SaGon\OneDrive\Escritorio\Servicios\ConsultaCFDIService.cs

Nota: En el comando anterior estamos usando el parámetro /out para indicarle la ruta en la cual queremos que se guarde y genere el cliente WCF en el caso de no usarlo debemos abrir el Command Prompt como Administrador lo que hará que el cliente WCF generado quede en la misma ubicación que la herramienta SvcUtil.exe. Para aprender más opciones de configuración pueden visitar la documentación oficial de SvcUtil para Windows. Los pasos anteriores nos darán como resultado el Cliente WCF:

Construir Cliente WCF en Mac

Para poder generar el Cliente WCF en mac vamos a instalar el nuget dotnet-svcutil tool for .NET Core, para lo cual abriremos la terminal y ejecutaremos el siguiente comando:

dotnet tool install --global dotnet-svcutil

Una vez instalada la herramienta dotnet-svcutil procedemos a generar el Cliente WCF con el siguiente comando:

dotnet-svcutil https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc --outputDir Services/ --outputFile ConsultaCFDIService.cs

Nota: En el comando anterior estamos usando los parámetros –outputDir y –outputFile para indicarle la ruta en la cual queremos que se guarde y genere el cliente WCF. Para aprender más opciones de configuración pueden visitar la documentación oficial de dotnet-svcutil. Lo anterior nos dará como resultado el siguiente Cliente WCF:

Consumiendo el Cliente WCF en un proyecto Xamarin

Una vez que tenemos nuestro cliente WCF generado vamos a crear un proyecto Xamarin, para ello abrimos nuestro Visual Studio y en este caso seleccionamos crear una app en blanco del tipo Xamarin. Forms.

Damos click sobre el botón Siguiente y configuramos el nombre de nuestra app, el identificador, si queremos que solo sea Android, iOS o ambos, también especificamos el tipo de proyecto en este caso seleccionaremos .NET Standard.

Damos click sobre el botón siguiente y configuramos nuestra solución, le asignaremos un nombre al proyecto y a la solución así como una ubicación y le indicamos si vamos a usar git como control de versiones en nuestro proyecto.

Una vez creado nuestro proyecto podemos hacer algunas modificaciones con respecto a la organización o estructura de nuestro proyecto, por ejemplo en mi caso hice 3 carpetas Data, Views, ViewModels y así no tener todos los archivos en la raíz de mi proyecto compartido. A continuación lo que vamos a hacer es agregar nuestro Cliente WCF a nuestro proyecto, en el ejemplo lo agregue dentro de mi carpeta Data pero cómo podemos ver en la siguiente imagen me marca unos errores debido a que no reconoce el tipo de dato System.ServiceModel.

Googleando un poco encontramos que podemos agregar el tipo de dato faltante haciendo uso del proyecto WCF Library Components el cual contiene la versión .NET Core de las bibliotecas de cliente de Windows Communication Foundation. Así que a continuación procedemos a instalar el siguiente nuget System.ServiceModel.Http.

Agregamos el package y le damos click en aceptar a la siguiente ventana

Y cómo podemos ver a continuación los errores desaparecieron

Finalmente vamos a crear una clase a través de la cual vamos a consumir el servicio que nos proporciona nuestro Cliente WCF.

En nuestro MainViewModel vamos a validar que el servicio nos este devolviendo una respuesta, así que a través de un Command mandaremos a llamar a nuestro método ValidarAsync el cual se encargara de realizar la Consulta.

Pero lamentablemente al momento de correr y probar la app ocurre un crash como vemos en la siguiente imagen

Esto se debe a que las aplicaciones de Xamarin no son compatibles con los métodos Task-based Asynchronous Pattern (TAP) generados para proyectos .NET Standard (bugzilla.xamarin.com Bug 51959). Por lo que deberemos trabajar con métodos sync. Para trabajar con métodos sync vamos a tener que generar nuestro Cliente WCF nuevamente pero ahora agregándole el parámetro –sync, es decir, el comando quedaría de la siguiente manera:

dotnet-svcutil https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc --outputDir Services/ --outputFile ConsultaCFDIService.cs --sync

Ahora en nuestro Cliente WCF disponemos de un método síncrono.

Y ahora si probamos nuestra app la cual por el momento solo consiste de un botón el cual al darle click ejecuta el método validar vemos que funciona sin problemas.

En caso de que quisiéramos consumir nuestro servicio de forma asíncrona necesitaríamos usar la herramienta SvcUtil.exe de Windows de la siguiente forma:

SvcUtil.exe https://consultaqr.facturaelectronica.sat.gob.mx/ConsultaCFDIService.svc /out:C:\Users\SaGon\OneDrive\Escritorio\Servicios\ConsultaCFDIService.cs /async /tcv:version35

De esta manera si usamos el parámetro /async junto con el parámetro /tcv:version35 para indicarle la version del .NET Framework podremos trabajar de forma async usando Event-Based Asynchronous Pattern (EAP). En los siguientes archivos podemos ver nuestro manager usando nuevo cliente el cual nos permíte trabajar de forma async mediante EAP.

Conclusión

Como pudieron ver para consumir un servicio WCF en Xamarin necesitamos generar el Cliente WCF usando la herramienta SvcUtil.exe la cual en Windows esta disponible como un ejecutable (exe) y con los parámetros adecuados podemos generar un archivo .CS que nos permite consumir el servicio ya sea de forma síncrona o asíncrona, por otra parte en Mac necesitamos instalar dotnet-svcutil pero solo nos permitirá consumir el servicio de forma síncrona.

Espero que este post sea util para la comunidad, en los siguientes post iremos agregando mas elementos a la UI entre otros features, pueden dejar en los comentarios sobre que tema les agradaría leer.

Happy Coding.
https://github.com/m3mo89/ValidadorDeFacturas/tree/consumir-servicio-wcf
https://github.com/m3mo89/ValidadorDeFacturas/tree/consumir-servicio-wcf-async

Published by Guillermo Tinoco

Ingeniero en Sistemas Computacionales por el Instituto Tecnológico de Tuxtla Gutierrez, me adentre al mundo de .NET en el año de 2012 y llevo trabajando con Xamarin desde el año 2016. Actualmente organizo eventos para la comunidad Chiapas Mobile .NET Developers Group.

Leave a comment

Your email address will not be published. Required fields are marked *