Crear y publicar una aplicación WCF (Parte 3)

En la primer entrada de esta mini serie de artículos comenzamos a ver las bases para crear una base de datos que utilizaríamos, en la segunda entrada vimos como crear y publicar un servicio web ASP.NET, ahora la idea es hacer exactamente lo mismo pero con una aplicación WCF para abarcar diferentes escenarios.

Así que vamos a comenzar por crear la aplicación WCF

Escoge la opción de WCF Service Application, recuerda en esta ocasión escoger el Framework 4.

NuevoServicioWCF

La estructura de tu proyecto quedará de la siguiente manera.

EstructuraWCF

La clase IService.cs nos servirá como interfaz de nuestro proyecto, es decir, aquí será en donde coloquemos las funciones públicas que permitiremos que puedan ser accedidas vía web. La clase Service1.svc.cs será la encargada de colocar toda la funcionalidad requerida de nuestro servicio, por ahora esas dos clases son las que nos interesan. Para continuar da clic derecho en tu proyecto y selecciona la opción Add>New Item, ahí en la sección Data elige Linq to SQL Classes.

La pantalla en blanco te servirá para comenzar a crear tu modelo de datos simplemente arrastrando tus tablas (para esto debiste haber creado ya una conexión a tu base de datos desde tu pestaña de Server Explorer).

Server Explorer

Ya con tu modelo creado y tu tabla agregada, entonces podremos comenzar a crear los mismos tres métodos que vimos en el artículo anterior, comenzaremos en la clase Service1.svc.cs creando las operaciones.

Para empezar podrás notar que la clase hereda las propiedades de la clase IService1, es por ello que trabajan de una forma muy vinculada.

Como mencioné en el artículo anterior, en el servicio web ASP.NET mostré una forma de hacerlo completamente diferente, pero aclaro que de esta manera también podría ser hecho, mi intención es demostrar la forma mas antigua y básica que hay así como la que a mi gusto no solo es la mas nueva, sino que la mas sencilla.

Lo primero que debemos hacer es declarar un objeto de tipo ModeloDatosDataContext, esta clase puede variar de acuerdo a como nombraste a tu modelo anterior y será justamente eso, un contexto, un comunicador entre tus tablas inlcuidas dentro de tu modelo y tus operaciones. La sintaxis es la siguiente.

ModeloDatosDataContext contexto;

Consultar información

Este método nos dará toda la información de nuestros contactos.

public List<Contacto> MostrarTodosLosContactos()
{
contexto = new ModeloDatosDataContext();
List<Contacto> listaResultado = (from l in contexto.Contactos
select l).ToList();
return listaResultado;
}

Creamos un método que nos regresará una lista del mismo tipo de la clase que necesitamos obtener, de esta forma y utilizando una sentencia LINQ muy sencilla obtendrás todos los registros.

 

Insertar registros

Este método nos dará la posibilidad de insertar nuevos registros en nuestra tabla.

public bool InsertarContacto(Contacto nuevoContacto)
{
contexto = new ModeloDatosDataContext();
contexto.Contactos.InsertOnSubmit(nuevoContacto);
contexto.SubmitChanges();
return true;
}

Esto es sumamente sencillo, utilizando el argumento recibido, el método InsertOnSubmit de la clase Contactos de nuestro modelo se encargará de agregar la nueva entidad y mantenerla en espera de poder ser ingresada y le método SubmitChanges termina la operación insertando los datos en la tabla correspondiente.

Actualizar registros

Este método nos dará la posibilidad de modificar a los registros que ya tenemos, ya sea en uno solo o en todos sus atributos.

public bool ActualizarContacto(Contacto contactoActualizado)
{
contexto = new ModeloDatosDataContext();
ModeloDatosDataContext contextoOriginal = new ModeloDatosDataContext();
 
Contacto contacto = (from c in contextoOriginal.Contactos
where c.ID == contactoActualizado.ID
select c).Single();
 
contexto.Contactos.Attach(contactoActualizado, contacto);
contexto.SubmitChanges();
return true;
}

