menú
¿Música de YouTube sin molestos comerciales? ¡Ahora es posible!
TubeFiesta es una aplicación que te permite reproducir música de YouTube como un reproductor tradicional.
Crear listas, reproducción aleatoria, repetir, y hasta exportar el video a otra pantalla.
Conocer más Ir a tfiesta.com

Servicios WCF: Consumir por REST y SOAP simultaneamente

Publicado el 17/05/2014 | 8381 visitas

Regresando nuevamente de unos días con mucho trabajo quiero compartir con ustedes este tutorial para construir un servicio web con tecnología WCF y lo expondremos por SOAP y REST simultáneamente.

wcf rest & soap eledwin.com

Antes de ir al código prestemos atención a la imagen anterior. Normalmente esto sería lo que yo hago si tuviera que exponer información hacia uno o varios aplicativos en mismas o diferentes plataformas y tecnologías.

Para realizar este tutorial vamos a suponer que es un sistema de compras online y vamos a exponer una API publica para consulta de productos.

Vamos a exponer por SOAP hacia una aplicación de escritorio y por REST hacia un sitio Web que consumiremos por Ajax.

Entendiendo los conceptos básicos WCF, SOAP y REST

Ya que no es tema de este tutorial contextualizarnos sobre estas tecnologías voy simplemente a citar algunos sitios donde podrán conocer en caso de que no tengan ni idea de que se trata esto.

WCF

SOAP

REST

Sabiendo esto, vamos a iniciar la construcción de nuestro pequeño proyecto en Visual Studio 2010 y Framework 4.0 o superior.

Vamos a crear una nueva aplicación Web vacia o ASP.NET Empty Web Application que yo llamaré MiMercado.
crear aplicación asp vacía

En este, creare una carpeta llamada Services y en esta carpeta voy a crear mi Servicio WCF haciendo clic derecho sobre la carpeta, Añadir, Nuevo elemento y buscamos "Servicio WCF Habilitado para AJAX" o "AJAX-enabled WCF Service" que llamaremos "MiMercadoService.svc".

crear servicio wcf habilitado para ajax
Este no es más que un servicio WCF común, lo que pasa al crear un servicio habilitado para AJAX es que se añaden algunos atributos adicionales en el archivo de configuración e Interfaz, propiedades y configuraciones que podemos añadir manualmente sin ningún inconveniente.

Que tenemos al crear el nuevo servicio WCF?

Archivo MiMercadoService.svc.cs

Este archivo es la implementación del servicio web. Aqui se especifican cada uno de los métodos u Operaciones de contrato (Operation Contract). Cada uno de estos métodos será expuesto siempre y cuando tenga la propiedad [OperationContract] sobre el mismo. Como ejemplo tenemos el método public void DoWork().

Adicionalmente, veamos que en la definición de la clase tenemos otras propiedades que son ServiceContract y AspNetCompatibilityRequirements, este segundo habilita la compatibilidad con ASP.NET.

Archivo Web.Config

Aqui podemos evidenciar que se ha creado un nuevo nivel de configuración llamado system.serviceModel, aquí se configuran los servicios WCF.

Tenemos los services que son la definición de cada uno de los servicios que tengamos, los behaviors son la configuración de los comportamientos de estos servicios y finalmente serviceHostingEnvironment que nos permite establecer parámetros de configuración para el host de servicios en general.

Configurar EndPoint REST y SOAP en WCF

En WCF existe un concepto llamado EndPoint, esto en palabras simples son puntos de acceso en el servidor, podemos verlo como ejecutar un escuchador de solicitudes. En este caso crearemos un EndPoint para recibir las solicitudes REST y otro para las solicitudes SOAP. Para hacer esto nos ubicamos en la sección de services del archivo web.config. Encontraremos algo similar a esto:

<services>
    <service name="MiMercado.Services.MiMercadoService">
        <endpoint address="" behaviorConfiguration="MiMercado.Services.MiMercadoServiceAspNetAjaxBehavior" binding="webHttpBinding" contract="MiMercado.Services.MiMercadoService" />
    </service>
</services>

Este EndPoint existente recibe solicitudes REST ya que tiene el webHttpBinding; lo único que haremos es establecer un address para que por medio de la url del servicio podamos diferenciar este EndPoint con el otro que vamos a crear enseguida.

No explicaré el address por ahora, pero su uso será evidente cuando consumamos el servicio, así que no te preocupes.

Al atributo address pondremos el valor "rest", que perfectamente puede ser cualquier valor que desees. Nuestro endPoint quedará así:

<endpoint address="rest" behaviorConfiguration="MiMercado.Services.MiMercadoServiceAspNetAjaxBehavior" binding="webHttpBinding" contract="MiMercado.Services.MiMercadoService" />

En la sección <endpointBehaviors> encontramos una etiqueta <enableWebScript /> la cual debemos reemplazar por <webHttp helpEnabled="true"/>

<endpointBehaviors>
    <behavior name="MiMercado.Services.MiMercadoServiceAspNetAjaxBehavior">
        <webHttp helpEnabled="true"/>
    </behavior>
</endpointBehaviors>

