Inicio > asp.net > Wcf rest services, alternativa a servicios Soap

Wcf rest services, alternativa a servicios Soap

miércoles, 3 de agosto de 2011 Dejar un comentario Ir a comentarios

windows communication rest serviceEn las entradas web service o wcf y web service o wcf parte ii comentamos la arquitectura soa, la base para construir aplicaciones para esta arquitectura, web service/wcf,  y que una de las ventajas de desarrollar en los estándares Soap/wsdl es la multitud de herramientas y fabricantes que lo han adoptado y por tanto facilitan el desarrollar con ellos.  Pero no siempre que queramos desarrollar servicios en la web tenemos por que seguir el estándar Soap/wsdl, de hecho esta manera de hacerlo está menos ligada a como funciona internet, si seguimos como en el protocolo http que no mantenga estado, identificado únicamente por la Uri, funcionalidad expuesta por http get, post, put, delete y que sea cacheable estaremos hablando de un Rest web service. En esta entrada veremos cómo programar un web service que siga estos requisitos, en concreto con Wcf .net 4. Para empezar nos referiremos a Visual Studio 2010 y tenemos dos posibilidades, elegir un proyecto Wcf service application o bien el template para proyecto Wcf Rest Service 4.0, optamos por esta segunda opción para nuestro ejemplo ya que viene particularmente preconfigurada para hospedar en servidor web que es lo que queremos. Si optáramos por la primera deberíamos reescribir parte del código. En cuanto al intercambio utilizaremos xml, aunque podría usarse Json, y el cliente que consumirá el servicio será del tipo channelfactory, aunque podríamos elegir WebServiceHost o HttpClient. En el proyecto tenemos los ficheros service1.cs, donde se implementa el servicio,  SimpleItem.cs un tipo de dato por defecto para el caso que queramos usarlo y global.asax y web.config. En estos dos últimos ficheros es donde está la configuración del Wcf Rest Service, por un lado global.asax usa la nueva característica de routing en .net 4.0 y en web.config tenemos el endpoint y la compatibilidad para hospedar en servidor web. La implementación de service1.cs trata de una funcionalida que devuelve los datos de un contacto a partir de leer un identificador,


...

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
 public class Service1 : IService1
 {
 // TODO: Implement the collection resource that will contain the SampleItem instances

 List<SampleItem> contactos = new List<SampleItem>();
 SampleItem storeitem = new SampleItem();

 public List<SampleItem> GetCollection()
 {
 // TODO: Replace the current implementation to return a collection of SampleItem instances
 return new List<SampleItem>() { new SampleItem() { Id = "1", StringValue = "contacto 1" }, new SampleItem() { Id = "2", StringValue = "contacto 2" }, new SampleItem() { Id = "3", StringValue = "contacto 3" } };
 }

 public SampleItem Create(SampleItem instance)
 {
 // TODO: Add the new instance of SampleItem to the collection
 throw new NotImplementedException();
 }

 public  SampleItem Get(string id)
 {
 // TODO: Return the instance of SampleItem with the given id
 //  return this.Store.FirstOrDefault(item => item.Id.ToString().Equals(id));
 return new SampleItem() { Id = id, StringValue = "hola contacto " +id };
 throw new NotImplementedException();
 }

 public SampleItem Update(string id, SampleItem instance)
 {
 // TODO: Update the given instance of SampleItem in the collection
 throw new NotImplementedException();
 }

 public void Delete(string id)
 {
 // TODO: Remove the instance of SampleItem with the given id from the collection
 throw new NotImplementedException();
 }

 }

Por un lado accediendo a GetCollection() nos devuelve todos los contactos y Get(string id) nos devuelve los datos de un contacto. En el lado del cliente que consume el Wcf Rest Service es una aplicación web que permite bien elegir un item para consultar o recuperar una lista con todos los contectos.


public partial class _default : System.Web.UI.Page
{
 protected void Page_Load(object sender, EventArgs e)
 {

 }
 protected void Button1_Click(object sender, EventArgs e)
 {
 string item = DropDownList1.SelectedItem.Value;
 using (ChannelFactory<IService1> cf = new ChannelFactory<IService1>(new WebHttpBinding(), "http://localhost:57566/service1"))
 {
 cf.Endpoint.Behaviors.Add(new WebHttpBehavior());
 IService1 channel = cf.CreateChannel();
 SampleItem storeitem = new SampleItem();
 storeitem = channel.Get(item);
 Label2.Text = storeitem.Id;
 Label1.Text = storeitem.StringValue;

 }

 }
 protected void Button2_Click(object sender, EventArgs e)
 {
 using (ChannelFactory<IService1> cf = new ChannelFactory<IService1>(new WebHttpBinding(), "http://localhost:57566/service1"))
 {
 cf.Endpoint.Behaviors.Add(new WebHttpBehavior());
 IService1 channel = cf.CreateChannel();
 List<SampleItem> listaitem = new List<SampleItem>();
 listaitem = channel.GetCollection();
 int num = listaitem.Count;
 Response.Write("<table>");
 for (int i = 0; i < listaitem.Count; i++)
 {
 Response.Write("<tr><td>" + listaitem[i].Id + "</td><td>" + listaitem[i].StringValue + "</td></tr>");
 }
 Response.Write("</table>");
 }
}

}

Con estas lineas tenemos un sencillo ejemplo de cómo usar las nuevas posibilidades que nos ofrece .net 4.0 para construir Wcf Rest Service. Tendríamos finalmente una solución con los dos proyectos,

WcfRestServiceSolutionel proyecto WCFRestservice1, creado a partir del template Wcf Rest Service 4.0 y ClientWcfRest, una website. Como vemos se simplifica la configuración, ya que contrariamente que en .net 3.5, no es necesario un fichero .svc para alojar en servidor web y por otro lado la posibilidad de routing hace que las urls por las que accedemos a las funcionalidades expuestas sean significativas respecto a éstas. Además, tal como ya incorporaba el wcf rest starter kit, tenemos una página de ayuda que puede consultarse en http://host:puerto/service/help.

{lang: 'es'}
Categories: asp.net Tags: , ,
  1. Sin comentarios aún.
  1. Sin trackbacks aún.
Debes estar registrado para dejar un comentario.