Aquí debido a utilizaremos un contexto para consultar nuestra información, simplemente debemos crear un objeto del mismo tipo para que uno pueda consultar y el otro se pueda encargar de ingresar la información, la mecánica es la misma que en el método de inserción, pero utilizarás el método Attach junto a sus dos parámetros requeridos.

Ya que tenemos los tres métodos que estarás utilizando, vete ahora a tu clase IService.cs y aquí debes crear los contratos para permitir a tus métodos ser operaciones accesibles desde la web. Tu clase debe quedar de la siguiente forma.

[ServiceContract]
public interface IService1
{
[OperationContract]
List<Contacto> MostrarTodosLosContactos();
 
[OperationContract]
bool InsertarContacto(Contacto nuevoContacto);
 
[OperationContract]
bool ActualizarContacto(Contacto contactoActualizado);
 
}

Ya teniendo todo esto listo, presiona F5 para ejecutar tu servicio (ten la pestaña de IService1.cs en pantalla) y el resultado será así.

Listado

Selecciona la ruta remarcada en la imagen de arriba y lo que obtendrás será esta pantalla.

ServicioWCF

La primer diferencia que notarás con respecto a los servicios ASP.NET es que estos no exponen los métodos que contienen, la única forma de poder acceder a ellos es mediante un cliente, y eso es justamente lo que haremos, detén la ejecución y ahora ejecuta de nuevo, pero con la clase Service1.svc.cs en primer plano, de esta manera ejecutarás de manera automática una aplicación llamada WCF Test Client, que te permitirá ver tus métodos y trabajar con ellos.

WCFTestClient

Si todo está en orden, entonces podrás publicar tu aplicación. El proceso es exactamente el mismo que en el artículo anterior, para no redundar en la información puedes ver la sección “Publicar mi servicio en IIS”, pero hay una diferencia al momento de convertir tu carpeta en aplicación.

PublicarWCF

Cuando aparece el cuadro de diálogo de “Agregar aplicación”, en este caso deberás cambiar el Grupo de aplicaciones con el que publicarás, en lugar de utilizar DefaultAppPool selecciona ASP.NET v4.0 como se ve en la imagen.

GrupoAplicaciones

Si ya tienes tu carpeta virtual lista, sigue el mismo procedimiento que en el servicio web ASP.NET para publicar vía Visual Studio 2010. Cuando tu servicio web haya sido satisfactoriamente publicado, ve a un explorador y escribe una dirección con los siguientes términos http://NombreDeTuServidor/NombreDeTuCarpetaVirtual/NombreDeTuServicio.svc en mi caso el resultado quedó como “http://servidoramin/ServicioWCF/Service1.svc”.

¡Listo! Tenemos la segunda liga de acceso a nuestros dos servicios, esta liga, junto a la anterior las estaremos utilizando en el siguiente artículo, al consumir datos de nuestros servicios web en una aplicación de Silverlight.

Puedes descargar la aplicación aquí.

