Creando un Web Service con WCF

Windows Communication Foundation fue una de las novedades de .NET Framework 3.0, la cual permite la creación de sistemas distribuidos orientados a servicios.
Con Visual Studio 2008, disponemos de una plantilla que nos genera todo lo necesario para empezar a trabajar con ello. No obstante, en esta ocasión, dejaremos de lado la misma para poder visualizar claramente qué es lo necesario para que WCF funcione.

CREACIÓN DEL PROYECTO

Creamos un nuevo proyecto de tipo librería:

Incluimos las librerías System.ServiceModel y System.Runtime.Serialization.

EL CONTRATO (CONTRACT)

Lo primero que debemos crear es una interfaz que tendrá como misión ser el Contrato del servicio web. Lo que nos indica el mismo es qué funcionalidades tiene operativas el servicio de cara a las aplicaciones que lo van a consumir.
Creamos una interfaz llamada IService.cs y codificamos las siguientes funcionalidades:

using System.ServiceModel;
using System.ServiceModel.Web;
using System.Runtime.Serialization;

namespace WCF
{
    [ServiceContract]
    public interface IService
    {
        [OperationContract]
        [WebGet]
        Resultado Suma(int a, int b);

        [OperationContract]
        [WebGet]
        Resultado Resta(int a, int b);
    }
   [DataContract]
    public class Resultado
   {
       [DataMember]
       public int Result { get; set; }
   }
}

Tenemos los siguientes atributos:

  • ServiceContract, el cual indica que nuestra interfaz va a hacer las veces de contrato.
  • OperationContract por cada método que queramos exponer.
  • Por último, dentro del mismo archivo (No es recomendable) hemos creado una pequeña clase con el atributo DataContract que será el objeto serializado que viajará como respuesta a las peticiones tanto de la Suma como la Resta. Por cada miembro dentro del contrato de datos, contiene un DataMember.

Es una clase perfectamente normal que contiene los métodos que definimos en el contrato. Si creamos código adicional, para realizar cualquier otra operación, no sería visible al no estar definido en la interfaz del servicio.

EL ARCHIVO SVC

Un archivo importante a tener muy en cuenta es el archivo con extensión svc, el cual erá de utilidad a IIS cuando publiquemos el servicio. Añadimos un documento en blanco, llamado Service.svc, con el siguiente contenido:

<%@ ServiceHost Service=”WCF.Service” %>

Le indicamos el namespace de la  implementación del contrato como valor de Service para que pueda localizarlo.

DLL FUERA DE DEBUG Y RELEASE

Para que IIS pueda localizar correctamente las librerías del servicio web, debemos cambiar las propiedades de Build en nuestro proyecto y dejar nuestro “Output path” de la siguiente forma:

Por último, quizás la parte más compleja, necesitamos configurar el archivo web.config con los endpoints necesarios para aceptar peticiones. Dependiendo de los distintos tipos de comunicacion que tengamos, deberemos implementar más o menos endpoints.

¿Qué es un Endpoint?

Un endpoint está compuesto por tres valores: Address (¿Dónde?), Binding (¿Cómo?) y Contract (¿Qué?). La suma de ellos genera una serie de requisitos para poder establecer una conexión con nuestro servidor. Un servicio con WCF puede disponder de varios endpoints distintos, por lo que el número de clientes de diferentes características pueden consumirlo.

Creamos pues un archivo Web.config y eliminamos el contenido. En este post, voy a crear un endpoint para un cliente JSON.

<?xml version=”1.0″?>
<configuration>
  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name=”webBinding”>
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service name=”WCF.Service”
               behaviorConfiguration=”MiBehavior”>
        <endpoint address=”json”
                  binding=”webHttpBinding”
                  bindingConfiguration=”webBinding”
                  behaviorConfiguration=”jsonBehavior”
                  contract=”WCF.IService”/>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name=”jsonBehavior”>
          <enableWebScript/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name=”MiBehavior”>
          <serviceMetadata httpGetEnabled=”true”/>
          <serviceDebug includeExceptionDetailInFaults=”True”/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

Dentro de la sección system.serviceModel tenemos:

Por un lado, la sección de los bidings disponibles, que en este caso sólo tenemos el necesario para una configuración de JSON; services donde indicamos el address, el nombre de nuestro binding, el behavior (indicado más abajo)  y el nombre del contrato que queremos utilizar.

Llegados a este punto, podemos crear una aplicación que tenga hosteado el servicio que acabamos de crear o bien utilizar IIS, configurando como documento de inicio Service.svc.

IMPLEMENTACIÓN DEL CONTRATO

El siguiente paso es crear una clase que implemente el contrato que acabamos de definir.

namespace WCF
{
    public class Service : IService
    {
        public Resultado Suma(int a, int b)
        {
            var resultado = new Resultado {Result = a + b};
            return resultado;
        }

        public Resultado Resta(int a, int b)
        {
            var resultado = new Resultado {Result = a – b};
            return resultado;
        }
    }

}

