Web service o wcf
Los sistemas de información, sobre todo a medida que alcanzan cierta complejidad, hacen necesario su planificación y definición a varios niveles. En el nivel más alto de planificación de un software está la arquitectura del sistema de información. Los paradigmas que se han seguido a este nivel han sido múltiples, con la vista puesta en mejorar la escalabilidad, acoplamiento, mantenimiento del sistema de información. En los últimos años un tipo de arquitectura en la que se han basado un importante porcentaje de nuevas aplicaciones, ha sido la arquitectura orientada a servicios, su bajo nivel de acoplamiento y su sencilla interoperatibidlad la hacen ideal para los actuales sistemas distribuidos en red. En esta entrada nos referiremos a los componentes en que se basa una arquitectura Soa, los web services, y en lo que es su generalización wcf. Aunque para cada una de las versiones de .net Microsoft publicó lo que llama Web Services Enhancements (WSE), que permite utilizar comunicación por tcp, identificación, en este ejemplo utilizaremos el estándar WS- *donde el servicio se describe por medio de wsdl y el intercambio es a través de mensajes soap, en concreto es parte del código de la aplicación gestión de empresas. Esta aplicación usa un web service «GetData.asmx» para el acceso a datos, para ellos desde visual studio creamos un proyecto web independiente y agregamos un elemento .asmx.
using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Configuration; using System.Data; using System.Data.SqlClient; [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class GetEmpresas : System.Web.Services.WebService { private DataSet AdminDatos; public GetEmpresas () { //Uncomment the following line if using designed components //InitializeComponent(); } [WebMethod] public DataSet GetAdminData() { // Método para administración de empresas string sqlcmd; SqlConnection ConEmp; SqlDataAdapter DataAdaptEmpresas; sqlcmd="SELECT ident, nombreemp, direccion, telefono, personacont FROM empresas"; ConEmp = new SqlConnection(); ConEmp.ConnectionString = ConfigurationManager.ConnectionStrings["empresasConnectionString"].ConnectionString; DataAdaptEmpresas = new SqlDataAdapter(sqlcmd, ConEmp); AdminDatos=new DataSet(); DataAdaptEmpresas.Fill(AdminDatos, "empresas"); return (DataSet)AdminDatos; } }
El código es una clase donde se han sombreado los atributos que la distinguen como un web service, así como el método que nos proporciona la funcionalidad. Únicamente los métodos declarados como «[WebMethod]» serán accesibles desde la aplicación cliente. Esta va a ser otra aplicación web, que creamos en la misma solución, y en la referenciaremos el webservice a través del fichero .asmx.
<s:element name="GetAdminData"> <s:complexType /> </s:element> <s:element name="GetAdminDataResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="GetAdminDataResult"> <s:complexType> <s:sequence> <s:element ref="s:schema" /> <s:any /> </s:sequence> </s:complexType> </s:element> </s:sequence> </s:complexType> </s:element> ... public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { DatosEmpresa(); } ... protected void DatosEmpresa() { WsDatosEmpresa.GetEmpresas DatosEmpresa = new WsDatosEmpresa.GetEmpresas(); DataSet Datoslocales; Datoslocales = new DataSet(); Datoslocales = DatosEmpresa.GetAdminData(); GridView1.DataSource = Datoslocales.Tables["empresas"].DefaultView; GridView1.DataBind(); return; } }
Como en el párrafo anterior se han sombreado las lineas donde primero se describen los métodos disponibles en el web service y el código que hace uso del proxy que permite el acceso a éste. En este caso se hace uso de un WS-* pero desde la versión .net 3.0 está disponible wcf, en una próxima entrada veremos cómo conseguir esta misma funcionalidad sobre este nuevo estándar para programación distribuida de Microsoft.