You are on page 1of 4

MIGRACIN DE UN PROYECTO C# .

NET A WCF: Para hacer el cambio a WCF he cambiado las 3 capas de Acceso a datos, Negocio y Cliente que estaban en 3 soluciones distintas dentro del mismo proyecto por 2 proyectos distintos. 1. Proyecto Cliente 2. Sitio web WCF Cliente se ha quedado igual. Una vez est arrancado el sitio web se puede hacer Add service referente y poner la direccin concreta de cada servicio. En el sitio web he creado 2 servicios: ServiceArbol y ServiceMostrarDatos. Estos dos servicios corresponden a la capa de negocios. La capa de base de datos tambin est en el sitio web, pero no como servicio ya que el cliente no la utiliza. La clase de BaseDatos.cs se queda igual. Clases antes de WCF: Solucin Negocio: Arbol, Item, MostrarDatos, Hotel, Subexpediente Solucin AccesoDatos: BaseDatos En el ServiceArbol.cs he puesto la clase Arbol y la clase Item. La clase Item es un DataContract y la clase Arbol est creada con ServiceContract. En el ServiceMostrarDatos.cs he puesto la clase MostrarDatos, Subexpediente y Hotel. Las clases Subexpediente y Hotel estn como DataContract. La clase MostrarDatos est creada con ServiceContract. Servicio ServiceArbol: (el de MostrarDatos sigue esta misma estructura pero con 2 DataContract en lugar de slo uno)
[ServiceContract()] public interface IArbol { [OperationContract] System.Collections.Generic.List<Item> CargarDivisiones(); [OperationContract] List<Item> CargarPaises(string d); [OperationContract] List<Item> CargarRegiones(string p); [OperationContract] List<Item> CargarExpedientes1(string p); [OperationContract] List<Item> CargarExpedientes2(string p, string r); [OperationContract] List<Item> CargarSubexpedientes(string e); [OperationContract] void SetFiltro(bool rev, bool cer, bool fir, bool cur); } public class Arbol : IArbol { ArbolExp arbol = new ArbolExp(); //No he puesto constructor porque WCF no va con constructor. //He puesto este new ArbolExp arriba porque sino tena que ponerlo //por cada procedimiento, lo cual no tena sentido ya que creara

//un objeto distinto cada vez que quisiese llamar a un //procedimiento de aqu. public List<Item> CargarDivisiones () { return arbol.CargarDivisiones(); } public List<Item> CargarPaises(string d) { return arbol.CargarPaises(d); } public List<Item> CargarRegiones(string p) { return arbol.CargarRegiones(p); } public List<Item> CargarExpedientes1(string p) { return arbol.CargarExpedientes1(p); } public List<Item> CargarExpedientes2(string p, string r) { return arbol.CargarExpedientes2(p,r); } public List<Item> CargarSubexpedientes(string e) { return arbol.CargarSubexpedientes(e); } public void SetFiltro(bool rev, bool cer, bool fir, bool cur) { arbol.SetFiltro(rev, cer, fir, cur); } } public class ArbolExp { private string filtroestado; public ArbolExp() {} public List<Item> CargarDivisiones() {} public List<Item> CargarPaises(string d) {} public List<Item> CargarRegiones(string p) {} public List<Item> CargarExpedientes1(string p) {} public List<Item> CargarExpedientes2(string p, string r) {} public List<Item> CargarSubexpedientes(string e) {} public void SetFiltro(bool rev, bool cer, bool fir, bool cur) {} public string GetFiltro()

{} } [DataContract] public class Item { private string nombre; private string codigo; [DataMember] public string Nombre { get set } [DataMember] public string Codigo { get set } }

He creado la clase ArbolExp en lugar de poner todo el cdigo en la clase Arbol para poder poner ms de una clase en este servicio. Si quiero juntar varias operaciones de distintas clases en el servicio desde la clase que tiene el OperationContract se puede llamar a la clase que interese, que est en el mismo servicio pero separada abajo. En la clase Arbol no he puesto constructor porque WCF no lleva constructor. He puesto un new ArbolExp al principio de la clase porque sino tena que ponerlo por cada procedimiento y creaba un objeto distinto cada vez que llamaba a una operacin de esta clase, lo cual no tiene mucho sentido. Ver en el cdigo, donde est el comentario. La clase Item es un DataContract. Haba pensado poner todas las estructuras de datos que sean DataContract en un servicio aparte. Entonces ira Item, Subexpediente y Hotel en un servicio llamado ServiceDatos. Adems aqu se podra poner la operacin de inicializar las 3 clases en vista que con DataContract tampoco se puede poner constructor. El problema de poner un servicio aparte para estos datos es que una vez importados todos los servicios detecta que hay 2 tipos de Hotel y del resto. Esto ocurre cuando el mismo DataContract se utiliza en ms de un servicio. La solucin a esto es indicarle de que servicio tiene que cogerlo cada vez. El app.config del cliente se modifica automticamente cuando se hace el Add service reference o el Update. Cdigos de configuracin en el sitio web: ServiceArbol.svc:
<% @ServiceHost Language=C# Debug="true" Service="Arbol" CodeBehind="~/App_Code/ServiceArbol.cs" %>

ServiceMostrarDatos.svc:
<%@ ServiceHost Language="C#" Debug="true" Service="MostrarDatos" CodeBehind="~/App_Code/ServiceMostrarDatos.cs" %>

Web.config: (Tiene la configuracin de los servicios. Ahora tambin tiene la configuracion de la base de datos, antes estaba en el App.config del cliente)
<?xml version="1.0"?> <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <appSettings> <!-- El proveedor ADO.NET --> <add key="PROVEEDOR_ADONET" value="System.Data.OracleClient" /> <!-- La cadena de conexion --> <add key="CADENA_CONEXION" value="Data Source=ejemplo;Persist Security Info=True; User ID=zzz;Password=zzz;Unicode=True"/> </appSettings> <system.serviceModel> <services> <service name="Datos" behaviorConfiguration="DatosBehavior"> <endpoint contract="IDatos" binding="wsHttpBinding"/> </service> <service name="Arbol" behaviorConfiguration="ArbolBehavior"> <endpoint contract="IArbol" binding="wsHttpBinding"/> </service> <service name="MostrarDatos" behaviorConfiguration="MostrarDatosBehavior"> <endpoint contract="IMostrarDatos" binding="wsHttpBinding"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="DatosBehavior" > <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> <behavior name="ArbolBehavior" > <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> <behavior name="MostrarDatosBehavior" > <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> <system.web> <compilation debug="true" /> </system.web> </configuration>

You might also like