jueves, 7 de agosto de 2008

Y me voy a geeks!

Buenas :)
Este post es para deciros que  abro un blog en geeks.ms, una de las comunidades de blogs tecnológicos más importantes sobre tecnologías Microsoft en castellano.

Es la muerte de este blog? No pues haré crossposting de uno a otro (manualmente, porque no se como hacerlo automáticamente... si alguien lo sabe que me lo diga). Así que este blog sigue vivo, pero si quieres pasate también por mi blog en geeks.ms 


Un saludo!

viernes, 1 de agosto de 2008

[WCF] Configurando mis servicios

Bueno.... justo empieza agosto, vacaciones y demás, y antes de que decaiga toda la actividad mundial, aprovecho para contaros algo más de WCF... :) La configuración de los servicios.

En el post anterior vimos como crear un servicio sencillito (ya lo iremos complicando). Lo que hicimos básicamente fueron dos cosas:
  • Definir el contrato del servicio (una interfaz de .NET decorada con ServiceContract).
  • Implementar el contrato (una clase de .NET que implementaba la interfaz)
Luego vimos que ejecutando el proyecto, Visual Studio nos hospedaba nuestro servicio en un servidor de pruebas y nos permitia probarlo con un cliente de pruebas.

Pero recordais los primeros posts de esta serie? Los endpoints??? Sí, sí...el ABC de WCF: Address, Binding, Contract... dónde está mi servicio, cómo accedo a él y qué hace el servicio.
Pues bien, una de las claves de WCF es que el endpoint se define mediante un fichero de configuración (puede hacerse programáticamente, pero esto ahora no nos interesa).

Es decir, tanto la URI de mi servicio, como el protocolo que usaremos para acceder a él, se define mediante el fichero de configuración... Hoy quieres acceder a tu servicio en http://servidor/servicio1 mediante SOAP en HTTP? Pues lo configuras en el fichero de configuración. Mañana cambias de idea y quieres acceder a tu servicio mediante MSMQ? Pues ningún problema: edita el fichero de configuración. Y listos. No toques ni una línea de código.
Es por esto que decimos que WCF unifica todas las APIs de comunicaciones existentes hasta el momento.

El fichero de configuración de WCF es el estándard de .NET (que VS llama app.config), y toda la configuración de WCF se lleva a cabo en la etiqueta <system.serviceModel>.
Veamos un ejemplo de como puede ser la configuración de UN servicio:


      <service name="ServiciosCalculo.CalculadoraService" behaviorConfiguration="ServiciosCalculo.Service1Behavior">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8731/Design_Time_Addresses/ServiciosCalculo/Service1/" />
          </baseAddresses>
        </host>
        <endpoint address ="" binding="wsHttpBinding" contract="ServiciosCalculo.ICalculadora">
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>



Por un lado dentro de la etieuta "service" tenemos dos etiquetas principales:
  • host: Que nos permite establecer la dirección (URI) base de este servicio
  • endpoint: Que nos define UN endpoint. Recordad que un servicio puede tener MAS de un endpoint
Dentro del endpoint se definen los tres aspectos principales:
  1. La dirección. Atributo address que contiene una URI relativa a la dirección base establecida en la etiqueta "host".
  2. El binding. Atributo binding que contiene el nombre identificativo del binding que vamos a usar.
  3. El contrato. Atributo contract que contiene el nombre de la interfaz de .NET que representa este contrato.
En el código de ejemplo vemos que el servicio implementa dos endpoints:
  1. Uno con dirección relativa vacía (o sea que la URI de este endpoint es la misma que la definida en la etiqueta host), con el contrato ServiciosCalculo.ICalculadora (la interfaz que hicimos en el post anterior)
  2. Otro con dirección relativa "mex", con el contrato IMetadataExchange.
El contrato IMetadataExchange es un contrato que implementan todos los servicios de WCF, y que sirve para que el servicio pueda informar al cliente de sus metadatos (p. ej. los datos del binding o del contrato, para que el cliente sepa a que atenerse... vendría a ser como "la oficina de información" del servicio).

Si os fijais en el trozo de ejemplo que he puesto, en los dos endpoints los dos bindings que hay son:
  • wsHttpBinding para el primer endpoint
  • mexHttpBinding para el segundo endpoint
Si os preguntais donde definimos la codificación (binaria, SOAP,...) o el transporte (TCP, MSMQ, HTTP) de estos bindings, aquí no lo vais a encontrar ya que estos bindings son bindings predefinidos de WCF.
En este post de Maor David podeis encontrar una comparación de los bindings predefinidos de WCF.
Pero no estamos limitados a estos bindings: un binding es configurable (podemos añadirle o quitarle "elementos") o bien nos podemos crear nuestros propios bindings... pero bueno, esto ya es harina de otro costal. La verdad es que con los bindings predefinidos cubrimos un amplio espectro de necesidades.


Por último los más observadores habreis visto que la etiqueta "service" del ejemplo, definia un atributo llamado "behaviorConfiguration" (con valor "ServiciosCalculo.Service1Behavior"). Esto sirve para indicar el behavior del servicio... y claro que es un behavior?
Pues bien, básicamente son datos de configuración del servicio, que NO forman parte de su endpoint. Por ejemplo: si el servicio da una excepción, queremos enviar información detallada al cliente o no? Los behaviors que tengamos se definen con la etiqueta behavior (dentro de serviceBehaviors) y se asocian a los servicios con el atributo que hemos comentado.
Por, ejemplo un behavior puede se puede definir así:
       <serviceBehaviors>
        <behavior name="ServiciosCalculo.Service1Behavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>



En posts sucesivos veremos más información sobre los behaviors.
Bien!!!! En el próximo post de la serie veremos como... crear un cliente y conectarnos a nuestros servicios!!!!

Buenas vacaciones a todos los afortunados que las hagais!!
Nos leemos! ;-)