He aquí una manera sencilla de hacerlo es como lo hicimos en clase, solo hay que seguir los siguientes pasos:
Paso 1: Crear una biblioteca de C#
Inicia Visual Studio 2010, creamos una solución en blanco y agregamos una biblioteca en C# llamada 'Services'.
Paso 2: Definamos ahora un servicio Restful y Dto.
Para crear un servicio WCF que gestiona una petición GET, debemos definir la siguiente interfaz y la implementación que muestro a continuación.
IInvoiceService.cs
using System.ServiceModel;
using System.ServiceModel.Web;
namespace Services
{
[ServiceContract]
public interface IInvoiceService
{
[WebGet(UriTemplate = "/invoices")]
[OperationContract]
InvoiceDto[] GetAllInvoices();
}
}
InvoiceService.cs
namespace Services
{
public class InvoiceService : IInvoiceService
{
public InvoiceDto[] GetAllInvoices()
{
return new[] { new InvoiceDto(1, "receiver1"), new InvoiceDto(2, "receiver2") };
}
}
}
Para importar estos atributos tendremos que agregar referencias System.ServiceModel y System.ServiceModel.Web
Luego agregamos los Dto. Los Dto's necesitan estar marcados con los atributos DataContract y DataMember para que puedan ser serializado por WCF.
InvoiceDto.cs
using System.Runtime.Serialization;
namespace Services
{
[DataContract(Namespace = "")]
public class InvoiceDto
{
public InvoiceDto(int id, string receiver)
{
Id = id;
Receiver = receiver;
}
[DataMember]
public int Id { get; set; }
[DataMember]
public string Receiver { get; set; }
}
Paso 3: Alojamiento
Hay un montón de maneras para hostear un servicio WCF restful. Se podría crear una aplicación de consola y alojarlo ahí. Se podría crear un nuevo sitio web ASP.NET (con WCF habilitado) y hostearlo ahí.
Sin embargo, por simplicidad (y porque así es como lo estamos tratando en nuestro proyecto) creemos un "WCF Service Application' de la siguiente manera.
Nuestro nuevo proyecto Host se crea con un archivo svc. Ahora el proyecto tiene un archivo svc por servicio.
En nuestro caso, no es necesario el Service1 que se crea por defecto y que viene con la aplicación (de aquí en adelante eliminaremos o modificaremos aquellos archivos que se crean con el proyecto).
Ahora, modificaremos el archivo Service1.svc y demás referencias.
<%@ ServiceHost Service="Services.InvoiceService" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
Esta WebServiceHostFactory es una nueva clase introducida en WCF 3,5 para hacer servicios WCF Restful. Mediante su uso, no se necesita ninguna configuración WCF en nuestro archivo WebConfig.
De hecho, para el propósito de esta demostración completamente puede deja vacío el web.config, como se muestra a continuación.
Host del WCF / web.config
<?xml version="1.0"?>
<configuration>
Paso 4: Poner a prueba nuestro servicio en el navegador.
Ahora bien, si todo funciona, deberíamos ser capaces de hacer clic derecho en Service1.svc de nuestro proyecto creado y seleccionar la opción 'Ver en el explorador'.
Esto lanzará nuestro servicio y mostrará una página en blanco con el mensaje "End point not found'. Eso está bien.
La verdadera prueba para nosotros es cuando añadimos la extensión GET '/ invoices' a la URL. Cuando hacemos eso, deberíamos obtener algo como esto:
Algo a tener en cuenta ...
Ahora bien, vemos que es fácil crear un servicio en WCF.
Pero no podemos autogenerar proxies del lado del cliente utilizando WCF.
Rest (HTTP) no es lo mismo que WSDL (SOAP contract es utilizado por Visual Studio para crear los proxies).
No se puede crear automáticamente servidores proxy. Pero esto puede cambiar en futuras versiones de WCF (y que Microsoft ha indicado que va a ser mucho más fácil trabajar con Resftul). Pero por ahora, para llamar a este servicio desde una prueba unitaria, tenemos que crear nuestro propio proxy o trabajar con uno básico de .NET Http Constructos como WebHttpRequest y WebHttpResponse, como se muestra a continuación.
using System.Net;
using NUnit.Framework;
namespace Test
{
[TestFixture]
public class When_calling_a_restful_service
{
[Test]
public void Should_get_proper_HTTP_codes_and_headers()
{
var url = "http://localhost:49619/Service1.svc/invoices";
var request = (HttpWebRequest)WebRequest.Create(url);
var response = (HttpWebResponse)request.GetResponse();
Assert.AreEqual(200, (int)response.StatusCode);
}
}
}
Estas son algunas de las cosas que estamos aprendiendo a medida que repunte algunas cosas de implementación como Restful con WCF, SOAP, etc. Espero les haya gustado.