Ahora ya tenemos nuestro servicio listo para ser consumido por REST. Cómo lo indicaba anteriormente, debemos crear un EndPoint para SOAP, así que añadiremos uno nuevo, exactamente después del que ya tenemos creado para REST.

Todo quedará así:

<services>
    <service name="MiMercado.Services.MiMercadoService" behaviorConfiguration="DefaultBehavior">
        <endpoint address="rest" behaviorConfiguration="MiMercado.Services.MiMercadoServiceAspNetAjaxBehavior" binding="webHttpBinding" contract="MiMercado.Services.MiMercadoService" />
        <endpoint address="" binding="basicHttpBinding" contract="MiMercado.Services.MiMercadoService" />
    </service>
</services>

Como pueden ver, este último EndPoint no tiene un address (podemos ponerle uno pero para fines prácticos me gusta sin él), el binding es diferente (basicHttpBinding) y hemos quitado el atributo behaviorConfiguration. Este último es opcional y podemos establecerlo para hacer configuraciones más avanzadas que para este tutorial no necesitamos.

Si estás poniendo buena atención notarás que también agregamos un atributo a la etiqueta <service> llamado behaviorConfiguration, esto servirá para especificar un comportamiento diferente al servicio.

Ya que establecimos el valor DefaultBehavior debemos definir este behavior en la sección de <serviceBehaviors> que por cierto, debemos añadirla inmediatamente después (o antes) de la sección <endpointBehaviors>. Para finalizar, nuestro serviceModel queda de la siguiente manera:

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
            <behavior name="MiMercado.Services.MiMercadoServiceAspNetAjaxBehavior">
                <webHttp helpEnabled="true"/>
            </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="DefaultBehavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
        <service name="MiMercado.Services.MiMercadoService" behaviorConfiguration="DefaultBehavior">
            <endpoint address="rest" behaviorConfiguration="MiMercado.Services.MiMercadoServiceAspNetAjaxBehavior" binding="webHttpBinding" contract="MiMercado.Services.MiMercadoService" />
            <endpoint address="" binding="basicHttpBinding" contract="MiMercado.Services.MiMercadoService" />
        </service>
    </services> 
</system.serviceModel>

Añadir funcionalidad al servicio

Tenemos un servicio web WCF que responde a solicitudes SOAP y REST, pero solo tiene un método DoWork() que no hace nada; bien, la tarea ahora es crear funciones que hagan algo, y como estamos haciendo una tienda pues lo inicial será retornar una lista de productos.

Para comenzar, creemos una clase que nos transportará la información, esta la llamaremos Producto

[DataContract]
public class Producto
{
    [DataMember]
    public int ProductoID { get; set; }
    [DataMember]
    public string Nombre { get; set; }
    [DataMember]
    public double Precio { get; set; }
}

A las clases con las que vamos a transportar información debemos agregarle la propiedad [DataContract] y a cada atributo de la clase el [DataMember].

Ahora vamos a crear un método que retorne una lista de productos.

[WebGet(UriTemplate = "/productos", ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
public List<Producto> ListarProductos()
{
    // Crear lista de productos y añadir elementos
    List <Producto> productos = new List<Producto>();
    productos.Add(new Producto()
    {
        ProductoID = 0,
        Nombre = "Motorola Moto G",
        Precio = 4500000
    });
    productos.Add(new Producto()
    {
        ProductoID = 1,
        Nombre = "Sony Vaio Ultra",
        Precio = 950000
    });
    productos.Add(new Producto()
    {
        ProductoID = 2,
        Nombre = "IPhone 6",
        Precio = 905000
    });
    return productos;
}

Bien, tenemos un método común y corriente con dos propiedades "extrañas":

[OperationContract] que nos permite habilitar el método para que sea expuesto por medio del servicio, esto nos dice que sin esta propiedad no podríamos invocarlo ya que no estaría disponible.

[WebGet] expone este servicio para una solicitud HTTP GET (Si leíste sobre REST sabrás mas o menos de que se trata). Para esto especificamos un UriTemplate con valor "/productos" para que por medio de la url invoquemos localhost/productos en lugar de localhost/ListarProductos.

La configuración [WebGet] y [WebInvoke] son únicamente para REST, si quieres trabajar simplemente con SOAP no necesitas establecer estas propiedades.

Ahora podemos probar nuestro método de consulta ejecutando nuestro proyecto Web.

Cómo probar servicio Web REST y SOAP

Para probar un servicio REST existen varias herramientas de uso libre y muy buenas que podemos utilizar, entre las que he explorado encuentro las siguientes como aplicaciones de Google Chrome: Postman Rest Client, Rest Console, Advanced Rest Client. Encontrarás muchas más y no solo para Google Chrome, también para Firefox y para escritorio, es cuestión de buscar.

Para solicitudes REST de tipo GET también puedes utilizar el explorador de Internet así:

consumir servicios rest get

Talvez te interese...

Tutorial de sockets en c# con ejemplos - Parte 2 - UDP
Tutorial de sockets en c# con ejemplos - Parte 1
[solución] No puede obtener acceso a la página solicitada debido a la configuración de la extensión
[solución] El proveedor de almacenamiento especificado no se encuentra en la configuración
blog comments powered by Disqus