18 Comments

  • UnoQuePasaba
    18 febrero, 2012 - 9:46 am | Permalink

    Hay que recordar que cuando creas un WFC se genera un endpoint en el webconfig. Este endpoint es del tipo wshttpBinding y hay que cambiarlos por el de basichttpBinding para que funcione correctamente.

    • Amin
      18 febrero, 2012 - 3:11 pm | Permalink

      Así es mi buen, de hecho hay muchísima mas información al respecto, la idea aquí es solo dar las bases, sería muy difícil abarcarlo todo en un solo artículo, ya vendrán unos cuantos mas 😉

  • 17 octubre, 2012 - 1:01 am | Permalink

    Una pregunta porque mi servicio de WCF no me reconoce el nombre de host pero con la IP si . el servicio ya esta publicado y necesitamos que usuarios externos a la empresa lo usen , si me pueden ayudar a orientarme que estaria haciendo mal.. se los agradeceria

    • Amin Espinoza
      17 octubre, 2012 - 1:41 am | Permalink

      No entendí muy bien David, me dices que puedes entrar a 192.168.100.45/miservicio.svc pero no puedes entrar a miempresa.com/miservicio.svc ?

  • 25 noviembre, 2012 - 7:52 pm | Permalink

    Pues muy bueno el aporte gracias…

  • 17 abril, 2013 - 7:17 pm | Permalink

    Hola, muy buen articulo, Tengo una duda. es posible crear un WCF service para que soporte diferentes conexiones de motores de base datos? por ejemplo SQL Server, DB2, ORACLE, etc

    • Amin Espinoza
      18 abril, 2013 - 3:19 pm | Permalink

      Por supuesto Ismael, para cada engine existe una clase o biblioteca de clases requerida, solo es cosa de buscar y utilizar la adecuada.

      • Capistran
        6 marzo, 2014 - 7:33 pm | Permalink

        con la propiedad ProviderName de connectionString “System.Data.Sqlclient” (SQL Server)

  • Ruben
    18 mayo, 2014 - 4:42 pm | Permalink

    si en caso quisiera hacer la insertar medias te asp como seria el codigo tendria que mandar los parametros en el insertarcontacto pero en el codigo como podria ser la consulta insertar ?

  • Diego
    7 julio, 2014 - 7:38 pm | Permalink

    Hola! Es posible crear un servicio que no sea consumido por un cliente en particular sino que al arrancar el mismo se inicie un hilo que valide ciertas condiciones e inserte datos en la BD con cierta periodicidad? Gracias

    • Amin Espinoza
      10 julio, 2014 - 9:19 pm | Permalink

      Claro!! Puedes utilizar algún método que se ejecute al mostrar la página principal. Una especie de “OnNavigatedTo” para colocar toda la lógica que quieras desde el inicio de tu aplicación.

  • JLLA
    3 diciembre, 2014 - 4:36 am | Permalink

    Oye quise descargar el archivo pero al parecer es el archivo de la entrada anterior de ASP. llamado “mipareja” y veo que el nombre de proyecto de este archivo es “servicioWCF”

  • Javier
    13 enero, 2015 - 10:16 pm | Permalink

    Buen día, oye una pregunta, tengo un servicio wcf montado en un sitio https, me responde el servicio, pero al momento de correr la pagina no me trae los datos, subí un segundo sitio pero http y ese si me responde sin problemas

  • 10 marzo, 2015 - 10:27 pm | Permalink

    Hola
    Hice un servicio en visual studio con el framework 3.5, en mi pc funciona bien, pero cuando lo publico en el servidor me sale este error:
    “Esta colección ya contiene una dirección con el esquema http. Sólo puede haber una dirección por esquema en esta colección”.

    Me puedes orientar para solucionarlo.

    gracias

  • Alexander
    23 junio, 2015 - 3:35 am | Permalink

    Hola saludos quisiera saber como actualizo mis servicios wcf en el IIS. Porque de echo ya los tengo en el IIS pero he modificado mis servicios y ahora quiero actualizarlos como hago. agredeceria tu ayuda

  • Rubén
    2 septiembre, 2015 - 10:29 pm | Permalink

    El código que se descarga del link no corresponde al ejemplo. Podrias corregirlo por favor

    • Amin Espinoza
      30 noviembre, 2015 - 11:01 pm | Permalink

      Mmmm que raro, vamos a verificar.

  • Jon
    7 marzo, 2017 - 10:02 am | Permalink

    Hola,
    No deberia ser “Contacto” en lugar de “Contactos” en la funcion Actualizar Registro :

    Contacto contacto = (from c in contextoOriginal.Contacto <———-
    where c.ID == contactoActualizado.ID
    select c).Single();

    En lugar de

    Contacto contacto = (from c in contextoOriginal.Contactos <———
    where c.ID == contactoActualizado.ID
    select c).Single();

    un saludo

  • Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    This blog is kept spam free by WP-SpamFree.