Si accedemos a las dos direcciones que indico abajo a través del explorador, debería devolvernos un archivo en formato JSON por cada petición.

http://localhost/WCF/Service.svc/json/Suma

http://localhost/WCF/Service.svc/json/Resta

Ambas devolverían cero porque no se les está pasando ningún parámetro.
En el siguiente post de WCF, crearé un cliente que realice y reciba la respuesta con JSON para poder acceder a nuestro servicio web y pasarle los parámetros necesarios.

¡Saludos!  

17 comentarios en “Creando un Web Service con WCF”

  1. Buenas Tardes.

    Me gustaría formular una pregunta. Si necesitara implementar el Servicio en N puntos diferentes (servidores), como haría para, a partir de una URI, poder llamar de manera dinámica a uno en particular?

    Muchas gracias por la posible colaboración prestada.

  2. Gracias por tu comentario blaxzoser 🙂

    Hola Jorge, creo que no entiendo bien el escenario que planteas. ¿Podrías explicarlo con algo más de detalle?

    ¡Saludos!

  3. Buenos Días.

    La situación es la siguiente: tengo desarrollado el servicio web que se encarga de la consulta de un archivo en una ruta especificada.

    Ahora se debe colocar ese servicio en varios lugares diferentes, y se debe acceder a ese servicio para traer archivos de esos lugares.

    Desde una aplicación cliente tengo las diferentes Url’s de donde debería implementar el servicio, pero necesito saber como indicar esa ruta para poder invocar el servicio.

    Muchas gracias.

  4. Hola Gisela, he intentado poner en IIS el servicio como indicas, configurando como página de inicio el Service.svc, pero resulta en error 404, no lo encuentra con tu ejemplo de cliente ni en el explorador q podrá ser?, gracias

  5. Hola Jorge, si lo que quieres es acceder a los distintos servicios desde una aplicación cliente de forma dinámica, podrías hacerlo de la siguiente manera:

    var uri = new Uri("MyDinamicUri");
    var myService = ChannelFactory<IService>.CreateChannel(new BasicHttpBinding(), new EndpointAddress(uri));
    myService.Suma(1, 2);

    Hola Edwin ¿Pusiste en el directorio virtual el archivo .svc como archivo de inicio?

    ¡Saludos!

  6. Tengo todo tal cual siguiendo los pasos y el IIS me tira este error, sabrias orientarme a que se puede deber ? … ya que no logro dar en la tecla

    Error de servidor en la aplicación ‘/WCF’.
    Error de configuración
    Descripción: Error durante el procesamiento de un archivo de configuración requerido para dar servicio a esta solicitud. Revise los detalles de error específicos siguientes y modifique el archivo de configuración en consecuencia.

    Mensaje de error del analizador: Se ha producido un error al cargar el archivo de configuración: No se pudo empezar a supervisar los cambios de ‘C:Documents and SettingsmpeccinMis documentosVisual Studio 2008ProjectsWCF’ porque se ha denegado el acceso.

    Error de código fuente:

    [Líneas de código fuente no relevantes]

    Archivo de origen: C:Documents and SettingsmpeccinMis documentosVisual Studio 2008ProjectsWCFweb.config Línea: 0

    Información de versión: Versión de Microsoft .NET Framework:2.0.50727.3603; Versión ASP.NET:2.0.50727.3082

  7. Hola Miguel,

    El error te está indicando que tiene problemas con el web.config.
    Comprueba los permisos del directorio y que está correctamente el archivo de configuración.

    ¡Saludos!

  8. Hi Gise, ya lo he logrado en ISS 7, pero lo llamo desde un cliente en la misma aplicacion hecho en ajax y me retorna el error 500, además al cambiarle cualquier cosa en el web.config, se daña el servicio y arroja errores aleatorios de la forma:
    Could not load file or assembly ‘App_Web_xi4hie0l, Version=0.0.0.0, ……….
    A que se podrá deber eso?
    Gracias.

  9. Hola Edwin,

    Cuando te responde con un error 500 lo más probable es que esté lanzando el servicio WCF una excepción no controlada. Para localizar el problema, te recomiendo que ataches el proceso donde está corriendo tu servicio (Debug => Attach to process) y seguramente llegues al error 🙂
    En cuanto a los archivos App_Web_xXxXxX lo primero que probaría es a eliminar los archivos temporales de la siguientes ruta:

    C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Files

    ¡Saludos!

  10. Buenas, Gisela.

    No se si sigues actualizando el blog y si este comentario te va a llegar. Tengo una duda que no se como realizar, y te quería preguntar a ver si podrías ayudarme.

    El problema es el siguiente: Tengo un wsdl (enviarBasura) con varias operaciones (enviarBasuraDocumentoControl, enviarBasuraNotificacion, etc, etc), cada una con sus input y outputs, sus soapactions, etc.

    Mi problema es que no se como definirlo en el web.config. Todos los ejemplos que he visto tratan únicamente a servicios con una sola operacion.

    Podrías decirme, al menos, donde buscar información sobre este tema en contreto?

Deja un comentario

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