lunes, 27 de mayo de 2013

Utilizando ficheros de configuración

Durante el diseño de WCF, se tuvo en mente el desacoplamiento de la configuración. Esto con el objetivo de brindar la posibilidad de realizar cambios en el servicio sin necesidad de volver a compilar el código, este es uno de los puntos fuertes de WCF. Esto aporta dos grandes ventajas: la flexibilidad de adaptar el sistema a las condiciones del entorno sin la necesidad de modificar el código fuente, y permitir que un administrador de sistemas tome ciertas decisiones en la implantación del sistema, tales como puertos de escucha, aspectos de seguridad, etc.
.Net hace uso extenso de ficheros de configuración XML y normalmente llevan como extensión .config. WCF también usa ficheros XML para la configuración de servicio, tanto a nivel de servidor como cliente.

Volviendo al ejemplo del servidor de consola visto anteriormente, podemos eliminar todo el código relativo a la configuración del servicio y definir la misma en un fichero de configuración que llamaremos app.config.


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Webservices.Implementacion.ReservaVuelos">
        <endpoint name="ReservaVuelos"
                  address="ReservaVuelos"
                  binding="basicHttpBinding"
                  contract="WebServices.Interfaces.IRerservaVuelos" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
</configuration>

Todo fichero de esta clase, debe llevar una sección 
<system.serviceModella etiqueta <services> lleva un nombre que debe coincidir con el nombre del tipo de dato que se pasa al constructor de ServiceHost, que en esencia es el nombre de la clase que implementa el servicio. Como cada servicio debe exponer al menos un Endpoint, dentro del service se declara esta sección que debe contar con los tres atributos explicados anteriormente address, binding y contract. También es necesario definir una dirección base que servirá para indicar la IP y el puerto del servicio si esto fuera necesario.
El endopoint cuenta con un atributo address que nos sirve para definir la URI del servicio. Para este caso, la dirección del servicio sería http://localhost:8080/ ReservaVuelos. Tanto la dirección base como alguna relativa siempre deberían definirse externamente en el fichero de configuración para así evitar que un servicio dependa de una dirección lógica. Además, le brinda la posibilidad al administrador hacer cambios en la configuración sin necesidad de recompilar el código.
En el cliente se debe realizar la misma configuración 


<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IReservaVuelos" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8080/ReservaVuelos"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IReservaVuelos"
                contract="WebServices.Proxy.IReservaVuelos" name="BasicHttpBinding_IReservaVuelos" />
        </client>
    </system.serviceModel>
</configuration>

Hay varias versiones sobrecargadas del constructor de ReservaVuelos. Si se utiliza el constructor sin parámetros, se buscará un endpoint en el fichero de configuración que tenga el mismo tipo de contrato que el especificado por ReservaVuelos. Opcionalmente se puede pasar el nombre del endpoint. Al igual que en el servidor, la dirección se puede definir de modo imperativo en el código o en el fichero de configuración, que por razones obvias, es más flexible.

Estos contenidos se publican bajo una licencia de Creative Commons Licencia Reconocimiento-No comercial-Compartir bajo la misma licencia 3.0 Colombia de Creative Commons

No hay comentarios:

Publicar un comentario