Sunteți pe pagina 1din 135

Manual de Windows Communication Foundation INDICE GENERAL

1. Informacin Conceptual 1.1. Qu es Windows Communication Foundation? 1.2. Conceptos Bsicos de Windows Communication Foundation 1.3. Arquitectura de Windows Communication Foundation 1.4. WCF y Perfil de Cliente de .NET Framework 2. Tutorial de Introduccin 2.1. Definicin de un Contrato de Servicio de WCF 2.2. Cmo Implementar un Contrato de Servicio de WCF 2.3. Procedimiento para Hospedar y Ejecutar un Servicio Bsico de WCF 2.4. Creacin de un Cliente de WCF 2.5. Configuracin de un Cliente Bsico de WCF 2.6. Cmo Usar un Cliente de WCF 2.7. Solucin de Problemas con el Tutorial de Introduccin 3. Programacin Bsica de WCF 3.1. Ciclo de Vida de Programacin Bsica 3.2. Diseo e Implementacin de Servicios 3.2.1. Diseo de Contratos de Servicios 3.2.1.1. Creacin de un Contrato de Solicitud Respuesta 3.2.1.2. Cmo Crear un Contrato Unidireccional 3.2.1.3. Creacin de un Contrato Dplex 3.2.1.4. Especificacin de Transferencia de Datos en Contratos de Servicio 3.2.1.4.1. Utilizacin de la Clase XmlSerializer 3.2.1.4.2. Cmo Habilitar la Transmisin 3.2.1.4.3. Cmo: Crear un Contrato de Datos Bsicos para una Clase o Estructura 3.2.1.5. Especificacin y Administracin de Errores en Contratos y Servicios 3.2.1.5.1. Definicin y Especificacin de Errores 3.2.1.5.1.1. Cmo Declarar Errores en Contratos de Servicios 3.2.1.5.2. Envo y Recepcin de Errores 3.2.1.6. Uso de Sesiones 3.2.1.6.1. Cmo Crear un Servicio que Requiere Sesiones 3.2.1.7. Operaciones Sincrnicas y Asincrnicas 3.2.1.7.1. Cmo: Implementar una Operacin Servicios Asincrnica 3.2.1.8. Servicios de Confianza 3.2.1.9. Servicios y Transacciones 3.2.2. Implementacin de Contratos de Servicio 3.2.2.1. Cmo: Crear un Contrato de WCF con una Clase 3.2.2.2. Procedimiento para Crear un Servicio con una Interfaz de Contrato 3.2.2.3. Especificacin del Comportamiento en Tiempo Ejecucin del Servicio 3.2.2.3.1. Cmo Controlar la Creacin de Instancias de Servicio 3.3. Configuracin de Servicios 3.3.1. Configuracin de Servicios mediante Archivos de Configuracin 3.3.2. Enlaces de Windows Communication Foundation 3.3.2.1. Informacin General de Enlaces de WCF 3.3.2.2. Enlaces Proporcionados por el Sistema 3.3.2.3. Utilizacin de Enlaces para Configurar Servicios y Clientes 3.3.2.3.1. Cmo: Especificar un Enlace de Servicio en la Configuracin 3.3.2.3.2. Cmo: Especificar un Enlace de Servicio en el Cdigo 3.3.2.3.3. Cmo: Especificar un Enlace de Cliente en la Configuracin 3.3.2.3.4. Cmo: Especificar un Enlace de Cliente en el Cdigo 3.3.2.4. Configuracin de Enlaces para Servicios WCF 3.3.3. Extremos en Windows Communication Foundation 3.3.3.1. Informacin General acerca de la Creacin de Puntos Finales 3.3.3.2. Especificacin de una Direccin de Extremo 3.3.3.3. Cmo Crear un Extremo de Servicio en Configuracin 3.3.3.4. Cmo Crear un Extremo de Servicio en Cdigo 3.3.3.5. Publicacin de Extremos de Metadatos

MCT: Luis Dueas

Pag 1 de 135

Manual de Windows Communication Foundation


3.3.3.5.1. Cmo Publicar Metadatos para un Servicio mediante un Archivo de Configuracin 3.3.3.5.2. Publicacin de Metadatos para un Servicio mediante Cdigo 3.3.4. Seguridad de Servicios 3.3.4.1. Cmo: Proteger un Servicio con Credenciales de Windows 3.3.4.2. Cmo: Establecer el Modo de Seguridad 3.3.4.3. Cmo: Especificar el Tipo de Credencial de Cliente 3.3.4.4. Cmo Restringir el Acceso con la Clase PrincipalPermissionAttribute 3.3.4.5. Cmo Suplantar a un Cliente en un Servicio 3.3.4.6. Cmo: Examinar el Contexto de Seguridad 3.3.4.7. Descripcin de los Niveles de Proteccin 3.3.4.8. Cmo: Establecer la Propiedad ProtectionLevel 3.3.5. Creacin de Servicios Interoperables de WS-I Basic Profile 1.1 3.3.6. Administracin y Diagnstico 3.4. Servicios de Hospedaje 3.4.1. Procedimiento para Hospedar un Servicio WCF en IIS 3.4.2. Procedimiento para Hospedar un Servicio WCF en WAS 3.4.3. Hospedaje de un Servicio WCF en un Servicio Administrado de Windows 3.4.4. Hospedaje de un Servicio WCF en un Aplicacin Administrada 3.5. Generacin de Clientes 3.5.1. Introduccin a un Cliente WCF 3.5.2. Acceso a los Servicios mediante un Cliente WCF 3.5.2.1. Cmo: Obtener Acceso a los Servicios con un Contrato Dplex 3.5.2.2. Cmo Llamar a Operaciones del Servicio WCF de forma Asincrnica 3.5.2.3. Cmo: Obtener Acceso a los Servicios WCF con Contratos Unidireccionales y de Solicitud-Respuesta 3.5.2.4. Cmo: Obtener Acceso al Servicio WSE 3.0 con un Cliente WCF 3.5.2.5. Comprender Cdigos de Cliente Generado 3.5.2.6. Especificacin del Comportamiento de Tiempo Ejecucin del Cliente 3.5.2.7. Configuracin de los Comportamientos del Cliente 3.5.3. Proteccin de Clientes 3.5.3.1. Cmo: Especificar los Valores de Credenciales de Cliente 3.6. Introduccin a la Extensibilidad 3.7. Inicio Rpido de Solucin de Problemas de WCF

MCT: Luis Dueas

Pag 2 de 135

Manual de Windows Communication Foundation

Windows Communication Foundation


Windows Communication Foundation (WCF) es el modelo de programacin unificado de Microsoft para generar aplicaciones orientadas a servicios. Permite a los programadores generar soluciones con transaccin seguras y de confianza, que se integren en diferentes plataformas y que interoperen con las inversiones existentes.

1. Informacin Conceptual
En este tema se resume la informacin sobre el sistema de mensajera de Windows Communication Foundation (WCF) y las clases que admiten su uso.

1.1. Qu es Windows Communication Foundation?


La aceptacin global de servicios Web que incluye los protocolos estndar para la comunicacin de aplicacin a aplicacin, ha cambiado el desarrollo de software. Por ejemplo, las funciones que proporcionan los servicios Web ahora incluyen seguridad, coordinacin de transacciones distribuidas y una comunicacin fiable. Las ventajas de los cambios en servicios Web se deberan reflejar en las herramientas y tecnologas que los programadores utilizan. Windows Communication Foundation (WCF) est diseado para ofrecer un enfoque manejable a la informtica distribuida, interoperabilidad ancha y asistencia directa para la orientacin sobre el servicio. WCF simplifica el desarrollo de aplicaciones conectadas a travs de un nuevo modelo de programacin orientado a servicios. WCF admite muchos estilos de desarrollo de aplicaciones distribuidas proporcionando una arquitectura superpuesta. En su base, la arquitectura de canal de WCF proporciona primitivos asncronos de paso de aprobacin de mensajes sin tipo. Generados sobre esta base estn las funciones de protocolos para un intercambio de datos de transaccin seguro y fiable, as como una amplia variedad de opciones de codificacin y transporte. El modelo de programacin tipificada (llamado modelo de servicio) est diseado para facilitar el desarrollo de aplicaciones distribuidas y proporcionar a los desarrolladores pericia en servicios Web ASP.NET, comunicacin remota .NET Framework y Enterprise Services, as como a aquellos que llegan a WCF con cierta experiencia en desarrollo. El modelo de servicio presenta una asignacin sencilla de conceptos de servicios Web para aquellos de Common Language Runtime (CLR) .NET Framework, incluyendo la asignacin ampliable y flexible de mensajes para la implementacin de servicios en lenguajes como Visual C# o Visual Basic. Incluye funciones de serializacin que habilitan el acoplamiento separado y el control de versiones y proporciona integracin e interoperabilidad con sistemas distribuidos .NET Framework existentes, como Message Queue Server (MSMQ), COM+, servicios Web ASP.NET, Mejoras de servicios Web (WSE) y varias funciones ms.

Ejemplo del problema


El siguiente ejemplo muestra algunos de los problemas que WCF resuelve. Una compaa de alquiler de coches decide crear una nueva aplicacin para reservar los coches. Los creadores de esta aplicacin de reserva de coches de alquiler saben que la lgica empresarial que implementa debe ser accesible por otro software que se ejecute dentro y fuera de la compaa. De acuerdo con, deciden integrarlo en un estilo orientado a servicios, con la lgica de la aplicacin expuesta a otro software a travs de un conjunto bien determinado de servicios. Para implementar estos servicios y as comunica con otro software, la nueva aplicacin utilizar WCF.

MCT: Luis Dueas

Pag 3 de 135

Manual de Windows Communication Foundation

Un intervalo de otras aplicaciones tendr acceso probablemente a la aplicacin de reserva de coche de alquiler sobre su duracin. Cuando est diseado, sin embargo, los arquitectos de la aplicacin de reserva de coche de alquiler saben que se tendr acceso a su lgica empresarial, como se muestra en la figura anterior, por tres otros tipos de software: Una aplicacin cliente de centro de llamadas que se ejecuta en los escritorios de Windows que son utilizados por empleados en el centro de llamadas de la organizacin. Creada especficamente para el nuevo sistema de reservas, esta aplicacin tambin se generar utilizando .NET Framework de Microsoft e WCF. Esta aplicacin no es verdaderamente distinta de la nueva aplicacin de reserva de coches de alquiler, porque su nico propsito es actuar como un cliente para el nuevo sistema. De una perspectiva orientada a servicios, es simplemente otro cliente para la lgica empresarial del sistema de reservas. Una aplicacin de reserva existente generada en un servidor de J2EE que se ejecuta en un sistema que no sea Windows. Debido a una reciente fusin con otra empresa de alquiler de coches, este sistema existente debe poder tener acceso a la lgica de la nueva aplicacin para proporcionar una experiencia unificada a los clientes de las empresas fusionadas. Las aplicaciones de los socios que se ejecutan en una variedad de plataformas, cada una de ellas situada dentro de una empresa que tiene una organizacin empresarial con la empresa de alquiler de coches. Entre los socios podran incluirse agencias de viaje, lneas areas y otros que tengan un requisito comercial para realizar reservas de alquiler de coches. Los diversos requisitos de comunicacin para la nueva aplicacin de reserva de coches de alquiler no son simples. Para las interacciones con la aplicacin cliente del centro de llamadas, por ejemplo, el rendimiento es importante, mientras que la interoperabilidad es sencilla, porque ambos estn generados en .NET Framework. Para la comunicacin con la aplicacin existente de reservas basada en J2EE y con las aplicaciones de diversos socios, sin embargo, la interoperabilidad se vuelve el objetivo principal. Los requisitos de seguridad tambin son bastante diferentes. Varan segn las aplicaciones locales basadas en Windows, una aplicacin basada en J2EE que se ejecuta en otro sistema operativo y una variedad de aplicaciones de los socios que entran a travs de Internet. Incluso los requisitos transaccionales podran variar, permitindole nicamente a las aplicaciones internas realizar solicitudes transaccionales. Cmo se pueden cumplir estos distintos requisitos empresariales y tcnicos sin exponer los creadores de la nueva aplicacin a una complejidad inmanejable? WCF se ha diseado para este escenario diverso pero realista y es la tecnologa predeterminada para las aplicaciones de Windows que exponen y tienen acceso a los servicios. Este tema proporciona una introduccin a WCF, mientras examina lo que proporciona y muestra cmo se utiliza. A lo largo de esta introduccin, el escenario que se describe actuar como ejemplo. El objetivo es poner en claro qu es WCF, mostrar qu problemas resuelve e ilustrar cmo resuelve esos problemas.

Resolver el problema
La base para las nuevas aplicaciones basadas en Windows es .NET Framework. Por lo tanto, WCF se implementa principalmente como un conjunto de clases encima de .NET Framework CLR. Dado que extiende su

MCT: Luis Dueas

Pag 4 de 135

Manual de Windows Communication Foundation


entorno familiar, WCF permite que los programadores que crean aplicaciones orientadas a objetos utilizando .NET Framework hoy, para tambin integrar las aplicaciones orientadas a servicios de una manera conocida.

La figura muestra una vista de un cliente WCF y de un servicio. Los dos interactan utilizando SOAP, WCF la representacin del mensaje nativa, por lo que aunque la figura muestra ambas partes generadas en WCF, esto no se requiere. WCF se genera en .NET Framework 2.0. Como el escenario descrito anteriormente sugiere, WCF hace frente a un intervalo de desafos para hacer que las aplicaciones se comuniquen. Sin embargo, hay tres cosas que destacan como los aspectos ms importantes de WCF: Unificacin de las tecnologas de comunicacin .NET Framework existentes. Compatibilidad para interoperabilidad entre proveedores, incluyendo confiabilidad, seguridad y transacciones. Orientacin explcita al servicio. La unificacin de las tecnologas informticas distribuidas de Microsoft En ausencia de WCF, el equipo de desarrollo que implementa la aplicacin de alquiler de coches necesitara elegir la tecnologa distribuida adecuada entre las mltiples opciones proporcionadas por .NET Framework. Aunque se den los diversos requisitos de esta aplicacin, ninguna tecnologa nica se ajustara a ellos. En su lugar, es probable que la aplicacin utilizarse varias tecnologas .NET Framework existentes, como: ASP.NETServicios Web (ASMX). Una opcin para comunicarse con la aplicacin de reservas existente basada en J2EE y con las aplicaciones de los socios a travs de Internet. Dado que los servicios Web bsicos son suministrados hoy en da en la mayora de las plataformas, esta fue la manera ms directa de lograr la interoperabilidad entre proveedores antes del lanzamiento de WCF. .NET Framework remoto. Una opcin para la comunicacin con la aplicacin del centro de llamadas, porque ambos se generan en .NET Framework. La comunicacin remota est diseada expresamente para la comunicacin de .NET a .NET estrechamente acoplada, por lo que proporciona una experiencia de desarrollo sencilla y sin problemas para las aplicaciones en la red local. Enterprise Services. Utilizado por la aplicacin de reserva de coches de alquiler para administrar periodos de duracin de objeto y definir las transacciones distribuidas. Estas funciones podran ser tiles para comunicarlas e integrarlas con cualquiera de las otras aplicaciones de este escenario, pero Enterprise Services admite nicamente un conjunto limitado de opciones de comunicacin. WSE. Se podra utilizar junto con ASMX para comunicarse con la aplicacin de reserva basada en J2EE y con las aplicaciones de los socios. Dado que implementa ms recientemente los acuerdos de los servicios Web definidos, conocidos colectivamente como las especificacionesWS-*, WSE permite una seguridad ms flexible en los servicios Web, con tal de que todas las aplicaciones implicadas sean compatibles con las versiones de estas nuevas especificaciones. Message Queuing de Microsoft (MSMQ). Se utiliza para comunicarse con aplicaciones de socios basadas en Windows que requieren la entrega de los datos garantizada, as como el desacoplamiento de cargas de trabajo y periodos de duracin de la aplicacin. La mensajera duradera que Message Queuing proporciona suele ser la mejor solucin para las aplicaciones conectadas de manera intermitente. Generada en .NET Framework, la aplicacin de reserva de coches de alquiler debe utilizar ms de una de estas tecnologas de comunicacin para cumplir con sus requisitos. Aunque esto es tcnicamente posible, la aplicacin resultante sera compleja de implementar y su mantenimiento sera todo un desafo. Con WCF, la solucin es mucho ms fcil de implementar. Como muestra la figura, WCF se puede utilizar para todas las situaciones descritas previamente. Por lo tanto, la aplicacin de reserva de coches de alquiler puede

MCT: Luis Dueas

Pag 5 de 135

Manual de Windows Communication Foundation


utilizar esta tecnologa nica para todas sus comunicaciones de aplicacin a aplicacin. A continuacin se muestra WCF trata cada uno de estos requisitos: Dado que WCF puede comunicarse utilizando los servicios Web, la interoperabilidad con otras plataformas que tambin admiten SOAP, como los principales servidores de aplicaciones basados en J2EE, es sencilla. Tambin puede configurar y extender WCF para comunicarse con los servicios Web utilizando los mensajes no basados en SOAP, por ejemplo, los formatos XML simples como RSS. El rendimiento es una preocupacin primordial para la mayora de los negocios. WCF se desarrolla con el objetivo de ser una de las plataformas de aplicacin distribuidas ms rpidamente desarrollada por Microsoft. Para permitir un rendimiento ptimo cuando ambas partes de una comunicacin se generan en WCF, la codificacin de la conexin utilizada en este caso es una versin binaria optimizada de un conjunto de informacin XML. Los mensajes todava cumplen con la estructura de datos de un mensaje SOAP, excepto su codificacin, que utiliza una representacin binaria de esa estructura de datos en lugar del formato de corchetes angulares y texto estndar de la codificacin de texto de XML 1.0. Al utilizar esta opcin, tiene sentido para comunicarse con la aplicacin cliente de centro de llamadas, porque tambin se ha generado en WCF y el rendimiento es una preocupacin importante. La gestin de los periodos de duracin de objetos, la definicin de las transacciones distribuidas y otros aspectos de Enterprise Services son proporcionados ahora por WCF. Estn disponibles para cualquier aplicacin basada en WCF, lo que significa que la aplicacin de reserva de coches de alquiler puede utilizarlos con cualquiera de las otras aplicaciones con las que se comunica. Dado que admite un conjunto grande de las especificaciones de WS - *, WCF ayuda a proporcionar confiabilidad, seguridad y transacciones al comunicarse con cualquier plataforma que tambin admita estas especificaciones. La opcin WCF para la mensajera en cola, integrada en Message Queuing, permite que las aplicaciones utilicen la puesta en cola persistente sin utilizar otro conjunto de interfaces de programacin de aplicaciones. El resultado de esta unificacin es una mayor funcionalidad y una complejidad significativamente reducida.

Interoperabilidad con aplicaciones generadas en otras tecnologas


Aunque WCF introduce un nuevo entorno de desarrollo para las aplicaciones distribuidas, est diseado para interoperar bien con aplicaciones que no sean de tipo WCF. Hay dos aspectos importantes en relacin con la interoperabilidad WCF: la interoperabilidad con otras plataformas y la interoperabilidad con las tecnologas de Microsoft que precedieron a WCF. La seccin siguiente describe ambos tipos. Interoperabilidad con otras plataformas de los servicios Web Las empresas hoy en da suelen tener los sistemas y aplicaciones que han adquirido a un amplio abanico de proveedores. En la aplicacin de alquiler de coches, por ejemplo, se requiere establecer comunicacin con algunas otras aplicaciones de software escritas en varios lenguajes que se ejecutan en varios sistemas operativos. Debido a que el mecanismo de comunicacin fundamental de WCF es un servicio Web basado en SOAP, las aplicaciones basadas en WCF pueden comunicarse con otro software que se ejecute en una variedad de contextos. Una aplicacin generada en WCF puede interactuar con todo lo siguiente: Las aplicaciones basadas en WCF que se ejecutan en un proceso diferente en el mismo equipo de Windows. Las aplicaciones basadas en WCF que se ejecutan en otro equipo de Windows.

MCT: Luis Dueas

Pag 6 de 135

Manual de Windows Communication Foundation


Las aplicaciones generadas en otras tecnologas, como servidores de aplicaciones de J2EE, que son compatibles con los servicios Web estndar. Estas aplicaciones se pueden estar ejecutando en equipos con Windows o en los equipos que ejecutan otros sistemas operativos. Para permitir ms que nicamente la comunicacin bsica, WCF implementa tecnologas de servicios Web definidas por las especificaciones de WS-*. Todas estas especificaciones fueron definidas originalmente por Microsoft, IBM y otros proveedores que trabajan juntos. Cuando las especificaciones se estabilizan, la propiedad pasa a menudo a los organismos de creacin de estndares, como el World Wide Web Consortium (W3C) u OASIS (Organization for the Advanced of Structures Information Standards, Organizacin para el avance de estndares de informacin estructurada). Estas especificaciones tratan varias reas, incluidas la mensajera bsica, la seguridad, la confiabilidad, las transacciones y el trabajo con los metadatos de un servicio. Agrupadas por funcin, estas especificaciones abarcan: Mensajera: SOAP es la base para los servicios Web y define un sobre bsico que contiene las secciones de encabezado y de cuerpo. WS-Addressing define las sumas al encabezado SOAP para direccionar mensajes SOAP, que evita que SOAP confe en el protocolo de transporte subyacente, como HTTP, para realizar el direccionamiento de la informacin. El mecanismo de optimizacin de transmisin del mensaje (MTOM) define un formato de transmisin optimizado para los mensajes SOAP con mucho contenido de datos binarios basado en la especificacin del Empaquetado optimizado de XML binario (XOP). Metadatos: el lenguaje de descripcin de servicios web (WSDL) define un lenguaje estndar para especificar servicios y varios aspectos sobre cmo se pueden utilizar esos servicios. WS-Policy permite la especificacin de aspectos ms dinmicos del comportamiento de un servicio que no se pueden expresar en WSDL, como una opcin de seguridad preferida. WS-MetadataExchange permite que un cliente solicite directamente informacin descriptiva sobre un servicio, como su WSDL y sus directivas, utilizando SOAP. Seguridad: WS-Security, WS-SecureConversation, WS-Trust y WS-Federation todos definen las sumas a los mensajes SOAP para proporcionar autenticacin, integridad de datos, privacidad de datos y otras caractersticas de seguridad. Confiabilidad: la mensajera WS-Reliable define las sumas al encabezado SOAP que permiten la comunicacin confiable de un extremo a otro, incluso cuando se deben atravesar uno o ms intermediarios de los servicios Web. Transacciones: se genera en WS-Coordination, la transaccin WS-Atomic permite coordinar las transacciones de la confirmacin en dos fases en el contexto de conversaciones de servicios Web. La aplicacin de reserva de coches de alquiler probablemente utilizara algunos de estas tecnologas ms avanzadas. Por ejemplo, WS-Addressing es esencial cada vez que SOAP se utiliza sobre un mecanismo de transporte distinto de HTTP, que podra ser el caso para la comunicacin con la aplicacin cliente de centro de llamadas basada en .NET Framework. WCF confa en WS-Policy y en WS-Metadata Exchange para detectar si el sistema con el que est comunicando tambin est utilizando WCF y para otras cosas. La comunicacin confiable es esencial para la mayora de las situaciones, por lo que es probable que la Mensajera de WSReliable se utilizase para interactuar con muchas de las otras aplicaciones en este escenario. De igual forma, tambin podra utilizar WS-Security y las especificaciones relacionadas para proteger la comunicacin con una o ms aplicaciones, porque todas requeriran algn tipo de proteccin contra el acceso no autorizado o alguna modificacin de mensajes e interceptacin. Para las aplicaciones que requieren la integracin de la transaccin con el sistema de reserva de coches de alquiler sera esencial WS-Atomic Transaction. Finalmente, MTOM se podra utilizar cuando fuese necesario un formato de conexin optimizado para los datos binarios (por ejemplo, para las imgenes de ejemplos rpidos) y ambos lados de la comunicacin admitieran esta opcin. El punto clave es que WCF implementa los servicios Web interoperables que se completan con seguridad multiplataforma, confiabilidad, transacciones y otros servicios. Para proporcionar el rendimiento mximo, la comunicacin de WCF a WCF se puede optimizar significativamente, pero el resto de las comunicaciones utilizan

MCT: Luis Dueas

Pag 7 de 135

Manual de Windows Communication Foundation


los protocolos de servicios Web estndar. De hecho, es posible que una aplicacin nica exponga sus servicios a ambos tipos de clientes. Interoperabilidad con tecnologas de Microsoft Muchos clientes de Microsoft han realizado inversiones significativas en las tecnologas .NET Framework que incluye WCF. Proteger esas inversiones fue un objetivo fundamental de los diseadores de WCF. Al instalar WCF, no se interrumpe la tecnologa existente, as que no hay ningn requisito para que las organizaciones cambien las aplicaciones existentes para que la utilicen. Se proporciona una ruta clara de acceso para la actualizacin, sin embargo y cuando sea posible, WCF interopera con esas tecnologas anteriores. Por ejemplo, WCF y ASMX utilizan SOAP, por lo que las aplicaciones basadas en WCF pueden interoperar directamente con aquellas integradas en ASMX. Las aplicaciones Enterprise Services existentes tambin se pueden ajustar con interfaces WCF, permitindoles interoperar con aplicaciones generadas en WCF. Y como la puesta en cola persistente en WCF confa en MSMQ, las aplicaciones basadas en WCF pueden interoperar directamente con aplicaciones que no estn basadas en WCF generadas utilizando las interfaces nativas de MSMQ. En la aplicacin de reservas de coches de alquiler, el software generado utilizando cualquiera de estas tecnologas anteriores podra conectarse directamente a los servicios basados en el nuevo sistema de WCF y utilizarlos. Sin embargo, la interoperabilidad no siempre es posible. Por ejemplo, aunque WSE 1.0 y WSE 2.0 implementan algunas de las mismas especificaciones de WS-* que WCF, estas tecnologas anteriores implementan versiones anteriores de las especificaciones. La versin 3.0 de WSE permite la interoperabilidad con WCF, pero las versiones anteriores no.

Interoperabilidad con otros protocolos de XML


El futuro de Internet no es predecible y las tecnologas utilizadas hoy en da pueden evolucionar o ser reemplazadas. Hoy en da, una tendencia popular para generar aplicaciones Web cntricas (llamada por muchos "Web 2.0"), es un modelo de aplicacin basado en la comunicacin utilizando nicamente formatos XML simples que no se basan en SOAP y que confan exclusivamente en HTTP como transporte y como protocolo de aplicacin. Por ejemplo, el estilo arquitectnico de Representational State Transfer (REST) no tiene ninguna nocin de operaciones definidas por el usuario para tratar con datos. En su lugar, el estado de la aplicacin est asociado a mtodos de URL de HTTP y HTTP (como PUT, POST, DELETE y GET). Este enfoque est en contraste con la creacin de procedimientos definidos por el usuario o funciones con las que est familiarizada la mayora de los programadores en un entorno empresarial. Sin embargo, el enfoque REST tiene valor en escenarios donde los servicios deben funcionar como el servidor de las aplicaciones de la Web 2.0. REST es simplemente un ejemplo de una tecnologa de la Web 2.0 en evolucin. La flexibilidad se exige para cubrir con cambios imprevisibles en este entorno de modelos de programacin experimentales, de reinterpretation constante y refinamiento de los estndares. WCF es flexible. Por ejemplo, mientras WCF utiliza SOAP como una estructura subyacente, no se enlaza para utilizar SOAP para la comunicacin de la conexin. De hecho, WCF se puede configurar para procesar datos XML "sin formato" que no se ajustan en un sobre SOAP. WCF tambin se puede extender para admitir los formatos XML concretos, como ATOM (un estndar popular de RSS) e incluso formatos que no sean XML, como JavaScript Object Notation (JSON). Esta flexibilidad asegura que el cdigo escrito hoy ser vlido en el futuro, aun cuando los protocolos cambien o sean reemplazados. Por consiguiente, WCF se ha diseado para el presente y el futuro.

1.2. Conceptos Bsicos de Windows Communication Foundation


En este documento se proporciona una vista de alto nivel de la arquitectura de Windows Communication Foundation (WCF). Pretende explicar los conceptos clave y cmo encajan entre ellos.

Fundamentos de WCF

MCT: Luis Dueas

Pag 8 de 135

Manual de Windows Communication Foundation


Windows Communication Foundation (WCF)WCF es un tiempo de ejecucin y un conjunto de API para la creacin de sistemas que enven mensajes entre servicios y clientes. La misma infraestructura y API se utilizan para crear aplicaciones que se comuniquen con otras aplicaciones en el mismo sistema del equipo o en un sistema que resida en otra compaa y a la que se obtenga acceso a travs de Internet. Mensajera y extremos WCF se basa en la nocin de comunicacin basada en mensajes y cualquier cosa que se pueda modelar como un mensaje (por ejemplo, una solicitud HTTP o un mensaje de MSMQ), se puede representar de manera uniforme en el modelo de programacin. Esto habilita una API unificada en todos los mecanismos de transporte diferentes. El modelo distingue entre clientes, que son aplicaciones que inician la comunicacin y servicios, que son aplicaciones que esperan a que los clientes se comuniquen con ellos y respondan a esa comunicacin. Una nica aplicacin puede actuar como cliente y como servicio. Los mensajes se envan entre extremos. Los extremos son los lugares donde los mensajes se envan o reciben (o ambos), y definen toda la informacin requerida para el intercambio de mensajes. Un servicio expone uno o ms extremos de la aplicacin (y a cero o ms extremos de la infraestructura), y el cliente genera un extremo que es compatible con uno de los extremos del servicio. Un extremo describe de una manera basada en estndar dnde se deberan enviar los mensajes, cmo se deberan enviar y qu aspecto deberan tener los mensajes. Un servicio puede exponer esta informacin como metadatos que los clientes pueden procesar para generar clientes WCF adecuados y pilasde comunicacin. Protocolos de comunicaciones Un elemento requerido de la pila de la comunicacin es el protocolo de transporte. Los mensajes se pueden enviar a travs de intranets e Internet utilizando transportes comunes, como HTTP y TCP. Otros transportes incluidos admiten la comunicacin con aplicaciones Message Queue Server de Microsoft (MSMQ) y nodos en una malla de redes del mismo nivel. Se pueden agregar ms mecanismos de transporte utilizando los puntos de la extensin integrados de WCF. Otro elemento necesario en la pila de comunicacin es la codificacin que especifica cmo se da formato a cualquier mensaje determinado. WCF proporciona las siguientes codificaciones: Codificacin de texto, una codificacin interoperable. Codificacin Mecanismo de optimizacin de transmisin de mensajes (MTOM), que es una manera interoperable de enviar eficazmente datos binarios no estructurados a y desde un servicio. Codificacin binaria para una transferencia eficaz. Se pueden agregar ms mecanismos de codificacin (por ejemplo, una codificacin de compresin) utilizando los puntos de extensin integrados de WCF. Patrones de mensajes WCF admite varios patrones de mensajera, incluida la comunicacin de solicitud-respuesta unidireccional y dplex. Los transportes diferentes admiten patrones de mensajera diferentes y, por consiguiente, afectan a los tipos de interacciones que admiten. El tiempo de ejecucin y las API de WCF tambin le ayudan a enviar mensajes de manera segura y fiable.

Trminos de WCF
Entre otros conceptos y trminos usados en la documentacin de WCF se incluyen los siguientes. mensaje

MCT: Luis Dueas

Pag 9 de 135

Manual de Windows Communication Foundation


Un mensaje es una unidad autnoma de datos que pueden estar compuestos de varias partes, incluyendo un cuerpo y encabezados. servicio Un servicio es una construccin que expone uno o ms extremos, y en la que cada extremo expone una o ms operaciones de servicio. extremo Un extremo es una construccin en la que se envan o reciben mensajes (o ambos). Comprende una ubicacin (una direccin) que define dnde se pueden enviar mensajes, una especificacin del mecanismo de comunicacin (un enlace) que describe cmo se deberan enviar los mensajes, y una definicin para un conjunto de mensajes que se puede enviar o se puede recibir (o ambos) en esa ubicacin (un contrato de servicio) que describe qu mensajes se pueden enviar. Un servicio de WCF se expone al mundo como una coleccin de extremos. extremo de aplicaciones Un extremo expuesto por la aplicacin y que corresponde a un contrato de servicios implementado por la aplicacin. extremo de infraestructura Un extremo que expone la infraestructura para facilitar la funcionalidad necesaria o proporcionada por el servicio que no se relaciona con un contrato de servicios. Por ejemplo, un servicio podra tener un extremo de la infraestructura que proporciona informacin de metadatos. direccin Una direccin especifica la ubicacin donde se reciben los mensajes. Se especifica como un identificador uniforme de recursos (URI). La parte del esquema URI nombra el mecanismo de transporte que se ha de utilizar para alcanzar la direccin, como HTTP y TCP. La parte jerrquica del URI contiene una ubicacin nica cuyo formato depende del mecanismo de transporte. La direccin del extremo le permite crear direcciones nicas de extremo para cada extremo en un servicio o bajo ciertas condiciones compartir una direccin a lo largo de los extremos. El siguiente ejemplo muestra una direccin que utiliza el protocolo HTTPS con un puerto no predeterminado: HTTPS://cohowinery:8005/ServiceModelSamples/CalculatorService enlace Un enlace define cmo se comunica un extremo con el mundo. Consta de un conjunto de componentes llamados elementos de enlace que se "apilan" uno sobre el otro para crear la infraestructura de comunicaciones. Como poco, un enlace define el transporte (como HTTP o TCP) y la codificacin que se utiliza (como texto o binario). Un enlace puede contener elementos de enlace que especifican detalles como los mecanismos de seguridad utilizados para proteger los mensajes o el patrn de mensaje utilizado por un extremo. elemento de enlace Un elemento de enlace representa una parte determinada del enlace, como un transporte, una codificacin, comportamientos Un comportamiento es un componente que controla varios aspectos en tiempo de ejecucin de un servicio, un extremo, una operacin determinada o un cliente. Los comportamientos estn agrupados en funcin del mbito: los comportamientos comunes afectan globalmente a todos los extremos, los comportamientos comportamientos de de servicios slo afectan a los aspectos relacionados con servicios, los comportamientos de extremos slo afectan a las propiedades relacionadas con los extremos y los operaciones afectan a las operaciones determinadas. Por ejemplo, un comportamiento del servicio est limitando que especifica cmo un servicio reacciona cuando un exceso de mensajes amenaza agobiar sus funciones del control. Un comportamiento de extremos, por otro lado, slo controla los aspectos pertinentes a los extremos, como, por ejemplo, cmo y dnde encontrar una credencial de seguridad. enlaces proporcionados por el sistema una implementacin de un protocolo del nivel de infraestructura (como WSReliableMessaging), o cualquier otro componente de la pila de comunicaciones.

MCT: Luis Dueas

Pag 10 de 135

Manual de Windows Communication Foundation


WCF incluye varios enlaces proporcionados por el sistema. stas son colecciones de elementos de enlace que se optimizan para escenarios concretos. Por ejemplo, el WSHttpBinding est diseado para la interoperabilidad con servicios que implementan varias especificaciones WS - *. Estos enlaces predefinidos ahorran tiempo al presentar slo las opciones que se pueden aplicar correctamente al escenario en cuestin. Si un enlace predefinido no cumple sus requisitos, puede crear su propio enlace personalizado. configuracin frente a codificacin El control de una aplicacin puede realizarse mediante codificacin, configuracin o a mediante una combinacin de ambos. La configuracin tiene la ventaja de que permite a alguien que no sea el programador (por ejemplo, un administrador de redes) establecer parmetros de servicios y clientes despus de que el cdigo est escrito y sin tener que volver a compilar. La configuracin no slo le permite establecer valores como direcciones de extremos, sino que tambin proporciona control adicional al permitirle agregar extremos, enlaces y comportamientos. La codificacin permite al desarrollador retener un control estricto sobre todos los componentes del servicio o cliente, y cualquier ajuste realizado a travs de la configuracin se puede inspeccionar y, si fuese necesario, podra invalidarse mediante el cdigo. operacin de servicio Una operacin de servicio es un procedimiento definido en el cdigo de un servicio que implementa la funcionalidad de una operacin. Esta operacin se expone a los clientes como mtodos en un cliente de WCF. El mtodo puede devolver un valor y puede tomar un nmero opcional de argumentos, o no tomar ningn argumento y no devolver ninguna respuesta. Por ejemplo, una operacin que funciona como un simple "Hola" se puede utilizar para notificar acerca de la presencia de un cliente y para comenzar una serie de operaciones. contrato de servicio El contrato de servicio une varias operaciones relacionadas en una unidad funcional nica. El contrato puede definir ajustes de servicio, tales como el espacio de nombres del servicio, un contrato de devolucin de llamada correspondiente y otros ajustes de este tipo. En la mayora de los casos, el contrato se define mediante la creacin de una interfaz en el lenguaje de programacin que elija y la aplicacin del atributo ServiceContractAttribute a la interfaz. El cdigo de servicio real resulta mediante la implementacin de la interfaz. contrato de operacin Un contrato de operacin define los parmetros y el tipo de valor devuelto de una operacin. Al crear una interfaz que define el contrato de servicio, se significa un contrato de operacin mediante la aplicacin del atributo OperationContractAttribute a cada definicin de mtodo que forma parte del contrato. Las operaciones se pueden modelar como tomar un mensaje nico y devolver un mensaje nico, o como tomar un conjunto de tipos y devolver un tipo. En el ltimo caso, el sistema determinar el formato de los mensajes que han de intercambiarse para esa operacin. contrato de mensaje Un contrato de mensaje describe el formato de un mensaje. Por ejemplo, declara si los elementos del mensaje deberan ir en encabezados frente al cuerpo, qu nivel de seguridad debera aplicarse a qu elementos del mensaje, etc. contrato de error Un contrato de error puede estar asociado a una operacin de servicio para denotar errores que se pueden devolver al llamador. Una operacin puede tener cero o ms errores asociados a ella. Estos errores son errores de SOAP que se modelan como excepciones en el modelo de programacin. contrato de datos Los tipos de datos que utiliza un servicio se deben describir en metadatos para permitir a otros interoperar con el servicio. Las descripciones de los tipos de datos se conocen como el contrato de datos y los tipos se pueden utilizar en cualquier parte de un mensaje, por ejemplo, como parmetros o tipos de valores devueltos. Si el servicio slo utiliza tipos simples, no hay ninguna necesidad de utilizar explcitamente contratos de datos.

MCT: Luis Dueas

Pag 11 de 135

Manual de Windows Communication Foundation


alojamiento Un servicio se debe alojar en algn proceso. Un host es una aplicacin que controla la duracin del servicio. Los servicios pueden autoalojarse o un proceso de alojamiento existente puede administrarlos. servicio autoalojado Un servicio autoalojado es aquel que se ejecuta dentro de una aplicacin de proceso que el desarrollador cre. El desarrollador controla su duracin, establece las propiedades del servicio, abre el servicio (que lo establece en un modo de escucha) y cierra el servicio. proceso de alojamiento Un proceso de alojamiento es una aplicacin que est diseada para alojar servicios. Entre ellos se incluyen Internet Information Services (IIS), Windows Activation Services (WAS) y Windows Services. En estos escenarios alojados, el host controla la duracin del servicio. Por ejemplo, mediante IIS puede preparar un directorio virtual que contenga el ensamblado de servicio y archivo de configuracin. Cuando se recibe un mensaje, IIS inicia el servicio y controla su duracin. creacin de instancias Un servicio tiene un modelo de creacin de instancias. Hay tres modelos de creacin de instancias: "nico" en el que un objeto CLR nico repara todos los clientes; "por llamada", en el que un nuevo objeto CLR se crea para administrar cada llamada de cliente; y "por sesin", en la que se crea un conjunto de objetos CLR, uno para cada sesin individual. Para elegir un modelo de creacin de instancias se han de tener en cuenta los requisitos de aplicacin y el patrn de uso esperado del servicio. aplicacin de cliente Una aplicacin de cliente es un programa que intercambia mensajes con uno o ms extremos. La aplicacin de cliente comienza creando una instancia de un cliente de WCF y llamando mtodos del cliente de WCF. Es importante tener en cuenta que una nica aplicacin pueda ser cliente y servicio. canal Un canal es una implementacin concreta de un elemento de enlace. El enlace representa la configuracin y el canal es la implementacin asociada a esa configuracin. Hay por consiguiente, un canal asociado a cada elemento de enlace. Los canales se apilan uno sobre otro para crear la implementacin concreta del enlace: la pila de canales. cliente WCF Un cliente de WCF es una construccin de la aplicacin cliente que expone las operaciones de servicio como mtodos (en el lenguaje de programacin .NET Framework de su eleccin, como Visual Basic o Visual C#). Cualquier aplicacin puede alojar a un cliente de WCF, incluso una aplicacin que aloje un servicio. Por consiguiente, es posible crear un servicio que incluya clientes de WCF de otros servicios. Un cliente de WCF se puede generar automticamente utilizando ServiceModel Metadata Utility Tool (Svcutil.exe) y sealndolo hacia un servicio en ejecucin que publique metadatos. metadatos Los metadatos de un servicio describen las caractersticas del servicio que una entidad externo necesita entender para comunicarse con el servicio. ServiceModel Metadata Utility Tool (Svcutil.exe) puede utilizar los metadatos para generar un cliente de WCF y la configuracin que lo acompaa que puede usar una aplicacin cliente para interactuar con el servicio. Los metadatos expuestos por el servicio incluyen documentos de esquema XML, que definen el contrato de datos del servicio, y documentos WSDL, que describe los mtodos del servicio. Cuando se habilita, WCF genera automticamente los metadatos para el servicio mediante la inspeccin del servicio y sus extremos. Para publicar los metadatos desde un servicio, debe permitir explcitamente al comportamiento de los metadatos. seguridad La seguridad en WCF incluye confidencialidad (cifrado de mensajes para evitar las escuchas no autorizadas), integridad (los recursos para la deteccin de manipulacin del mensaje), autenticacin (los recursos para la validacin de servidores y clientes) y autorizacin (el control del acceso a los

MCT: Luis Dueas

Pag 12 de 135

Manual de Windows Communication Foundation


recursos). Estas funciones se proporcionan mediante la reutilizacin de mecanismos de seguridad existentes, como TLS sobre HTTP (tambin conocido como HTTPS) o la implementacin de una o ms de las numerosas especificaciones de seguridad WS - *. modo de seguridad de transporte La seguridad se puede proporcionar mediante uno de estos tres modos: modo de transporte, modo de seguridad de mensaje y transporte con modo de credencial de mensajes. El modo de seguridad de transporte especifica que los mecanismos de la capa de transporte (como HTTPS) proporcionan la confidencialidad, integridad y autenticacin. Al utilizar un transporte como HTTPS, este modo tiene la ventaja de ser eficaz en su rendimiento y bien entendido debido a su predominio en Internet. La desventaja es que este tipo de seguridad se aplica por separado en cada salto en la ruta de comunicacin, provocando que la comunicacin sea susceptible a un ataque tipo man in the middle. modo de seguridad de mensajes El modo de seguridad de mensajes especifica que la seguridad se proporciona mediante la implementacin de una o ms especificaciones de seguridad, como la especificacin denominada "Seguridad de los servicios Web: seguridad de mensajes SOAP (disponible en http://go.microsoft.com/fwlink/? LinkId=94684). Cada mensaje contiene los mecanismos necesarios para proporcionar la seguridad durante su trnsito y para permitir que los receptores detecten la manipulacin y el descifrado de mensajes. En este sentido, la seguridad se encapsula dentro de cada mensaje, proporcionando una seguridad de extremo a extremo en varios saltos. Dado que la informacin de seguridad se vuelve parte del mensaje, tambin es posible de incluir varios tipos de credenciales con el mensaje (se las conoce como demandas). Este enfoque tambin tiene la ventaja de permitir al mensaje viajar de manera segura en cualquier transporte, incluidos varios transportes entre su origen y destino. La desventaja de este enfoque es la complejidad de los mecanismos de cifrado empleados, que afectan al rendimiento. transporte con modo de seguridad de credencial de mensajes Este modo utiliza la capa de transporte para proporcionar la confidencialidad, autenticacin e integridad de los mensajes, mientras que cada uno de los mensajes puede contener varias credenciales (demandas) requeridas por los receptores del mensaje. WS-* Modo abreviado para el creciente conjunto de especificaciones de servicios Web (WS), tales como WSSecurity, WS-ReliableMessaging, etc., que se implementan en WCF.

1.3. Arquitectura de Windows Communication Foundation


El grfico siguiente muestra las capas principales de la arquitectura Windows Communication Foundation (WCF)

Arquitectura de WCF

MCT: Luis Dueas

Pag 13 de 135

Manual de Windows Communication Foundation


Contratos y descripciones Los contratos definen varios aspectos del sistema de mensajes. El contrato de datos describe cada parmetro que constituye cada mensaje que un servicio puede crear o utilizar. Los documentos de Lenguaje de definicin de esquemas XML (XSD) definen los parmetros de mensaje, permitiendo a cualquier sistema que entienda XML procesar los documentos. El contrato del mensaje define partes especficas del mensaje utilizando los protocolos SOAP y permite el control ms fino sobre las partes del mensaje, cuando la interoperabilidad exige tal precisin. El contrato de servicios especifica las firmas de mtodo actuales del servicio y se distribuye como una interfaz en uno de los lenguajes de programacin compatibles, como Visual Basic o Visual C#. Las directivas y enlaces estipulan las condiciones exigidas para comunicarse con un servicio. Por ejemplo, el enlace debe especificar (como mnimo) el transporte utilizado (por ejemplo, HTTP o TCP) y una codificacin. Las directivas incluyen los requisitos de seguridad y otras condiciones que se deben cumplir para comunicarse con un servicio. Tiempo de ejecucin de servicio La capa del tiempo de ejecucin del servicio contiene los comportamientos que slo se producen durante la operacin actual del servicio, es decir, los comportamientos en tiempo de ejecucin del servicio. La limitacin de peticiones controla cuntos mensajes se procesan que puede variar si la demanda para el servicio crece a un lmite preestablecido. Un comportamiento de error especifica lo que sucede cuando se produce un error interno en el servicio, por ejemplo, controlando qu informacin se comunica al cliente. (Demasiada informacin puede dar ventaja a un usuario malintencionado para organizar un ataque.) El comportamiento de los metadatos rige cmo y si los metadatos se ponen a disposicin del mundo externo. El comportamiento de la instancia especifica cuntas instancias del servicio se pueden ejecutar (por ejemplo, un singleton especifica slo una instancia para procesar todos los mensajes). El comportamiento de la transaccin habilita la recuperacin de operaciones de transaccin si se produce un error. El comportamiento de la expedicin es el control de cmo la infraestructura WCF procesa un mensaje. La extensibilidad habilita la personalizacin de procesos en tiempo de ejecucin. Por ejemplo, la inspeccin del mensaje es la facilidad para inspeccionar partes de un mensaje y la filtracin de parmetros permite que se realicen acciones preestablecidas basndose en filtros que actan en encabezados del mensaje. Mensajera La capa de la mensajera se crea de canales. Un canal es un componente que procesa un mensaje de alguna manera, por ejemplo, autenticando un mensaje. Un conjunto de canales tambin se conoce como una pila de canales. Los canales funcionan en los mensajes y encabezados del mensaje. Esto es diferente de la capa en tiempo de ejecucin del servicio, que se ocupa principalmente de procesar el contenido de los cuerpos de los mensajes. Hay dos tipos de canales: canales de transporte y canales de protocolo. Los canales de transporte leen y escriben mensajes de la red (o algn otro punto de la comunicacin con el mundo externo). Algunos transportes utilizan un codificador para convertir los mensajes (que se representan como conjuntos de informacin XMLs) hacia y desde la representacin de la secuencia de bytes utilizada por la red. Son ejemplos de transportes HTTP, canalizaciones con nombre, TCP y MSMQ. Son ejemplos de codificaciones XML y binario optimizado. Los canales de protocolo implementan protocolos de procesamiento de mensajes, a menudo leyendo o escribiendo encabezados adicionales en el mensaje. Los ejemplos de tales protocolos incluyen WS-Security y WS-Reliability.

MCT: Luis Dueas

Pag 14 de 135

Manual de Windows Communication Foundation


La capa de la mensajera muestra los posibles formatos y modelos de intercambio de los datos. WS-Security es una implementacin de la especificacin WS-Security que habilita la seguridad en la capa del mensaje. El canal de mensajera WS-Reliable habilita la garanta de entrega del mensaje. Los codificadores presentan una variedad de codificaciones que se pueden utilizar para satisfacer las necesidades del mensaje. El canal HTTP especifica que el Protocolo de transporte de hipertexto se utiliza para la entrega del mensaje. El canal TCP especifica de manera similar el protocolo TCP. El canal de flujo de transacciones rige los modelos de mensajes de transaccin. El canal de la canalizacin con nombre habilita la comunicacin entre procesos. El canal de MSMQ habilita la interoperacin con aplicaciones MSMQ. Alojamiento y activacin En su forma final, un servicio es un programa. Como otros programas, un servicio se debe ejecutar en un ejecutable. Esto se conoce como un servicio con host propio. Los servicios tambin se pueden hospedaro ejecutar en un ejecutable administrado por un agente externo, como IIS o Servicio de activacin de Windows (WAS). WAS permite activar automticamente aplicaciones WCF cuando se implementan en un equipo que ejecuta WAS. Los servicios tambin se pueden ejecutar manualmente como ejecutables (archivos .exe). Un servicio tambin se puede ejecutar automticamente como un servicio de Windows. Los componentes COM+ tambin se pueden hospedar como servicios WCF.

1.4. WCF y Perfil de Cliente de .NET Framework


Perfil de cliente de .NET Framework es una versin ligera de .Net Framework diseada para los clientes que no necesitan el marco de trabajo completo. El marco del cliente no admite la totalidad de Windows Communication Foundation.

Caractersticas de WCF compatibles con el perfil de cliente de .Net Framework


Perfil de cliente de .NET Framework admite las siguientes caractersticas de Windows Communication Foundation: Se admite todo WCF, salvo Cardspace y el hospedaje web. Se admiten los canales TCP/IP de comunicacin remota. No se admite Asmx (servicios web).

2. Tutorial de Introduccin
Los temas contenidos en esta seccin estn pensados para ofrecerle una visin rpida a la programacin en Windows Communication Foundation (WCF). Estn diseados para ser completados en el orden en que aparecen en la lista incluida al final de este tema. Este tutorial constituye una introduccin a los pasos necesarios para crear aplicaciones de cliente y servicio de WCF. Un servicio es una construccin que expone uno o ms extremos, donde cada uno de ellos expone una o ms operaciones de servicio. El extremo de un servicio especifica una direccin donde se puede encontrar el servicio, un enlace que contiene la informacin que un cliente debe comunicar con el servicio y un contrato que define la funcionalidad proporcionada por el servicio a sus clientes. Despus de ver por orden los temas de este tutorial, dispondr de un servicio en funcionamiento y un cliente que puede invocar las operaciones del servicio. Los primeros tres temas describen cmo definir un servicio con un contrato, cmo implementar el servicio y cmo configurarlo en cdigo, host y ejecutar el servicio. El servicio que se crea es autohospedado y el cliente y el servicio se ejecutan en el mismo equipo. El servicio se configura utilizando cdigo en vez de configuracin. Los servicios tambin se pueden hospedar bajo los servicios de Internet Information Server (IIS). Los servicios tambin se pueden configurar dentro de un archivo de configuracin. Los tres siguientes temas describen cmo crear un proxy de cliente, configurar la aplicacin cliente y crear y usar un cliente que pueda tener acceso a la funcionalidad del servicio. Los servicios publican metadatos a los

MCT: Luis Dueas

Pag 15 de 135

Manual de Windows Communication Foundation


que se puede tener acceso que definen las construcciones que necesita una aplicacin cliente para comunicarse con las operaciones de servicio. WCF proporciona una ServiceModel Metadata Utility Tool (Svcutil.exe) para automatizar el proceso de acceso a estos metadatos publicados y utilizarlo para construir y configurar la aplicacin cliente para el servicio. En todos los temas de esta seccin se asume que est usando Visual Studio 2008 como entorno de desarrollo. Si est utilizando otro entorno de desarrollo, omita las instrucciones especficas para Visual Studio. Nota: Si est ejecutando Windows Vista, debe iniciar Visual Studio; para ello, vaya al men Inicio, haga clic con el botn secundario en Microsoft Visual Studio 2008 y seleccione Ejecutar como administrador. Para iniciar Visual Studio 2008 siempre como administrador, puede crear un acceso directo, hacer clic con el botn secundario en el acceso directo, seleccionar Propiedades, seleccionar la ficha Compatibilidad y activar la casilla Ejecutar este programa como administrador. Al iniciar Visual Studio 2008 con este acceso directo, siempre se ejecutar con derechos de administrador.

2.1. Definicin de un Contrato de Servicio de WCF


sta es la primera de las seis tareas necesarias para crear un servicio de Windows Communication Foundation (WCF) bsico y un cliente que pueda llamar al servicio. Al crear un servicio WCF bsico, la primera tarea es definir un contrato. El contrato especifica qu operaciones admite el servicio. Una operacin se puede considerar un mtodo de servicio web. Los contratos se crean mediante la definicin de una interfaz de C++, C# o VB. Cada mtodo de la interfaz se corresponde con una operacin de servicio concreta. Cada interfaz debe tener ServiceContractAttribute aplicado y cada operacin debe tener OperationContractAttribute aplicado. Si un mtodo de una interfaz que tiene ServiceContractAttribute no tiene OperationContractAttribute, no se expone ese mtodo. El cdigo utilizado para esta tarea se proporciona en el ejemplo que sigue al procedimiento.

Creacin de un contrato de Windows Communication Foundation con una interfaz


1. Abra Visual Studio 2008 como administrador haciendo clic con el botn secundario en el programa en el men Inicio y seleccionando Ejecutar como administrador. 2. Cree un nuevo proyecto de aplicacin de consola. En el cuadro de dilogo Nuevo proyecto, seleccione Visual Basic o Visual C#y elija la plantilla Aplicacin de consola y denomnela Servicio. Utilice la ubicacin predeterminada. 3. 4. Cambie el espacio de nombres Service predeterminado a Microsoft.ServiceModel.Samples. Agregue una referencia a System.ServiceModel.dll al proyecto. a. En el Explorador de soluciones, haga clic con el botn secundario en la carpeta Referencias bajo la carpeta del proyecto y elija Agregar referencia. b. Haga clic en la ficha Examinar en el cuadro de dilogo Agregar referencia y navegue hasta c:\Windows\Microsoft.Net\Framework\v3.0\Windows Communication Foundation, seleccione System.ServiceModel.dll y haga clic en Aceptar. Nota: Al utilizar un compilador de lnea de comandos (como, por ejemplo, Csc.exe o Vbc.exe), tambin debe proporcionar la ruta de acceso a los ensamblados. De forma predeterminada, en un equipo que ejecuta, por ejemplo, Windows Vista, la ruta de acceso es Windows\Microsoft.NET\ Framework\v3.0\Windows Communication Foundation. 5. Agregue una using declaracin (Imports en Visual Basic) para el espacio de nombres System. ServiceModel. 6. Defina una nueva interfaz denominada ICalculator y aplique el atributo ServiceContractAttribute a la interfaz con un valor Namespace de "http://Microsoft.ServiceModel.Samples". Especificar el espacio

MCT: Luis Dueas

Pag 16 de 135

Manual de Windows Communication Foundation


de nombres explcitamente es un procedimiento recomendado porque evita que el valor de espacio de nombres predeterminado se agregue al nombre del contrato. Nota: Al utilizar los atributos para anotar una interfaz o clase, puede quitar la parte del atributo del nombre de atributo. De esta forma, ServiceContractAttribute se convierte en [ServiceContract] 7. Declare un mtodo para cada una de las operaciones que el contrato ICalculator expone (suma, resta, multiplicacin y divisin) dentro de la interfaz y aplique el atributo OperationContractAttribute a cada mtodo que desea exponer como parte del contrato WCF pblico.

2.2. Cmo Implementar un Contrato de Servicio de WCF


sta es la segunda de las seis tareas que son necesarias para crear un servicio Windows Communication Foundation (WCF) bsico y un cliente que llame al servicio. La creacin de un servicio WCF requiere que se cree primero el contrato, que se define mediante una interfaz. Para obtener ms informacin acerca de la creacin de la interfaz. El siguiente paso, mostrado en este ejemplo, es implementar la interfaz. Esto implica la creacin de una clase denominada CalculatorService que implemente la interfaz ICalculator definida por el usuario. El cdigo utilizado para esta tarea se proporciona en el ejemplo que sigue al procedimiento.

Para implementar un contrato de servicio WCF


1. Cree una nueva clase denominada CalculatorService en el mismo archivo donde defini la interfaz ICalculator. CalculatorService implementa la interfaz ICalculator. 2. Implemente cada mtodo definido en la interfaz ICalculator dentro de la clase CalculatorService. Nota: El cdigo de salida de escritura se ha agregado para realizar las pruebas convenientes.

2.3. Procedimiento para Hospedar y Ejecutar un Servicio Bsico de WCF


sta es la tercera de las seis tareas necesarias para crear un servicio Windows Communication Foundation (WCF) bsico y un cliente que pueda llamar al servicio. En este tema se describe cmo ejecutar un servicio bsico de Windows Communication Foundation (WCF). Este procedimiento consta de los siguientes pasos: Crear una direccin base para el servicio. Crear un host del servicio para el servicio. Habilitar el intercambio de metadatos Abrir el host del servicio. En el ejemplo que se ofrece despus del procedimiento, se proporciona una lista completa del cdigo escrito en esta tarea. Agregue el cdigo siguiente al mtodo Main() definido en la clase Program. Esta clase se gener al crear la solucin Service.

Configuracin de una direccin base para el servicio


1. Cree una instancia de Uri para la direccin base del servicio. Este identificador URI especifica el esquema HTTP, su equipo local, el nmero de puerto 8000 y la ruta de acceso ServiceModelSample/Service correspondiente al servicio que se especific para el espacio de nombres del servicio del contrato.

Hospedaje del servicio.

MCT: Luis Dueas

Pag 17 de 135

Manual de Windows Communication Foundation


1. Importe el espacio de nombres System.ServiceModel.Description. Esta lnea de cdigo se debera colocar en la parte superior del archivo Program.cs/Program.vb con el resto de las instrucciones using o imports. 2. Cree una nueva instancia de ServiceHost para hospedar el servicio. Debe especificar el tipo que implementa el contrato de servicios y la direccin base. En este ejemplo, la direccin base es http://localhost:8000/ServiceModelSamples/Service y CalculatorService es el tipo que implementa el contrato de servicio. 3. Agregue una instruccin try-catch que detecte una CommunicationException y agregue el cdigo en los tres pasos siguientes al bloqueo de intentos. La clusula catch debera mostrar un mensaje de error y, a continuacin, llamar a selfHost.Abort(). 4. Agregue un extremo que exponga el servicio. Para ello, debe especificar el contrato que el extremo est exponiendo, un enlace y la direccin del extremo. Para obtener este ejemplo, especifique ICalculator como el contrato, WSHttpBinding como el enlace y CalculatorService como la direccin. Observe que la direccin del extremo es una direccin relativa. La direccin completa del extremo es la combinacin de la direccin base y la direccin del extremo. En este caso la direccin completa es http://localhost:8000/ServiceModelSamples/Service/CalculatorService. 5. Habilite el intercambio de metadatos. Para ello, agregue un comportamiento de metadatos de servicio. Primero, cree una instancia de ServiceMetadataBehavior, establezca la propiedad HttpGetEnabled en true y, a continuacin, agregue el nuevo comportamiento al servicio. 6. Abra el ServiceHost y espere a los mensajes entrantes. Cuando el usuario presione la tecla Entrar, cierre el ServiceHost.

Para comprobar si el servicio funciona


1. Ejecute service.exe desde dentro de Visual Studio. Al ejecutarse en Windows Vista, el servicio se debe ejecutar con privilegios de administrador. Dado que Visual Studio se ejecut con privilegios de administrador, service.exe tambin se ejecuta con dichos privilegios. Tambin puede iniciar un nuevo smbolo del sistema con privilegios de administrador y ejecutar service.exe desde all. 2. Abra Internet Explorer y vaya a la pgina de depuracin del servicio en http://localhost:8000/ ServiceModelSamples/Service.

Ejemplo
El siguiente ejemplo incluye el contrato de servicios y la implementacin de los pasos anteriores del tutorial y hospeda el servicio en una aplicacin de consola. Compile lo siguiente en una aplicacin ejecutable llamada Service.exe . Asegrese de hacer referencia a System.ServiceModel.dll al compilar el cdigo. Nota: Servicios como este requieren permiso para registrar las direcciones HTTP en el equipo para la realizacin de escuchas. Las cuentas de administrador tienen este permiso, pero las cuentas que no son de administrador deben obtener la concesin de permiso para espacios de nombre HTTP. Al ejecutarse en Visual Studio, the service.exe se debe ejecutar con privilegios de administrador.

2.4. Creacin de un Cliente de WCF


sta es la cuarta de las seis tareas que son necesarias para crear un servicio de Windows Communication Foundation (WCF) bsico y un cliente que puede llamar al servicio. En este tema se describe cmo se pueden recuperar metadatos desde un servicio WCF y usarlos para crear un proxy WCF que pueda obtener acceso al servicio. Esta tarea se completa con ayuda de la ServiceModel Metadata Utility Tool (Svcutil.exe) que WCF proporciona. Esta herramienta obtiene los metadatos del servicio y

MCT: Luis Dueas

Pag 18 de 135

Manual de Windows Communication Foundation


genera un archivo de cdigo fuente administrado para un proxy en el lenguaje elegido. Adems de crear el proxy de cliente, la herramienta tambin crea el archivo de configuracin para el cliente que permite que la aplicacin cliente se conecte al servicio en uno de sus extremos. La aplicacin de cliente usa el proxy generado para crear un objeto de cliente de WCF. El cdigo del cliente generado por esta tarea se proporciona en el ejemplo que sigue el procedimiento.

Creacin de un cliente de Windows Communication Foundation


1. Siga estos pasos para crear en la solucin actual un nuevo proyecto para el cliente en : a. En el Explorador de soluciones (en la esquina superior derecha) de la misma solucin que contiene el servicio, haga clic con el botn secundario en la solucin actual (no el proyecto) y seleccione Agregar y, a continuacin, Nuevo proyecto. b. En el cuadro de dilogo Agregar nuevo proyecto, seleccione Visual Basic o Visual C#y elija la plantilla Aplicacin de consola y denomnela Cliente. Utilice la ubicacin predeterminada. c. 2. Haga clic en Aceptar.

Agregue una referencia a System.ServiceModel.dll para el proyecto: a. Haga clic con el botn secundario en la carpeta Referencias del proyecto Cliente en el Explorador de soluciones y seleccione Agregar referencia. b. Seleccione la ficha Reciente, elija System.ServiceModel.dll en el cuadro de lista y haga clic en Aceptar. Dado que ya agreg una referencia a este ensamblado en el primer paso de este tutorial, ahora aparece en la ficha Reciente. Si no lo ve en la ficha Reciente, seleccione la ficha Examinar, navegue hasta C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation y seleccione el ensamblado desde all. Nota: Al utilizar un compilador de lnea de comandos (como, por ejemplo, Csc.exe o Vbc.exe), tambin debe proporcionar la ruta de acceso a los ensamblados. De forma predeterminada, en un equipo que ejecuta, por ejemplo, Windows Vista, la ruta de acceso es Windows\Microsoft.NET\ Framework\v3.0\Windows Communication Foundation.

3.

Agregue una instruccin using (Imports en Visual Basic) para el espacio de nombres System. ServiceModel en el archivo Program.cs o Program.vb generado. Imports System.ServiceModel

4. 5.

Inicie el servicio creado en los pasos anteriores. Ejecute la Service Model Metadata Utility Tool (SvcUtil.exe) con los modificadores adecuados para crear el cdigo de cliente y un archivo de configuracin realizando los siguientes pasos: a. Inicie una sesin de consola SDK de Windows seleccionando CMD Shell bajo la entrada Microsoft Windows SDK en el men Inicio. b. Explore hasta el directorio donde desea colocar el cdigo de cliente. Si cre el proyecto de cliente con la configuracin predeterminada, el directorio es C:\Users\<nombre de usuario>\Documents\Visual Studio 2005\Projects\Service\Client. Utilice la herramienta de lnea de comandos Service Model Metadata Utility Tool (SvcUtil.exe) con los modificadores adecuados para crear el cdigo de cliente. El siguiente ejemplo genera un archivo de cdigo y un archivo de configuracin para el servicio. svcutil.exe /language:vb /out:generatedProxy.vb /config:app.config http://localhost:8000/ServiceModelSamples/service De forma predeterminada, el cdigo de proxy de cliente se genera en un archivo con nombre despus del servicio (en este caso, por ejemplo, CalculatorService.cs o CalculatorService.vb) con una extensin adecuada al lenguaje de programacin: .vb para Visual Basic o .cs para C#). El modificador /out cambia el nombre del archivo proxy de cliente a generatedProxy.cs. El modificador /config cambia el nombre predeterminado del archivo de configuracin de cliente, output.config, por app.config. Observe que los dos archivos se generan en el

MCT: Luis Dueas

Pag 19 de 135

Manual de Windows Communication Foundation


directorio C:\Users\<nombre de usuario>\Documents\Visual Studio 2005\Projects\Service\ Client. Agregue el proxy generado al proyecto de cliente en Visual Studio, haga clic con el botn secundario en el proyecto de cliente en el Explorador de soluciones, y seleccione Agregar y Elemento existente. Seleccione el archivo generatedProxy.cs generado en el paso anterior.

6.

2.5. Configuracin de un Cliente Bsico de WCF


sta es la quinta de las seis tareas necesarias para crear un servicio de Windows Communication Foundation (WCF) bsico y un cliente que pueda llamar al servicio. En este tema se agrega el archivo de configuracin del cliente generado mediante la Service Model Metadata Utility (Svcutil.exe) en el proyecto del cliente y se explica el contenido de los elementos de configuracin del cliente. La configuracin del cliente consiste en especificar el extremo que utiliza el cliente para obtener acceso al servicio. Un extremo tiene una direccin, un enlace y un contrato y cada uno de estos elementos debe especificarse en el proceso de configuracin del cliente. El contenido de los archivos de configuracin generados para el cliente se proporciona en el ejemplo despus del procedimiento.

Configuracin de un cliente de Windows Communication Foundation


1. Agregue el archivo de configuracin App.config generado en el procedimiento Creacin de un cliente de Windows Communication Foundation anterior al proyecto del cliente en Visual Studio. Haga clic con el botn secundario en el proyecto de cliente en el Explorador de soluciones, seleccione Agregar y, a continuacin, Elemento existente. Luego seleccione el archivo de configuracin App.config en el directorio C:\Users\<nombre de usuario>\Documents\Visual Studio 2005\Projects\Service\Client. (El archivo se llama App.config porque se us el modificador /config:app.config al generarlo con la herramienta Svcutil.exe.) Haga clic en Aceptar. De forma predeterminada, el filtro del cuadro de dilogo Agregar elemento existente descarta todos los archivos con extensin .config. Para ver estos archivos, seleccione Todos los archivos (*.*) en el cuadro de lista desplegable situado en la esquina inferior derecha del cuadro de dilogo Agregar elemento existente. 2. Abra el archivo de configuracin generado. Svcutil.exe genera valores para cada ajuste del enlace. El siguiente ejemplo es una vista del archivo de configuracin generado. Bajo la seccin <system.serviceModel>, busque el elemento <endpoint>. El siguiente archivo de configuracin es una versin simplificada del archivo generado. <?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_ICalculator"> </binding> </wsHttpBinding> </bindings> <client> <endpoint address="http://localhost:8000/ServiceModelSamples/Service/CalculatorService" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator" contract="Microsoft.ServiceModel.Samples.ICalculator" name="WSHttpBinding_ICalculator"> </endpoint> </client> </system.serviceModel> </configuration> Este ejemplo configura el extremo que utiliza el cliente para tener acceso al servicio que se ubica en la siguiente direccin: http://localhost:8000/ServiceModelSamples/service

MCT: Luis Dueas

Pag 20 de 135

Manual de Windows Communication Foundation


El elemento de extremo especifica que el contrato Microsoft.ServiceModel.Samples.ICalculator se utiliza para la comunicacin, que est configurada con el WsHttpBinding proporcionado por sistema. Este enlace especifica HTTP como el transporte, la seguridad interoperable y otros detalles de configuracin.

2.6. Cmo Usar un Cliente de WCF


sta es la sexta de las seis tareas que son necesarias para crear un servicio de Windows Communication Foundation (WCF) bsico y un cliente que puede llamar al servicio. Una vez creado y configurado un proxy de Windows Communication Foundation (WCF), se puede crear una instancia de cliente y la aplicacin de cliente se puede compilar y utilizar para comunicar con el servicio WCF. En este tema se describen los procedimientos para crear y utilizar un cliente de WCF. Este procedimiento hace tres cosas: crea un cliente de WCF, llama a las operaciones de servicio desde el proxy generado y cierra el cliente una vez que se completa la llamada de la operacin. El cdigo discutido en el procedimiento tambin se proporciona en el ejemplo que sigue al procedimiento. El cdigo de esta tarea se debera colocar en el mtodo Main() de la clase Program generada en el proyecto de cliente.

Uso de un cliente de Windows Communication Foundation


1. Cree una instancia EndpointAddress para la direccin base del servicio que va llamar y, a continuacin, cree un objeto Client de WCF. 2. 3. Llame a las operaciones del cliente desde dentro del Client. Llame a Close en el cliente WCF y espere hasta que el usuario presione la tecla Entrar para terminar la aplicacin.

2.7. Solucin de Problemas con el Tutorial de Introduccin


En este tema se enumeran los problemas ms comunes que se producen al desarrollar el Tutorial de introduccin y se explica cmo resolverlos. Problema: Los archivos del proyecto no se encuentran en el disco duro. Solucin: Visual Studio guarda los archivos de proyecto en c:\users\<nombre de usuario\Documents\Visual Studio 2005\Projects en Windows Vista y en c:\Documents and Settings\<nombre de usuario>\My Documents\Visual Studio 2005\Projects en versiones anteriores de Windows. Problema: Se produce el error siguiente cuando se intenta ejecutar la aplicacin de servicio: HTTP no pudo registrar la direccin URL http://+:8000/ServiceModelSamples/Service/. El proceso no tiene derechos de acceso a este espacio de nombres. Solucin: El proceso que hospeda un servicio WCF se debe ejecutar con privilegios administrativos. Si est ejecutando el servicio desde Visual Studio 2008, debe ejecutar Visual Studio 2008 como administrador. Para ello, haga clic en Inicio, haga clic con el botn secundario en Visual Studio 2008 y seleccione Ejecutar como administrador. Si est ejecutando el servicio desde el smbolo del sistema debe iniciar el smbolo del sistema como administrador de una forma similar. Haga clic en Inicio, haga clic con el botn secundario en Smbolo del sistema y seleccione Ejecutar como administrador. Problema:

MCT: Luis Dueas

Pag 21 de 135

Manual de Windows Communication Foundation


Se produce el error siguiente al intentar utilizar la herramienta Svcutil.exe: 'svcutil' no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable. Solucin: Svcutil.exe debe estar en la ruta de acceso del sistema. La solucin ms fcil es utilizar el smbolo del sistema de Visual Studio 2005. Haga clic en Inicio, seleccione Todos los programas, Visual Studio 2008, Visual Studio Tools y, a continuacin, Smbolo del sistema de Visual Studio 2008. Este smbolo del sistema establece la ruta de acceso del sistema en las ubicaciones correctas para todas las herramientas distribuidas como parte de Visual Studio 2008. Problema: No se encuentra el archivo app.config generado por Svcutil.exe. Solucin: El cuadro de dilogo Agregar elemento existente slo muestra de forma predeterminada los archivos con las extensiones siguientes: .cs, .resx, .settings, .xsd, .wsdl. Puede especificar que desea ver todos los tipos de archivos seleccionando Todos los archivos (*.*) en el cuadro de lista desplegable situado en la esquina inferior derecha del cuadro de dilogo Agregar elemento existente. Problema: Se produce el error de sintaxis siguiente durante la compilacin de la aplicacin cliente: 'CalculatorClient' no contiene una definicin de '<nombre de mtodo>' ni se encontr ningn mtodo de extensin '<nombre de mtodo>' que acepte un primer argumento de tipo 'CalculatorClient' (falta una directiva using o una referencia de ensamblado?) Solucin: Slo los mtodos que se marcan con ServiceOperationAttribute se exponen al exterior. Si omiti el atributo ServiceOperationAttribute en uno de los mtodos de la interfaz ICalculator, aparece este mensaje de error al compilar una aplicacin cliente que realice una llamada a la operacin que no tiene el atributo. Problema: Se produce el error siguiente durante la compilacin de la aplicacin cliente: no se puede encontrar el tipo o el nombre de espacio de nombres 'CalculatorClient' (falta una directiva using o una referencia de ensamblado?) Solucin: Este error se produce si no se agrega el archivo proxy.cs o proxy.vb a su proyecto de cliente. Problema: Excepcin no controlada: System.ServiceModel.EndpointNotFoundException: no se puede establecer conexin con http://localhost:8000/ServiceModelSamples/Service/CalculatorService. Cdigo de error TCP 10061: no se estableci ninguna conexin porque el equipo de destino la rechaz. Solucin: Este error se produce si se ejecuta la aplicacin cliente sin ejecutar el servicio.

3. Programacin Bsica de WCF


En esta seccin se presentan los principios para crear aplicaciones de Windows Communication Foundation.

3.1. Ciclo de Vida de Programacin Bsica


Windows Communication Foundation (WCF) permite a las aplicaciones comunicar si estn en el mismo equipo, en Internet o en diferentes plataformas de aplicacin. En este tema se describen las tareas necesarias para generar una aplicacin de WCF.

MCT: Luis Dueas

Pag 22 de 135

Manual de Windows Communication Foundation


Las tareas bsicas
Las tareas bsicas que se van a realizar son, en orden: 1. Definir el contrato de servicios. Un contrato de servicios especifica la firma de un servicio, los datos que intercambia y otros datos necesarios contractualmente. 2. Implemente el contrato. Para implementar un contrato de servicios, cree la clase que implementa el contrato y especifique comportamientos personalizados que debera tener el tiempo de ejecucin. 3. 4. 5. Configure el servicio especificando informacin de extremo y otra informacin de comportamiento. Hospede el servicio en una aplicacin. Generacin de una aplicacin de cliente.

Aunque los temas de esta seccin siguen este orden, algunos escenarios no se inician al principio. Por ejemplo, si desea construir un cliente para un servicio existente, ha de comenzar en el paso 5. O si est generando un servicio que utilizarn otros, puede omitir el paso 5.

3.2. Diseo e Implementacin de Servicios


En esta seccin se muestra cmo definir e implementar los contratos de WCF. Un contrato de servicio especifica lo que un extremo comunica al mundo exterior. En un nivel ms concreto, es una instruccin sobre un conjunto de mensajes concretos organizada en modelos de intercambio de mensajes bsicos (MEP), como solicitud/respuesta, unidireccional y dplex. Si un contrato de servicio es un conjunto relacionado de forma lgica de intercambios de mensajes, una operacin de servicio es un intercambio nico de mensajes. Por ejemplo, una operacin Hello debe aceptar obviamente un mensaje (de manera que el autor de la llamada pueda anunciar el saludo) y puede o no devolver un mensaje (dependiendo de la cortesa de la operacin).

Informacin general
En este tema se proporciona un nivel alto de orientacin conceptual para disear e implementar los servicios de WCF. Los subtemas proporcionan ms informacin detallada sobre las caractersticas de diseo e implementacin. Antes de disear e implementar su aplicacin WCF, se recomienda lo siguiente: Entender lo que es un contrato de servicio, cmo funciona, y cmo crear uno. Comprender que los contratos especifican requisitos mnimos que la configuracin en tiempo de ejecucin o el entorno de alojamiento pueden no admitir.

Contratos de servicio
Un contrato de servicio es una instruccin que es capaz de lo siguiente: La agrupacin de operaciones en un servicio. La firma de las operaciones en trminos de mensajes intercambiados. Los tipos de datos de estos mensajes. La ubicacin de las operaciones. Los protocolos concretos y formatos de serializacin que se utilizan para admitir la comunicacin correcta con el servicio. Por ejemplo, un contrato del orden de compra podra tener una operacin CreateOrder que aceptase una entrada de tipos de informacin de orden y devolviese informacin sobre accin completada o de error, adems de un identificador de orden. Tambin podra tener una operacin GetOrderStatus que aceptase un identificador de orden y devolviese informacin de estado de la orden. Un contrato de servicio de este tipo especificara lo siguiente: 1. 2. 3. 4. Que el contrato de la orden compra consistiese en las operaciones CreateOrder y GetOrderStatus. Que las operaciones han especificado mensajes de entrada y de salida. Los datos que estos mensajes pueden llevar. Instrucciones de categoras sobre la infraestructura de la comunicacin necesaria para procesar correctamente los mensajes. Por ejemplo, estos detalles incluyen qu formularios de seguridad son necesarios para establecer una comunicacin correcta.

MCT: Luis Dueas

Pag 23 de 135

Manual de Windows Communication Foundation


Para llevar este tipo de informacin a otras aplicaciones en muchas otras plataformas (incluidas plataformas que no sean de Microsoft), los contratos de servicio de XML se expresan pblicamente en los formatos XML estndar, como Web Services Description Language (WSDL) y XML Schema (XSD), entre otros. Los desarrolladores para muchas plataformas pueden utilizar esta informacin de contrato pblico para crear aplicaciones que pueden comunicarse con el servicio, porque entienden el lenguaje de la especificacin y porque esos lenguajes estn diseados para permitir la interoperacin describiendo los formularios, formatos y protocolos pblicos que el servicio admite. Los contratos se pueden expresar de muchas maneras, pero, aunque WSDL y XSD son lenguajes excelentes para describir servicios de una manera accesible, se trata de lenguajes difciles de usar directamente y son simplemente descripciones de un servicio, no implementaciones de contratos de servicio. Por consiguiente, las aplicaciones WCF utilizan atributos administrados, interfaces y clases para definir la estructura de un servicio e implementarlo. El contrato resultante definido en tipos administrados se puede convertir (tambin denominado exportar) como metadatos (WSDL y XSD) cuando lo necesitan clientes u otros implementadores de servicio, sobre todo en otras plataformas. El resultado es un modelo de programacin sencillo que se puede describir utilizando metadatos pblicos en cualquier aplicacin cliente. Los detalles de los mensajes SOAP subyacentes, el transporte e informacin relacionada de seguridad, etc., pueden dejarse en WCF, que realiza automticamente las conversiones necesarias a y desde el sistema de tipos de contratos de servicio al sistema de tipos de XML. Mensajes arriba y al centro Utilizar interfaces, clases y mtodos administrados para modelar las operaciones de servicio es sencillo cuando est acostumbrado a firmas de mtodo de estilo de llamada a procedimiento remoto (RPC), en las que pasar parmetros a un mtodo y recibir valores de devolucin es la forma normal de solicitar funcionalidad desde un objeto u otro tipo de cdigo. Por ejemplo, los programadores que utilicen lenguajes administrados como Visual Basic y C++ COM pueden aplicar su conocimiento del enfoque del estilo RPC (si utilizan objetos o interfaces) a la creacin de contratos de servicio WCF sin experimentar los problemas inherentes a los sistemas de objetos distribuidos de estilo RPC. La orientacin del servicio proporciona las ventajas de la programacin acoplada y orientada a mensajes mientras mantiene la facilidad y familiaridad de la experiencia de programacin de RPC. Muchos programadores se sienten ms cmodos con las interfaces de programacin de aplicaciones orientadas a mensajes, como las colas de mensajes como Microsoft MSMQ, los espacios de nombres System.Messaging en .NET Framework o el envo de XML no estructurado en solicitudes HTTP, por nombrar algunos. Introduccin a la jerarqua de los requisitos Un contrato de servicio agrupa operaciones; especifica el modelo de intercambio de mensajes, tipos de mensaje y tipos de datos que llevan esos mensajes e indica categoras de comportamiento de tiempo de ejecucin que una implementacin debe tener para admitir el contrato (por ejemplo, puede requerir que los mensajes se cifren y firmen). El contrato de servicio en s mismo no especifica precisamente cmo se cumplen estos requisitos, slo que son obligatorios. El tipo de cifrado o la manera en la que se firma un mensaje depende de la implementacin y configuracin de un servicio compatible. Observe la manera en que el contrato requiere algunas cosas de la implementacin del contrato de servicio y la configuracin del tiempo de ejecucin para agregar comportamiento. El conjunto de requisitos que se deben cumplir para exponer un servicio para usar compilaciones en el conjunto anterior de requisitos. Si un contrato realiza requisitos de la implementacin, una implementacin puede requerir todava ms de la configuracin y enlaces que permiten al servicio ejecutarse. Finalmente, la aplicacin host tambin debe admitir cualquier requisito que la configuracin de servicio y los enlaces agreguen.

MCT: Luis Dueas

Pag 24 de 135

Manual de Windows Communication Foundation


Este proceso de requisito aditivo es importante tenerlo presente mientras disea, implementa, configura y aloja una aplicacin de servicio Windows Communication Foundation (WCF). Por ejemplo, el contrato puede especificar que necesita admitir una sesin. En ese caso, deber configurar el enlace para admitir ese requisito contractual o la implementacin del servicio no funcionar. O si su servicio requiere Autenticacin integrada de Windows y se hospeda en Internet Information Services (IIS), la aplicacin web en la que el servicio reside debe tener Autenticacin integrada de Windows activada y la compatibilidad annima desactivada.

3.2.1. Diseo de Contratos de Servicios


En este tema se describe qu son los contratos de servicios, cmo se definen, qu operaciones estn disponibles (y las implicaciones para los intercambios de mensajes subyacentes), qu tipos de datos se utilizan y otras cuestiones que le ayudan a disear operaciones que satisfagan adecuadamente los requisitos de su escenario.

Crear un contrato de servicios


Los servicios son grupos de operaciones. Para crear un contrato de servicios debe modelar las operaciones y especificar su agrupacin. En las aplicaciones Windows Communication Foundation (WCF), defina las operaciones creando un mtodo y marcndolo con el atributo OperationContractAttribute. A continuacin, para crear un contrato de servicios, agrupe sus operaciones, declarndolas dentro de una interfaz marcada con el atributo ServiceContractAttribute, o bien definindolas en una clase marcada con el mismo atributo. Los mtodos que no tienen un atributo OperationContractAttribute no son operaciones de servicio y no estn expuestos para ser utilizados por los clientes de servicios WCF. Como cualquier mtodo administrado, slo pueden ser llamados por objetos dentro de su mbito de acceso declarado. De una manera similar, tambin es vlido crear una clase de contrato de servicios o interfaz que no declare operaciones de servicios el efecto es igual que una clase o interfaz sin mtodos. Cualquier servicio generado utilizando un contrato de este tipo no expone ninguna operacin para que los clientes la utilicen. Este tema describe los puntos de decisin siguientes al disear un contrato de servicios: Si deben utilizarse clases o interfaces. Cmo especificar los tipos de datos que desea intercambiar. Los tipos de modelos de intercambio que puede utilizar. Si puede hacer que los requisitos de seguridad explcitos sean parte del contrato. Las restricciones para las entradas y salidas de la operacin.

Clases o interfaces
Tanto las clases como las interfaces representan una agrupacin de funcionalidad y, por consiguiente, ambas se pueden utilizar para definir un contrato de servicios WCF. Sin embargo, se recomienda que utilice las interfaces porque modelan directamente los contratos de servicios. Sin una implementacin, las interfaces no hacen ms que definir una agrupacin de mtodos con ciertas firmas. Igualmente, un contrato de servicios sin una implementacin define una agrupacin de operaciones con ciertas firmas. Implemente una interfaz de contrato de servicio y habr implementado un servicio WCF. Todas las ventajas de las interfaces administradas se aplican a las interfaces de contrato de servicio: Las interfaces del contrato de servicio pueden extender cualquier nmero de otras interfaces del contrato de servicio. Una nica clase puede implementar cualquier nmero de contratos de servicios implementando esas interfaces del contrato de servicio. Puede modificar la implementacin de un contrato de servicios cambiando la implementacin de la interfaz, mientras el contrato de servicios sigue siendo el mismo.

MCT: Luis Dueas

Pag 25 de 135

Manual de Windows Communication Foundation


Puede controlar la versin de su servicio implementando la interfaz antigua y la nueva. Los clientes antiguos se conectan a la versin original, mientras los clientes ms nuevos pueden conectarse a la versin ms nueva. Nota: Al heredar de otras interfaces del contrato de servicio, no puede invalidar las propiedades de operacin, como el nombre o espacio de nombres. Si intenta hacerlo, crea una nueva operacin en el contrato de servicios actual. Sin embargo, puede utilizar una clase para definir un contrato de servicios e implementar dicho contrato al mismo tiempo. La ventaja de crear sus servicios aplicando directamente ServiceContractAttribute y OperationContractAttribute a la clase y los mtodos en la clase, respectivamente, es la velocidad y la simplicidad. Las desventajas son que las clases administradas no admiten la herencia mltiple, y como resultado slo pueden implementar uno contrato de servicios a la vez. Adems, cualquier modificacin de las firmas de la clase o del mtodo modifica el contrato pblico para ese servicio, lo que puede impedir que los clientes no modificados utilicen su servicio. En este punto, debera entender la diferencia entre definir su contrato de servicios utilizando una interfaz y utilizando una clase. El paso siguiente consiste en decidir qu datos se pueden intercambiar entre un servicio y sus clientes.

Parmetros y valores devueltos


Cada operacin devuelve un valor y un parmetro, incluso si estos no son ms que void. Sin embargo, a diferencia de un mtodo local, en el que puede pasar las referencias a los objetos de un objeto a otro, las operaciones del servicio no pasan las referencias a los objetos. En su lugar, pasan copias de los objetos. Esto es significativo porque cada tipo utilizado en un parmetro o valor devuelto debe ser serializable; es decir, debe ser posible convertir un objeto de ese tipo en una secuencia de bytes y de una secuencia de bytes en un objeto. Los tipos primitivos son serializables de forma predeterminada, como muchos tipos en .NET Framework. Nota: El valor de los nombres de parmetro en la firma de la operacin forma parte del contrato y distingue entre maysculas y minsculas. Contratos de datos Las aplicaciones orientadas a servicios como aplicaciones Windows Communication Foundation (WCF) estn diseadas para interoperar con el nmero ms amplio posible de aplicaciones cliente tanto en plataformas Microsoft y como en plataformas no Microsoft. Para obtener la interoperabilidad ms amplia posible, se recomienda que marque sus tipos con los atributos DataContractAttribute y DataMemberAttribute para crear un contrato de datos, que es la parte del contrato de servicios que describe los datos que intercambian sus operaciones de servicio. Los contratos de datos son contratos de estilo de participacin: ningn tipo o miembro de datos se serializa a menos que aplique explcitamente el atributo de contrato de datos. Los contratos de datos no estn relacionados con el mbito de acceso del cdigo administrado: los miembros de datos privados se pueden serializar y enviar a otra parte para obtener acceso a ellos pblicamente. WCF controla la definicin de los mensajes SOAP subyacentes que habilitan la funcionalidad de la operacin as como la serializacin de los tipos de datos dentro y fuera del cuerpo de los mensajes. Siempre y cuando los tipos de datos sean serializables, no necesita pensar en la infraestructura de intercambio de mensajes subyacentes al disear las operaciones.

MCT: Luis Dueas

Pag 26 de 135

Manual de Windows Communication Foundation


Aunque la aplicacin tpica WCF utiliza los atributos DataContractAttribute y DataMemberAttribute para crear los contratos de datos para las operaciones, puede utilizar otros mecanismos de serializacin. Los mecanismos estndares ISerializable, SerializableAttribute y IXmlSerializable trabajan para administrar la serializacin de sus tipos de datos en los mensajes SOAP subyacentes que los llevan de una aplicacin a otra. Puede emplear ms estrategias de serializacin si sus tipos de datos requieren soporte especial. Para las opciones. Es importante tener en cuenta que los nombres de CLR en la definicin de un contrato de servicio y sus operaciones son significativos y no se deben confundir. Para evitar la confusin de los tipos que se usan para definir un contrato de servicio, use los atributos ObfuscateAssemblyAttribute y ObfuscationAttribute. Asignar los parmetros y los valores devueltos a los intercambios de mensajes Las operaciones de servicio estn soportadas por un intercambio subyacente de mensajes SOAP que transfiere los datos de la aplicacin, adems de los datos requeridos por la aplicacin para soportar cierta seguridad estndar, transaccin y caractersticas relacionadas con la sesin. Dado que ste es el caso, la firma de una operacin de servicio dicta un cierto modelo de intercambio de mensajes (MEP) subyacente que puede admitir la transferencia de datos y las caractersticas que una operacin requiere. Puede especificar tres modelos en el modelo de programacin WCF: modelos de mensajes de solicitud/respuesta, unidireccionales y dplex. Solicitud/Respuesta Un modelo de solicitud/respuesta es uno en el que un remitente de la solicitud (una aplicacin cliente) recibe una respuesta con la que est relacionada la solicitud. ste es el MEP predeterminado porque soporta tanto una operacin en la que uno o ms parmetros se pasan a la operacin como una devolucin y uno o ms valores de salida que la operacin devuelve al llamador. Por ejemplo, en el ejemplo de cdigo de C# siguiente, se muestra una operacin de servicio bsica que toma una cadena y devuelve una cadena. <OperationContractAttribute()> _ Function Hello (ByVal greeting As String) As String Esta firma de operacin dicta la forma del intercambio de mensajes subyacente. Si no existiera correlacin, WCF no podra determinar a qu operacin va destinado el valor devuelto. Tenga en cuenta que a menos que especifique un modelo de mensaje subyacente diferente, incluso las operaciones de servicio que devuelven void del retorno (Nothing en Visual Basic) son intercambios de mensajes de solicitud/respuesta. El resultado para su operacin es que a menos que un cliente invoque de forma asincrnica la operacin, el cliente detiene el procesamiento hasta que se reciba el mensaje de retorno, aunque ese mensaje est normalmente vaco. En el ejemplo de cdigo de C# siguiente, se muestra una operacin que no regresa hasta que el cliente ha recibido un mensaje vaco como respuesta. <OperationContractAttribute()> _ Sub Hello (ByVal greeting As String) El ejemplo anterior puede desacelerar rendimiento del cliente y la receptividad si la operacin tarda mucho tiempo en realizarse, pero hay ventajas para las operaciones de solicitud/respuesta incluso cuando devuelven void. La ms obvia es que los errores SOAP pueden devolverse en el mensaje de respuesta, lo que indica que se ha producido alguna condicin de error relacionada con el servicio, bien en la comunicacin bien en el procesamiento. Los errores SOAP que se especifican en un contrato de servicios se pasan a la aplicacin cliente como un objeto FaultException, donde el parmetro de tipo es el tipo especificado en el contrato de servicios. Esto facilita la notificacin a los clientes de las condiciones de error en los servicios WCF. Unidireccional Si el cliente de una aplicacin de servicio WCF no debe esperar a que finalice la operacin y no procesa errores SOAP, la operacin puede especificar un modelo de mensaje unidireccional. Una operacin unidireccional es una en la que un cliente invoca una operacin y contina el procesamiento despus de que WCF escribe el mensaje en la red. Normalmente, esto significa que, salvo que los datos que se estn enviando en el mensaje saliente

MCT: Luis Dueas

Pag 27 de 135

Manual de Windows Communication Foundation


sean extremadamente grandes, el cliente sigue ejecutndose de manera prcticamente inmediata (a menos que se produzca un error al enviar los datos). Este tipo de modelo de intercambio de mensajes soporta el comportamiento como evento de un cliente a una aplicacin de servicio. Un intercambio de mensajes en el que se enva un mensaje y no se recibe ninguno no puede soportar una operacin de servicio que especifique un valor devuelto distinto de void; en este caso se inicia una excepcin InvalidOperationException. Por lo tanto, ningn mensaje de retorno significa que no puede haber ningn error SOAP devuelto para indicar cualquier error en el procesamiento o la comunicacin. (La comunicacin de informacin de error cuando las operaciones son operaciones unidireccionales requiere un modelo de intercambio de mensajes dplex.) Para especificar un intercambio de mensajes unidireccional para una operacin que devuelve void, establezca la propiedad IsOneWay en true, como en el ejemplo de cdigo de C# siguiente. <OperationContractAttribute(IsOneWay := True)> _ Sub Hello (ByVal greeting As String) Este mtodo es idntico al ejemplo de solicitud/respuesta anterior, pero estableciendo la propiedad IsOneWay en true significa que, aunque el mtodo es idntico, la operacin de servicio no enva un mensaje de retorno y los clientes devuelven inmediatamente una vez el mensaje saliente se ha entregado al nivel del canal. Dplex Un modelo dplex se caracteriza por la capacidad tanto del servicio y como del cliente para enviarse mensajes entre s independientemente de si se est utilizando una mensajera unidireccional o de solicitud/respuesta. Esta forma de comunicacin bidireccional es til para los servicios que deben comunicarse directamente con el cliente, o para proporcionar una experiencia asincrnica a cada lado de un intercambio de mensajes, incluido el comportamiento similar a un evento. El modelo dplex es ligeramente ms complejo que los modelos de solicitud/respuesta o unidireccionales debido al mecanismo adicional para comunicarse con el cliente. Para disear un contrato dplex, tambin debe disear un contrato de devolucin de llamada y asignar el tipo de ese contrato de devolucin de llamada a la propiedad CallbackContract del atributo ServiceContract Attribute que marca el contrato de servicio. Para implementar un modelo dplex, debe crear una segunda interfaz que contenga las declaraciones de mtodo a las que se llaman en el cliente. Precaucin: Cuando un servicio recibe un mensaje dplex, examina el elemento ReplyTo en ese mensaje entrante para determinar dnde enviar la respuesta. Si no se protege el canal que se utiliza para recibir el mensaje, un cliente que no es de confianza podra enviar un mensaje malintencionado con un equipo de destino ReplyTo, provocando una denegacin de servicio (DoS) de ese equipo de destino. Parmetros out y ref En la mayora de casos puede utilizar parmetros in (ByVal en Visual Basic) y out y parmetros ref (ByRef en Visual Basic). Dado que tanto el parmetro out como ref indican que los datos son devueltos por una operacin, una firma de operacin como la siguiente especifica que se requiere una operacin de solicitud/respuesta aunque la firma de la operacin devuelva void. <ServiceContractAttribute()> _ Public Interface IMyContract <OperationContractAttribute()> _ Public Sub PopulateData(ByRef data As CustomDataType) End Interface

MCT: Luis Dueas

Pag 28 de 135

Manual de Windows Communication Foundation


Las nicas excepciones son esos casos en los que su firma tiene una estructura determinada. Por ejemplo, slo puede utilizar el enlace NetMsmqBinding para comunicarse con los clientes si el mtodo usado para declarar una operacin devuelve void; no puede haber ningn valor de salida, tanto si se trata de un valor devuelto, ref, o bien un parmetro out. Adems, la utilizacin de los parmetros out o ref requiere que la operacin tenga un mensaje de respuesta subyacente para devolver el objeto modificado. Si su operacin es unidireccional, se inicia una excepcin InvalidOperationException en tiempo de ejecucin. Especificar el nivel de proteccin del mensaje en el contrato Al disear su contrato, tambin debe decidir el nivel de proteccin del mensaje de los servicios que implementa su contrato. Esto slo es necesario si la seguridad del mensaje se aplica al enlace en el extremo del contrato. Si el enlace tiene la seguridad desactivada (es decir, si el enlace proporcionado por el sistema establece System.ServiceModel.SecurityMode en el valor System.ServiceModel.SecurityMode.None) no tiene que decidir sobre el nivel de proteccin del mensaje para el contrato. En la mayora de los casos, los enlaces proporcionados por el sistema a los que se aplica la seguridad del nivel de mensaje, ofrecen un nivel de proteccin suficiente que hace innecesario el nivel de proteccin para cada operacin o mensaje. El nivel de proteccin es un valor que especifica si los mensajes (o partes del mensaje) que soportan un servicio estn firmados, firmados y cifrados, o si se envan sin firmar o cifrar. El nivel de proteccin se puede establecer en varios mbitos: en el nivel del servicio, para una operacin determinada, para un mensaje dentro de esa operacin, o una parte del mensaje. Los valores establecidos en un mbito se convierten en el valor predeterminado para los mbitos menores a menos que se invalide explcitamente. Si una configuracin de enlace no puede proporcionar el nivel de proteccin mnimo necesario para el contrato, se produce una excepcin. Y cuando ningn valor de nivel de proteccin se establece explcitamente en el contrato, la configuracin de enlace controla el nivel de proteccin para todos los mensajes si el enlace tiene seguridad de mensajes. ste es el comportamiento predeterminado. Nota: Decidir si establecer explcitamente varios mbitos de un contrato en un nivel de proteccin inferior al nivel de proteccin completo de System.Net.Security.ProtectionLevel.EncryptAndSign generalmente es una decisin que canjea cierto grado de seguridad por un aumento del rendimiento. En estos casos, las decisiones girarn en torno a las operaciones y al valor de los datos que intercambian. Por ejemplo, el ejemplo de cdigo siguiente no establece la propiedad ProtectionLevel o ProtectionLevel en el contrato. <ServiceContractAttribute()> _ Public Interface ISampleService <OperationContractAttribute()> _ Public Function GetString()As String <OperationContractAttribute()> _ Public Function GetData() As Integer End Interface Al interactuar con una implementacin ISampleService en un extremo con un WSHttpBinding predeterminado (el System.ServiceModel.SecurityModepredeterminado, que es Message), todos los mensajes se cifran y firman dado que es el nivel de proteccin predeterminado. No obstante, cuando se usa un servicio ISampleService con un BasicHttpBinding predeterminado (el SecurityMode predeterminado, que es None), todos los mensajes se envan como texto, ya que no existe seguridad para este enlace y, por lo tanto, se pasa por alto el nivel de proteccin (es decir, los mensajes ni se cifran ni se firman). Si se cambia el SecurityMode a Message, estos mensajes se cifraran y firmaran (dado que se sera el nivel de proteccin predeterminado del enlace).

MCT: Luis Dueas

Pag 29 de 135

Manual de Windows Communication Foundation


Si desea especificar explcitamente o ajustar los requisitos de proteccin para su contrato, establezca la propiedad ProtectionLevel (o cualquier de las propiedades ProtectionLevel en un mbito menor) en el nivel que requiera su contrato de servicios. En este caso, utilizando un valor explcito exige al enlace que soporte ese valor como mnimo para el mbito utilizado. Por ejemplo, el ejemplo de cdigo siguiente especifica explcitamente un valor ProtectionLevel, para la operacin GetGuid. <ServiceContract()> _ Public Interface IExplicitProtectionLevelSampleService <OperationContract()> _ Public Function GetString() As String End Function <OperationContract(ProtectionLevel := ProtectionLevel.None)> _ Public Function GetInt() As Integer End Function <OperationContractAttribute(ProtectionLevel := ProtectionLevel.EncryptAndSign)> _ Public Function GetGuid() As Integer End Function End Interface Un servicio que implementa este contrato IExplicitProtectionLevelSampleService y tiene un extremo que utiliza el WSHttpBinding predeterminado (el System.ServiceModel.SecurityModepredeterminado, que es Message) tiene el comportamiento siguiente: Los mensajes de operacin GetString se cifran y firman. Los mensajes de operacin GetInt se envan como texto sin cifrar ni firmar (es decir, texto sin formato). La operacin GetGuid System.Guid se devuelve en un mensaje que se cifra y se firma. Otros requisitos de firma de operacin Algunas caractersticas de aplicacin requieren un tipo determinado de firma de la operacin. Por ejemplo, el enlace NetMsmqBinding soporta los servicios duraderos y clientes, en los que una aplicacin se puede reiniciar en el medio de la comunicacin y se puede retomar donde se dej sin olvidarse ningn mensaje. Sin embargo, las operaciones duraderas deben tomar slo uno parmetro in y no tener ningn valor devuelto. Otro ejemplo es el uso de los tipos Stream en operaciones. Puesto que el parmetro Stream incluye el cuerpo completo del mensaje, si una entrada o una salida (es decir, parmetro ref, parmetro out o valor devuelto) es del tipo Stream, debe ser la nica entrada o salida especificada en su operacin. Adems, el parmetro o tipo devuelto debe ser Stream, System.ServiceModel.Channels.Message o System.Xml.Serialization.IXmlSeria lizable. Nombres, espacios de nombres y ofuscacin Los nombres y espacios de nombres de los tipos de .NET en la definicin de contratos y operaciones son significativos cuando los contratos se convierten en WSDL y cuando los mensajes de contrato se crean y envan. Por lo tanto, es muy recomendable que los nombres y espacios de nombres de los contratos de servicio se establezcan explcitamente mediante las propiedades Namespace y Name de todos los atributos de contrato auxiliares, como ServiceContractAttribute, OperationContractAttribute, DataContractAttribute, DataMemberAttribute y otros atributos de contrato. Una de las consecuencias es que, si no se establecen explcitamente los nombres y espacios de nombres, el uso de la ofuscacin de IL en el ensamblado modifica los nombres y espacios de nombres del tipo de contrato y, por lo tanto, los intercambios de conexin y WSDL modificados generan errores. Si no establece los nombres y espacios de nombres de contrato explcitamente pero tiene pensado utilizar la ofuscacin, use los atributos ObfuscateAssemblyAttribute y ObfuscationAttribute para evitar la modificacin de los nombres y espacios de nombres del tipo de contrato.

3.2.1.1. Creacin de un Contrato de Solicitud-Respuesta

MCT: Luis Dueas

Pag 30 de 135

Manual de Windows Communication Foundation


En este tema se muestran los pasos bsicos para crear mtodos que utilicen un contrato de solicitud-respuesta. Tales mtodos invocan operaciones en un servicio de Windows Communication Foundation (WCF) y esperan una respuesta. La respuesta se debe enviar y correlacionar con la solicitud segn las condiciones de este contrato. Incluso si el mtodo devuelve void, la infraestructura crea y enva un mensaje vaco para indicar al autor de la llamada que se ha devuelto el mtodo. La nica manera de anular la creacin y entrega de un mensaje de respuesta es utilizar un contrato unidireccional para la operacin.

Creacin de un contrato de solicitud-respuesta


1. Cree el contrato de servicios aplicando la clase ServiceContractAttribute a la interfaz que define los mtodos que el servicio va a implementar. 2. Indique qu mtodos de la interfaz puede invocar el cliente aplicndoles la clase

OperationContractAttribute. 3. El valor de la propiedad IsOneWay indica si una operacin devuelve un mensaje de respuesta. Si una operacin tiene un contrato de solicitud-respuesta, esta propiedad se establece en false. Si la operacin tiene un contrato unidireccional, la propiedad se establece en true. Todas las operaciones que llevan la clase OperationContractAttribute satisfacen de forma predeterminada un contrato de solicitud-respuesta porque la propiedad IsOneWay es false de forma predeterminada. De modo que es opcional especificar explcitamente el valor de la propiedad de atributo en false.

Ejemplo
El siguiente ejemplo define un contrato para un servicio de calculadora que proporciona mtodos Add y Subtract. Con este contrato, un cliente llama a los mtodos Add y Subtract y espera, respectivamente, que se devuelvan la suma y la diferencia. El mtodo Multiply no es parte del contrato, porque no est marcado por la clase OperationContractAttribute y, por tanto, los clientes no pueden acceder a l. using System.ServiceModel; [ServiceContract] public interface ICalculator { [OperationContract] // It would be equivalent to write explicitly: // [OperationContract(IsOneWay=false)] int Add(int a, int b); [OperationContract] int Subtract(int a, int b); int Multiply(int a, int b) } Marcar una interfaz del contrato de servicio con la clase ServiceContractAttribute y sus mtodos con la clase OperationContractAttribute permite la generacin automtica de definiciones del contrato de servicios en el lenguaje de descripcin de servicios web (WSDL), contactos del cliente, y cdigo una vez que se ha implementado el servicio. Se puede obtener acceso a una definicin visible externamente de un contrato de servicios de WCF una vez que se ha implementado el servicio como un documento WSDL estndar que especifica las operaciones y sus entradas y resultados respectivos. El WSDL se muestra anexando la solicitud ?wsdl a la direccin base HTTP y sealando al explorador en el identificador uniforme de recursos (URI) resultante.

3.2.1.2. Cmo Crear un Contrato Unidireccional


En este tema se muestran los pasos bsicos para crear mtodos que utilizan un contrato unidireccional. Tales mtodos invocan las operaciones de un servicio de Windows Communication Foundation (WCF) desde un cliente, pero no esperan una respuesta. Se puede utilizar este tipo de contrato, por ejemplo, para publicar notificaciones a muchos suscriptores. Tambin puede utilizar los contratos unidireccionales al crear un contrato dplex (bidireccional), que permita a los clientes y servidores comunicarse entre s independientemente de

MCT: Luis Dueas

Pag 31 de 135

Manual de Windows Communication Foundation


modo que cualquiera de ellos pueda iniciar una llamada al otro. Esto puede permitir, en particular, al servidor que realice llamadas unidireccionales al cliente que el cliente puede tratar como eventos.

Creacin de un contrato unidireccional


1. Cree el contrato de servicios aplicando la clase ServiceContractAttribute a la interfaz que define los mtodos que el servicio va a implementar. 2. Indique qu mtodos de la interfaz puede invocar un cliente aplicndoles la clase

OperationContractAttribute. 3. Designe operaciones que no deban tener ningn resultado (ningn valor devuelto y ningn parmetro out o ref) como unidireccionales mediante el establecimiento de la propiedad IsOneWay en true. Observe que las operaciones que llevan la clase OperationContractAttribute satisfacen de forma predeterminada un contrato de solicitud-respuesta porque la propiedad IsOneWay es false de forma predeterminada. As que debe especificar explcitamente el valor de la propiedad de atributo para que sea true si desea un contrato unidireccional para el mtodo.

3.2.1.3. Creacin de un Contrato Dplex


En este tema se muestran los pasos bsicos para crear mtodos que utilicen un contrato dplex (bidireccional). Un contrato dplex permite a los clientes y servidores comunicarse entre s independientemente de manera que cada uno puede iniciar llamadas al otro. El contrato dplex es uno de tres modelos de mensaje disponible para los servicios de Windows Communication Foundation (WCF). Los otros dos modelos de mensaje son unidireccionales y de solicitud-respuesta. Un contrato dplex consta de dos contratos unidireccionales entre el cliente y el servidor y no requiere que se pongan en correlacin las llamadas al mtodo. Utilice este tipo de contrato cuando su servicio deba consultar ms informacin en el cliente o elevar eventos explcitamente en el cliente.

Creacin de un contrato dplex


1. 2. 3. 4. Cree la interfaz que crea el lado del servidor del contrato dplex. Aplique la clase ServiceContractAttribute a la interfaz. Declare las firmas de los mtodos en la interfaz. Aplique la clase OperationContractAttribute a cada firma de mtodo que debe formar parte del contrato pblico. 5. Cree la interfaz de devolucin de llamada que define el conjunto de operaciones que el servicio puede invocar en el cliente. 6. 7. Declare las firmas de mtodos en la interfaz de devolucin de llamadas. Aplique la clase OperationContractAttribute a cada firma de mtodo que debe formar parte del contrato pblico. 8. Vincule las dos interfaces en un contrato dplex estableciendo la propiedad CallbackContract de la interfaz principal en el tipo de la interfaz de devolucin de llamadas.

Realizacin de llamadas a mtodos en el cliente


1. En la implementacin del servicio del contrato principal, declare una variable para la interfaz de devolucin de llamadas. 2. Establezca la variable en la referencia al objeto devuelta por el mtodo GetCallbackChannel de la clase OperationContext. 3. Llame a los mtodos definidos por la interfaz de devolucin de llamadas.

3.2.1.4. Especificacin de Transferencia de Datos en Contratos de Servicio

MCT: Luis Dueas

Pag 32 de 135

Manual de Windows Communication Foundation


Windows Communication Foundation (WCF) se puede ver como una infraestructura de mensajera. Las operaciones de servicio pueden recibir mensajes, procesarlos y enviarles mensajes. Los mensajes se describen mediante contratos de operaciones. Por ejemplo, considere el siguiente contrato: [ServiceContract] public interface IAirfareQuoteService { [OperationContract] float GetAirfare(string fromCity, string toCity); } Aqu, la operacin GetAirfare acepta un mensaje con informacin sobre fromCity y toCityy, a continuacin, devuelve un mensaje que contiene un nmero. En este tema se explican las varias maneras en las que un contrato de operacin puede describir los mensajes.

Descripcin de mensajes mediante parmetros


La manera ms simple de describir un mensaje consiste en utilizar una lista de parmetros y el valor devuelto. En el ejemplo anterior, los parmetros de cadena fromCity y toCity se utilizaron para describir el mensaje de solicitud y el valor devuelto flotante se utiliz para describir el mensaje de respuesta. Si el valor devuelto por s solo no es suficiente para describir un mensaje de respuesta, se pueden utilizar parmetros out. Por ejemplo, la siguiente operacin tiene fromCity y toCity en su mensaje de solicitud y un nmero junto con una moneda en su mensaje de respuesta: [OperationContract] float GetAirfare(string fromCity, string toCity, out string currency); Adems, puede utilizar parmetros de referencia para hacer que un parmetro forme parte tanto del mensaje de solicitud como del de respuesta. Los parmetros deben ser de tipos que se pueden serializar (convertidos a XML). De manera predeterminada, WCF utiliza un componente llamada la clase DataContractSerializer para realizar esta conversin. Se admite la mayora de datos primitivos (como int, string, float, y DateTime). Los tipos definidos por el usuario deben tener normalmente un contrato de datos. public interface IAirfareQuoteService { [OperationContract] float GetAirfare(Itinerary itinerary, DateTime date); } [DataContract] public class Itinerary { [DataMember] public string fromCity; [DataMember] public string toCity; } De vez en cuando, el DataContractSerializer no es adecuado para serializar sus tipos. WCF admite un motor de serializacin alternativo, XmlSerializer, que tambin puede utilizar para serializar parmetros. XmlSerializer le permite utilizar ms control sobre el XML resultante mediante atributos como el XmlAttributeAttribute. Para pasar a utilizar XmlSerializer para una operacin determinada o para el servicio completo, aplique el atributo XmlSerializerFormatAttribute a una operacin o un servicio. Por ejemplo: [ServiceContract] public interface IAirfareQuoteService { [OperationContract] [XmlSerializerFormat] float GetAirfare(Itinerary itinerary, DateTime date); } public class Itinerary { public string fromCity; public string toCity;

MCT: Luis Dueas

Pag 33 de 135

Manual de Windows Communication Foundation


[XmlAttribute] public bool isFirstClass; } Recuerde que intercambiar manualmente a XmlSerializer, tal y como se muestra aqu, no se recomienda a menos que tenga razones concretas para hacerlo tal y como se detalla en ese tema. Para aislar los nombres de parmetro .NET de los nombres de contrato, puede utilizar el atributo MessageParameterAttribute y utilizar la propiedad Name para establecer el nombre de contrato. Por ejemplo, el contrato de operacin siguiente es equivalente al primer ejemplo de este tema. [OperationContract] public float GetAirfare( [MessageParameter(Name=fromCity)] string originCity, [MessageParameter(Name=toCity)] string destinationCity);

Descripcin de mensajes vacos


Un mensaje de solicitud vaco se puede describir no teniendo ninguna entrada ni parmetro de referencia. Por ejemplo: [OperationContract] public int GetCurrentTemperature(); Un mensaje de respuesta vaco se puede describir teniendo un tipo de valor devuelto void y ningn resultado ni parmetro de referencia. Por ejemplo: [OperationContract] public void SetTemperature(int temperature); Esto es diferente de una operacin unidireccional, como: [OperationContract(IsOneWay=true)] public void SetLightbulbStatus(bool isOn); La operacin SetTemperatureStatus devuelve un mensaje vaco. Puede devolver en su lugar un error si hay un problema al procesar un mensaje de entrada. La operacin SetLightbulbStatus no devuelve nada. No hay ninguna manera de comunicar una condicin de error de esta operacin.

Descripcin de mensajes mediante el uso de contratos de mensaje


Puede desear utilizar un tipo nico para representar el mensaje completo. Aunque es posible de utilizar un contrato de datos para este propsito, la manera recomendada para ello consiste en utilizar un contrato de mensaje; esto evita niveles innecesarios de ajuste en el XML resultante. Adems, los contratos de mensaje le permiten ejercer ms control sobre los mensajes resultantes. Por ejemplo, puede decidir qu partes de informacin deberan estar en el cuerpo del mensaje y cules deberan estar en los encabezados del mensaje. En el siguiente ejemplo se muestra el uso de contratos de mensaje. [ServiceContract] public interface IAirfareQuoteService { [OperationContract] GetAirfareResponse GetAirfare(GetAirfareRequest request); } [MessageContract] public class GetAirfareRequest { [MessageHeader] public DateTime date; [MessageBodyMember] public Itinerary itinerary; } [MessageContract] public class GetAirfareResponse { [MessageBodyMember] public float airfare; [MessageBodyMember] public string currency; } [DataContract] public class Itinerary

MCT: Luis Dueas

Pag 34 de 135

Manual de Windows Communication Foundation


{ [DataMember] public string fromCity; [DataMember] public string toCity; } En el ejemplo anterior, la clase DataContractSerializer se sigue utilizando de forma predeterminada. La clase XmlSerializer tambin se puede usar con contratos de mensaje. Para ello, aplique el atributo XmlSerializerFormatAttribute a la operacin o al contrato y utilice tipos compatibles con la clase XmlSerializer en los encabezados del mensaje y miembros del cuerpo.

Descripcin de mensajes mediante el uso de secuencias


Otra manera de describir mensajes en operaciones consiste en utilizar la clase Stream o una de sus clases derivadas en un contrato de operacin o como un miembro de cuerpo del contrato de mensaje (debe ser el nico miembro en este caso). Para los mensajes entrantes, el tipo debe ser Stream; no puede utilizar clases derivadas. En lugar de invocar el serializador, WCF recupera los datos a partir de una secuencia y los coloca directamente en un mensaje saliente o recupera datos a partir de un mensaje entrante y los coloca directamente en una secuencia. En el siguiente ejemplo se muestra la forma de utilizar secuencias. [OperationContract] public Stream DownloadFile(string fileName); No puede combinar datos que no sean de secuencia y datos de Stream en un cuerpo de mensaje nico. Utilice un contrato de mensaje para colocar los datos adicionales en encabezados de mensaje. El ejemplo siguiente muestra el uso incorrecto de secuencias al definir el contrato de operacin. //Incorrect: // [OperationContract] // public void UploadFile (string fileName, Stream fileData); El ejemplo siguiente muestra el uso correcto de secuencias al definir un contrato de operacin. [OperationContract] public void UploadFile (UploadFileMessage message); //code omitted [MessageContract] public class UploadFileMessage { [MessageHeader] public string fileName; [MessageBodyMember] public Stream fileData; }

Utilizacin de la clase de mensajes


Para tener control completo de programacin sobre los mensajes enviados o recibidos, puede utilizar directamente la clase Message, tal y como se muestra en el siguiente cdigo de ejemplo. [OperationContract] public void LogMessage(Message m); ste es un escenario avanzado, que se describe en detalle en Utilizacin de la clase de mensajes.

Descripcin de mensajes de error


Adems de los mensajes que son descritos por el valor devuelto y los parmetros de referencia o salida, cualquier operacin que no sea unidireccional puede devolver al menos dos posibles mensajes: su mensaje de respuesta normal y un mensaje de error. Considere el contrato de operacin siguiente. [OperationContract] float GetAirfare(string fromCity, string toCity, DateTime date); Esta operacin puede devolver un mensaje normal que contenga un nmero float o un mensaje de error que contenga un cdigo de error y una descripcin. Puede lograr esto generando una FaultException en su implementacin del servicio.

MCT: Luis Dueas

Pag 35 de 135

Manual de Windows Communication Foundation


Puede especificar posibles mensajes de error adicionales utilizando el atributo FaultContractAttribute. Los errores adicionales se han de poder serializar mediante el DataContractSerializer, tal y como se muestra en el cdigo de ejemplo siguiente. [OperationContract] [FaultContract(typeof(ItineraryNotAvailableFault))] float GetAirfare(string fromCity, string toCity, DateTime date); //code omitted [DataContract] public class ItineraryNotAvailableFault { [DataMember] public bool IsAlternativeDateAvailable; [DataMember] public DateTime alternativeSuggestedDate; } Estos errores adicionales se pueden generar mediante la generacin de una FaultException del tipo de contrato de datos adecuado. No puede utilizar la clase XmlSerializer para describir los errores. El XmlSerializerFormatAttribute no tiene efecto en contratos de error.

Uso de tipos derivados


Puede desear utilizar un tipo base en una operacin o un contrato de mensaje y, a continuacin, utilizar un tipo derivado al invocar verdaderamente la operacin. En este caso, debe utilizar el atributo ServiceKnownTypeAttribute o algn mecanismo alternativo para permitir el uso de tipos derivados. Considere la siguiente operacin. [OperationContract] public bool IsLibraryItemAvailable(LibraryItem item); Suponga que dos tipos, Book y Magazine, derivan de LibraryItem. Para utilizar estos tipos en la operacin IsLibraryItemAvailable, puede cambiar la operacin tal y como sigue: [OperationContract] [ServiceKnownType(typeof(Book))] [ServiceKnownType(typeof(Magazine))] public bool IsLibraryItemAvailable(LibraryItem item); Alternativamente, puede utilizar el atributo KnownTypeAttribute cuando el DataContractSerializer predeterminado se est utilizando, tal y como se muestra en el cdigo de ejemplo siguiente. [OperationContract] public bool IsLibraryItemAvailable(LibraryItem item); // code omitted [DataContract] [KnownType(typeof(Book))] [KnownType(typeof(Magazine))] public class LibraryItem { //code omitted } Puede utilizar el atributo XmlIncludeAttribute al usar el XmlSerializer. Puede aplicar el atributo ServiceKnownTypeAttribute a una operacin o al servicio completo. Acepta un tipo o el nombre del mtodo para llamar para obtener una lista de tipos conocidos, como el atributo KnownTypeAttribute.

Especificacin del uso y estilo


Al describir servicios mediante el lenguaje de descripcin de servicios web (WSDL), los dos estilos utilizados comnmente son Documento y llamada a procedimiento remoto (RPC). En el estilo Documento, el cuerpo del mensaje completo se describe utilizando el esquema, y el WSDL describe las diversas partes del cuerpo del

MCT: Luis Dueas

Pag 36 de 135

Manual de Windows Communication Foundation


mensaje haciendo referencia a elementos dentro de ese esquema. En el estilo RPC, el WSDL hace referencia a un tipo de esquema para cada parte del mensaje en lugar de a un elemento. En algunos casos, tiene que seleccionar Serializer), manualmente o uno el de Style estos en estilos. el atributo Puede hacer esto aplicando el (al atributo usar el DataContractFormatAttribute y estableciendo la propiedad Style (cuando se est usando DataContract estableciendo XmlSerializerFormatAttribute XmlSerializer). Por otra parte, XmlSerializer admite dos formas de XML serializado: Literal y Encoded. Literal es la forma ms comnmente aceptada y la nica que DataContractSerializer admite. Encoded es una forma heredada descrita en la seccin 5 de la especificacin SOAP y no se recomienda para nuevos servicios. Para cambiar al modo Encoded, establezca la propiedad Use en el atributo XmlSerializerFormatAttribute en Encoded. En la mayora de los casos, no debera cambiar la configuracin predeterminada para el Style ni las propiedades Use.

Control del proceso de serializacin


Puede hacer varias cosas para personalizar la manera en la que se serializan los datos. Cambio de los ajustes de serializacin del servidor Cuando el DataContractSerializer predeterminado se est utilizando, puede controlar algunos aspectos del proceso nmero de serializacin de en el servicio aplicando el atributo ServiceBehaviorAttribute Puede utilizar al la servicio. propiedad Especficamente, puede utilizar la propiedad MaxItemsInObjectGraph para establecer la cuota que limita el mximo objetos que DataContractSerializer deserializa. IgnoreExtensionDataObject para desactivar la funcin de versin de recorridos de ida y vuelta. [ServiceContract] [ServiceBehavior(MaxItemsInObjectGraph=100000)] public interface IDataService { [OperationContract] DataPoint[] GetData(); } Comportamientos de serializacin Hay disponibles dos comportamientos en WCF, DataContractSerializerOperationBehavior y XmlSerializer OperationBehavior que se conectan automticamente en funcin de qu serializador se utilice para una operacin determinada. Dado que se aplican automticamente estos comportamientos, normalmente no tiene que estar al tanto sobre ellos. Sin embargo, DataContractSerializerOperationBehavior tiene MaxItemsInObjectGraph, Ignore

ExtensionDataObject, y las propiedades DataContractSurrogate que puede utilizar para personalizar el proceso de serializacin. Las primeras dos propiedades tienen el mismo significado que se mencion en la seccin anterior. Puede utilizar la propiedad DataContractSurrogate para habilitar suplentes del contrato de datos, que son un mecanismo eficaz para personalizar y extender el proceso de serializacin. Puede utilizar el DataContractSerializerOperationBehavior para personalizar la serializacin de cliente y servidor. El ejemplo siguiente muestra cmo aumentar la cuota MaxItemsInObjectGraph en el cliente. ChannelFactory<IDataService> factory = new ChannelFactory<IDataService>(binding, address); foreach (OperationDescription op in factory.Endpoint.Contract.Operations) { DataContractSerializerOperationBehavior dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>() as DataContractSerializerOperationBehavior; if (dataContractBehavior != null) { dataContractBehavior.MaxItemsInObjectGraph = 100000;

MCT: Luis Dueas

Pag 37 de 135

Manual de Windows Communication Foundation


} } IDataService client = factory.CreateChannel(); A continuacin, se muestra el cdigo equivalente en el servicio, en el caso de autoalojamiento. ServiceHost serviceHost = new ServiceHost(typeof(IDataService)) foreach (ServiceEndpoint ep in serviceHost.Description.Endpoints) { foreach (OperationDescription op in ep.Contract.Operations) { DataContractSerializerOperationBehavior dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>() as DataContractSerializerOperationBehavior; if (dataContractBehavior != null) { dataContractBehavior.MaxItemsInObjectGraph = 100000; } } } serviceHost.Open(); En el caso de alojamiento mediante Web, debe crear una nueva clase derivada ServiceHost y utilizar un generador de host de servicio para conectarla. Control de los ajustes de serializacin en la configuracin El MaxItemsInObjectGraph e IgnoreExtensionDataObject se pueden controlar a travs de la configuracin utilizando el extremo dataContractSerializer o comportamiento de servicio, tal y como se muestra en el ejemplo siguiente. <configuration> <system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="LargeQuotaBehavior"> <dataContractSerializer maxItemsInObjectGraph="100000" /> </behavior> </endpointBehaviors> </behaviors> <client> <endpoint address=http://example.com/myservice behaviorConfiguration="LargeQuotaBehavior" binding="basicHttpBinding" bindingConfiguration="" contract="IDataService" name="" /> </client> </system.serviceModel> </configuration> Serializacin de tipo compartido, preservacin de grfico de objeto y serializadores personalizados DataContractSerializer serializa utilizando nombres de contrato de datos y no nombres de tipo .NET. Esto es coherente con los principios de la arquitectura orientada a servicios y permite un gran grado de flexibilidad; los tipos .NET pueden cambiar sin afectar al contrato de conexin. En algn caso aislado, puede que desee serializar nombres de tipo .NET reales, introduciendo, de este modo, un acoplamiento robusto entre el cliente y el servidor, similar a la tecnologa remota de .NET Framework. ste no es un procedimiento recomendado, excepto en raros casos que normalmente tienen lugar al migrar a WCF desde comunicaciones remotas de .NET Framework. En este caso, debe utilizar la clase NetDataContractSerializer, en lugar de la clase DataContractSerializer. El DataContractSerializer serializa normalmente grficos de objetos como rboles de objeto. Es decir, si se hace referencia al mismo objeto ms de una vez, se serializa ms de una vez. Por ejemplo, considere una instancia PurchaseOrder que tiene dos campos de tipo Direccin llamados billTo y shipTo. Si ambos campos estn establecidos en la misma instancia de Direccin, hay dos instancias de Direccin idnticas despus de la

MCT: Luis Dueas

Pag 38 de 135

Manual de Windows Communication Foundation


serializacin y deserializacin. Esto se hace porque no hay ninguna manera interoperable estndar de representar grficos de objetos en XML (excepto para el estndar codificado SOAP heredado disponible en el XmlSerializer, tal y como se describe en la seccin anterior en Style y Use). Serializar grficos de objetos como rboles tiene ciertas desventajas, como, por ejemplo, que los grficos con referencias circulares no se pueden serializar. De vez en cuando, es necesario intercambiar a serializacin de grficos de objetos verdadera, incluso aunque no sea interoperable. Esto se puede realizar mediante el uso del DataContractSerializer construido mediante el parmetro preserveObjectReferences establecido en true. De vez en cuando, los serializadores integrados no son suficientes para su escenario. En la mayora de los casos, puede seguir utilizando la abstraccin XmlObjectSerializer desde la que se derivan DataContract Serializer y NetDataContractSerializer. Los tres casos anteriores (preservacin de tipo .NET, preservacin de grfico de objetos y serializacin basada en XmlObjectSerializercompletamente personalizada) requieren que se conecte un serializador personalizado. Para ello, realice los siguientes pasos: 1. 2. Escriba su propio comportamiento que deriva del DataContractSerializerOperationBehavior. Invalide los dos mtodos CreateSerializer para devolver su propio serializador

(NetDataContractSerializer, DataContractSerializer con preserveObjectReferences establecido en true o su propio XmlObjectSerializer personalizado). 3. Antes de abrir el host de servicio o crear un canal de cliente, elimine el comportamiento DataContractSerializerOperationBehavior existente y conecte la clase derivada personalizada que cree en los pasos anteriores.

3.2.1.4.1. Utilizacin de la Clase XmlSerializer


Windows Communication Foundation (WCF) puede utilizar dos tecnologas de serializacin diferentes para convertir los datos de su aplicacin en XML transmitidos entre los clientes y servicios, un proceso llamado serializacin.

DataContractSerializer como predeterminado


De forma predeterminada WCF utiliza la clase DataContractSerializer para serializar los tipos de datos. Este serializador admite los tipos siguientes: Tipos primitivos (por ejemplo, enteros, cadenas y matrices de bytes), as como algunos tipos especiales, como XmlElement y DateTime, que se tratan como primitivos. Tipos de contrato de datos (los tipos marcados con el atributo DataContractAttribute ). Los tipos marcados con el atributo SerializableAttribute, incluidos los tipos que implementan la interfaz ISerializable. Los tipos que implementan la interfaz IXmlSerializable. Muchos tipos de coleccin comunes, que incluyen muchos tipos de coleccin genricos. Muchos tipos .NET Framework se incluyen en las dos ltimas categoras y son, de este modo, serializables. Las matrices de tipos serializables tambin son serializables. DataContractSerializer, utilizado junto con los tipos de contrato de datos, es la manera recomendada de escribir nuevos servicios WCF.

Cundo utilizar la clase XmlSerializer


WCF tambin admite la clase XmlSerializer. La clase XmlSerializer es no es exclusiva de WCF. Es el mismo motor de serializacin que usan los servicios web de ASP.NET. La clase XmlSerializer admite un conjunto mucho ms estrecho de tipos que la clase DataContractSerializer, pero permite mucho ms control sobre el XML resultante y admite mucho ms de la norma del lenguaje de definicin de esquemas XML (XSD). Tampoco

MCT: Luis Dueas

Pag 39 de 135

Manual de Windows Communication Foundation


requiere ningn atributo declarativo en los tipos serializables. Para obtener ms informacin, consulte el tema de la Serializacin XML en la documentacin .NET Framework. La clase XmlSerializer no admite tipos de contrato de datos. Cuando se utiliza Svcutil.exe o la caracterstica Agregar referencia de servicio en Visual Studio para generar el cdigo de cliente para un servicio de otro fabricante o para tener acceso a un esquema de otro fabricante, se selecciona automticamente un serializador adecuado para usted. Si el esquema no es compatible con DataContractSerializer, se selecciona el XmlSerializer.

Intercambio manual a XmlSerializer


En algunas ocasiones, puede ser necesario intercambiar manualmente a XmlSerializer. Esto sucede, por ejemplo, en los casos siguientes: Al migrar una aplicacin desde los servicios Web ASP.NET a WCF, usted puede querer reutilizar los tipos compatibles existentes, XmlSerializer- en lugar de crear nuevos tipos de contrato de datos. Cuando es importante el control preciso sobre el XML que aparece en los mensajes, pero no hay disponible un documento de lenguaje de descripcin de servicios web (WSDL), por ejemplo, al crear un servicio con tipos que tienen que cumplir un cierto esquema normalizado, publicado, no compatible con DataContractSerializer. Al crear servicios que siguen la norma de Codificacin SOAP heredada. En stos y otros casos, puede intercambiar manualmente a la clase XmlSerializer aplicando el atributo XmlSerializerFormatAttribute a su servicio, tal y como se muestra en el cdigo siguiente.

Consideraciones de seguridad
Nota: Es importante tener el cuidado al intercambiar los motores de serializacin. El mismo tipo puede serializar de maneras diferentes, dependiendo del serializador que se utiliza. Si por error utiliza un serializador errneo, podra estar divulgando informacin de un tipo que no tena intencin de divulgar. Por ejemplo, la clase DataContractSerializer slo serializa los miembros marcados con el atributo DataMemberAttribute al serializar los tipos de contrato de datos. La clase XmlSerializer serializa cualquier miembro pblico. Vea el tipo del cdigo siguiente. Si el tipo se utiliza inadvertidamente en un contrato de servicios donde est seleccionada la clase XmlSerializer, se serializa el miembro creditCardNumber que probablemente no corresponde. Aunque la clase DataContractSerializer es el valor predeterminado, puede seleccionarlo explcitamente para su servicio (aunque esto no se debera exigir nunca) aplicando el atributo DataContractFormatAttribute al tipo de contrato de servicios. El serializador utilizado para el servicio es una parte integrante del contrato y no se puede cambiar seleccionando un enlace diferente o cambiando otra configuracin. Otras consideraciones de seguridad importantes se aplican a la clase XmlSerializer. En primer lugar, se recomienda encarecidamente firmar las aplicaciones WCF que utiliza la clase XmlSerializer con una clave protegida contra la divulgacin. Esta recomendacin se aplica cuando se realiza un modificador manual a XmlSerializer y cuando se lleva a cabo un modificador automtico (mediante Svcutil.exe, Agregar referencia de servicio o una herramienta similar). Esto es debido a que el motor de serializacin XmlSerializer admite la carga de ensamblados de serializacin pregenerados siempre que se firmen con la misma clave que la aplicacin. Una aplicacin sin firma est totalmente desprotegida frente a la posibilidad de que un ensamblado malintencionado que coincida con el nombre esperado del ensamblado de serializacin previamente generado

MCT: Luis Dueas

Pag 40 de 135

Manual de Windows Communication Foundation


se site en la carpeta de aplicaciones o en la cach de ensamblados global. Por supuesto, antes de nada, un atacante debe tener acceso de escritura a una de estas dos ubicaciones para intentar realizar dicha accin. Otra amenaza que existe siempre que usted utiliza XmlSerializer est relacionada con el acceso de escritura a la carpeta temporal del sistema. El motor de serializacin XmlSerializer crea y utiliza ensamblados de serializacin temporales en esta carpeta. Debera ser consciente de que cualquier proceso con acceso de escritura a la carpeta temporal puede malintecionado. sobrescribir estos ensamblados de serializacin con cdigo

Reglas para la compatibilidad de XmlSerializer


No puede aplicar directamente XmlSerializer- los atributos compatibles a los parmetros de operacin de contrato o valores devueltos. Sin embargo, se pueden aplicar a los mensajes con tipo (partes del cuerpo del contrato de mensaje), como se muestra en el cdigo siguiente. Cuando se aplica a los miembros de mensaje con tipo, estos atributos invalidan propiedades que estn en conflicto en los atributos de mensaje con tipo. Por ejemplo en el siguiente cdigo, ElementName invalida Name. No se admite el atributo MessageHeaderArrayAttribute al utilizar XmlSerializer. Nota: En este caso, XmlSerializer inicia la excepcin siguiente, que se libera antes que WCF: "El elemento declarado en el nivel superior de un esquema no puede tener maxOccurs >1. Debe proporcionar un elemento contenedor para 'ms' utilizando XmlArray o XmlArrayItem en lugar de XmlElementAttribute o utilizando el estilo de parmetro Wrapped". Si recibe esta excepcin, investigue si se aplica esta situacin. WCF no admite SoapIncludeAttribute ni atributos XmlIncludeAttribute en contratos de mensaje y contratos de operacin; utilice, en su lugar, el atributo KnownTypeAttribute.

3.2.1.4.2. Cmo Habilitar la Transmisin


Windows Communication Foundation (WCF) puede enviar mensajes mediante transferencias almacenadas en bfer o por secuencias. En el modo de transferencia almacenado en bfer (predeterminado), se debe entregar completamente un mensaje antes de que un receptor pueda leerlo. En modo de transferencia de transmisin por secuencias, el receptor puede empezar a procesar el mensaje antes de se entregue completamente. El modo de transmisin por secuencias es til cuando la informacin que se pasa es grande y puede procesarse en serie. El modo de transmisin por secuencias tambin es til cuando el mensaje es demasiado grande para que se almacene en bfer completamente. Para habilitar la transmisin por secuencias, defina apropiadamente OperationContract y habilite la transmisin por secuencias en el nivel de transporte.

Transmisin de datos por secuencias


1. Para transmitir datos por secuencias, OperationContract del servicio debe satisfacer dos requisitos: a. El parmetro que contiene los datos que se van a transmitir debe ser el nico parmetro del mtodo. Por ejemplo, si el mensaje de entrada es el que se va a transmitir por secuencia, la operacin debe tener exactamente un parmetro de entrada. De igual forma, si el mensaje de salida se va a transmitir por secuencia, la operacin debe tener exactamente un parmetro de salida o un valor devuelto. b. Al menos uno de los tipos del parmetro y el valor devuelto debera ser Stream, Message o IXmlSerializable. A continuacin se muestra un ejemplo de los datos.

MCT: Luis Dueas

Pag 41 de 135

Manual de Windows Communication Foundation


La operacin GetStream recibe algunos datos de entrada en bfer como string, que tambin se almacena en bfer y devuelve Stream, que se transmite por secuencias. A la inversa, UploadStream toma en un Stream (transmitido por secuencia) y devuelve un bool (almacenado en bfer). EchoStream toma y devuelve Stream y es un ejemplo de una operacin cuyos mensajes de entrada y salida se transmiten por secuencia. Finalmente, GetReversedStream no toma ninguna entrada y devuelve un Stream (transmitido por secuencia). 2. La transmisin por secuencias debe habilitarse en el enlace. Defina una propiedad TransferMode, que puede adoptar uno de los siguientes valores: a. b. Buffered, Streamed, que habilita la comunicacin mediante transmisin por secuencias en ambas direcciones. c. d. StreamedRequest, que slo habilita la solicitud de transmisin. StreamedResponse, que slo habilita la transmisin por secuencias de la respuesta. expone la propiedad TransferMode en el enlace, tal y como hace,

BasicHttpBinding

NetTcpBinding y NetNamedPipeBinding. La propiedad TransferMode se puede establecer tambin en el elemento de enlace del transporte y utilizarse en un enlace personalizado. Los siguientes ejemplos muestran cmo establecer TransferMode mediante cdigo y cambiando el archivo de configuracin. Ambos ejemplos tambin establecen la propiedad maxReceivedMessageSize en 64 MB, que coloca un lmite en el tamao mximo permitido de mensajes que se reciben. El maxReceivedMessageSize predeterminado es de 64 KB, que normalmente es demasiado pequeo para los escenarios de transmisin por secuencias. Establezca este valor de cuota que depende, segn corresponda, del tamao mximo de mensajes que su aplicacin espera recibir. Tambin tenga en cuenta que maxBufferSize controla el tamao mximo que se almacena en bfer y lo establece de manera apropiada. e. El siguiente fragmento de cdigo de configuracin del ejemplo muestra cmo establecer la propiedad TransferMode en la transmisin por secuencias en basicHttpBinding y un enlace HTTP personalizado. f. El siguiente fragmento de cdigo muestra cmo establecer la propiedad TransferMode para la transmisin por secuencias en basicHttpBinding y un enlace HTTP personalizado. g. El siguiente fragmento de cdigo muestra cmo establecer la propiedad TransferMode para la transmisin por secuencias en un enlace HTTP personalizado. 3. Las operaciones GetStream, UploadStream y EchoStream tratan con el envo de datos directamente desde un archivo o guardando los datos recibidos directamente en un archivo. El siguiente cdigo se aplica a GetStream.

Escritura de una secuencia personalizada


1. Para hacer un procesamiento especial en cada fragmento de una secuencia de datos mientras se enva o recibe, derive una clase de secuencia personalizada de Stream. Como un ejemplo de una secuencia personalizada, el siguiente cdigo contiene un mtodo GetReversedStream y una clase ReverseStream GetReversedStream crea y devuelve una nueva instancia de ReverseStream. El procesamiento real se produce cuando el sistema lee desde el objeto ReverseStream. El mtodo ReverseStream.Read lee un fragmento de bytes del archivo subyacente, los invierte y despus devuelve los bytes invertidos. Este mtodo no invierte el contenido del archivo completo, sino un fragmento de bytes cada vez. Este ejemplo muestra cmo puede realizar el procesamiento de la secuencia cuando el contenido se lee o escribe desde la secuencia.

MCT: Luis Dueas

Pag 42 de 135

Manual de Windows Communication Foundation

3.2.1.4.3. Cmo: Crear un Contrato de Datos Bsicos para una Clase o Estructura
En este tema se muestran los pasos bsicos para crear un contrato de datos mediante una clase o estructura.

Crear un contrato de datos bsicos para una clase o estructura


1. Declare que el tipo tiene un contrato de datos aplicando el atributo DataContractAttribute a la clase. Observe ausente. 2. Defina los miembros (propiedades, campos o eventos) que se serializan aplicando el atributo DataMemberAttribute a cada miembro. Estos miembros se denominan miembros de datos. De forma predeterminada, todos los tipos pblicos son serializables. Para obtener ms informacin, consulte , consulte Tipos serializables. Nota: Puede aplicar el atributo DataMemberAttribute a los campos privados y, de este modo, se expondrn los datos a otros. Asegrese de que el miembro no contiene informacin confidencial. que todos los tipos pblicos, incluidos aqullos sin atributos, son serializables. DataContractSerializer deduce un contrato de datos si el atributo DataContractAttribute est

3.2.1.5. Especificacin y Administracin de Errores en Contratos y Servicios


Las aplicaciones de Windows Communication Foundation (WCF) administran las situaciones de error asignando objetos de excepcin administrados a los objetos de error de SOAP y objetos de error de SOAP a objetos de excepcin administrados. Los temas de esta seccin describen cmo disear contratos para exponer condiciones de error como errores de SOAP personalizados, cmo devolver tales errores como parte de la implementacin del servicio y cmo los clientes detectan tales errores.

Informacin general sobre control de errores


En todas las aplicaciones administradas, los errores de procesamiento estn representados mediante objetos Exception. En aplicaciones basadas en SOAP, como las aplicaciones de WCF, los mtodos de servicio comunican la informacin de errores de procesamiento mediante mensajes de error de SOAP. Los errores SOAP son tipos de mensaje que se incluyen en los metadatos de una operacin de servicio y, por consiguiente, crean un contrato de error que los clientes pueden utilizar para que su operacin sea ms slida o interactiva. Adems, debido a que los errores de SOAP se expresan a los clientes en un forma de XML, es un sistema de tipo muy interoperable que pueden utilizar los clientes en cualquier plataforma de SOAP, aumentando el alcance de su aplicacin WCF. Dado que las aplicaciones de WCF se ejecutan en ambos tipos de sistemas de errores, cualquier informacin de excepcin administrada que se enve al cliente debe convertirse de excepciones a errores SOAP en el servicio, enviarse y convertirse de errores SOAP a excepciones de errores en clientes de WCF. En el caso de los clientes dplex, los contratos de cliente tambin pueden devolver errores SOAP a un servicio. En cualquier caso, puede usar los comportamientos de excepcin de servicio predeterminados o controlar explcitamente si (y cmo) se asignan las excepciones a los mensajes de error. Se pueden enviar dos tipos de errores de SOAP: declarados y no declarados. Los errores SOAP declarados son aqullos en los que una operacin tiene un atributo System.ServiceModel.FaultContractAttribute que especifica un tipo de error SOAP personalizado. No declaradolos errores SOAP no se especifican en el contrato de una operacin. Se recomienda encarecidamente que las operaciones de servicio declaren sus errores mediante el atributo FaultContractAttribute para especificar formalmente todos los errores de SOAP que un cliente puede esperar

MCT: Luis Dueas

Pag 43 de 135

Manual de Windows Communication Foundation


recibir en el curso normal de una operacin. Adems, se recomienda que slo devuelva en un error SOAP la informacin que un cliente deba conocer para minimizar la divulgacin de informacin. Normalmente, los servicios (y los clientes dplex) dan los siguientes pasos para integrar correctamente el control de errores en sus aplicaciones: Asignacin de condiciones de excepcin a errores SOAP personalizados. Los clientes y servicios envan y reciben errores SOAP como excepciones. Adems, los clientes y servicios de WCF pueden utilizar errores soap no declarados con fines de depuracin y pueden extender el comportamiento de errores predeterminado. Las secciones siguientes tratan estas tareas y conceptos.

Asignacin de excepciones a errores SOAP


El primer paso para crear una operacin que administra condiciones de error es decidir bajo qu condiciones una aplicacin de cliente debera informar sobre errores. Algunas operaciones tienen condiciones de error especficas de su funcionalidad. Por ejemplo, una operacin PurchaseOrder podra devolver la informacin concreta a los clientes a los que ya no se les permite iniciar una orden de compra. En otros casos, como un servicio Calculator, un error de SOAP MathFault ms general puede ser capaz de describir todas las condiciones de error en un servicio completo. Una vez que se identifican las condiciones de error de los clientes del servicio, se puede construir un error SOAP personalizado y la operacin se puede marcar para que devuelva ese error SOAP cuando se produzca la condicin de error correspondiente.

Los clientes y servicios administran los errores SOAP como excepciones


Identificar condiciones de error de la operacin, definir errores SOAP personalizados y marcar esas operaciones para que devuelvan esos fallos son los primeros pasos para una administracin adecuada de errores en las aplicaciones de WCF. El siguiente paso es implementar correctamente el envo y la recepcin de estos errores. Normalmente, los servicios envan errores para informar a las aplicaciones de cliente sobre las condiciones de error, pero los clientes dplex tambin pueden enviar errores SOAP a los servicios.

Errores de SOAP no declarados y depuracin


Los errores de SOAP declarados son sumamente tiles para generar aplicaciones robustas, interoperables y distribuidas. Sin embargo, en algunos casos es til para un servicio (o cliente dplex) enviar un error SOAP no declarado, uno que no se menciona en el Lenguaje de descripcin de servicios web (WSDL) para esa operacin. Por ejemplo, al desarrollar un servicio, pueden producirse situaciones inesperadas en las que es til enviar informacin de vuelta al cliente para la depuracin. Adems, puede o establecer la propiedad System.ServiceModel.ServiceBehaviorAttribute.IncludeExceptionDetailInFaults System.ServiceModel.

Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults en true para que permita a los clientes de WCF obtener informacin sobre las excepciones de operaciones de servicio internas. El envo de errores individuales y el establecimiento de las propiedades de comportamiento de depuracin se describen en Envo y recepcin de errores. Nota: Dado que las excepciones administradas pueden exponer informacin interna de la aplicacin, establecer System.ServiceModel.ServiceBehaviorAttribute.IncludeExceptionDetailInFaults o System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults en true puede permitir que los clientes WCF obtengan informacin sobre las excepciones de operaciones de servicio internas, incluida la informacin de identificacin personal u otro tipo de informacin confidencial. Por consiguiente, establecer System.ServiceModel.ServiceBehaviorAttribute. IncludeExceptionDetailInFaults o System.ServiceModel.Description.ServiceDebugBehavior. IncludeExceptionDetailInFaults en true slo se recomienda como una manera de depurar temporalmente una aplicacin de servicio. Adems, el WSDL de un mtodo que devuelve excepciones administradas no controladas de esta manera no contiene el contrato para la FaultException de tipo ExceptionDetail. Los clientes deben contar con la posibilidad de que se produzca un error SOAP desconocido

MCT: Luis Dueas

Pag 44 de 135

Manual de Windows Communication Foundation

(devuelto a los clientes WCF como objetos correctamente la informacin de depuracin.

System.ServiceModel.FaultException)

para

obtener

Personalizacin del control de errores con IErrorHandler


Si tiene requisitos especiales para personalizar el mensaje de respuesta al cliente cuando se produce una excepcin del nivel de aplicacin o para realizar algn procesamiento personalizado una vez devuelto el mensaje de respuesta, implemente la interfaz System.ServiceModel.Dispatcher.IErrorHandler.

3.2.1.5.1. Definicin y Especificacin de Errores


Los errores de SOAP transmiten informacin de condicin de error desde un servicio a un cliente y, en caso de comunicacin dplex, desde un cliente a un servicio de una manera interoperable. Este tema describe cuando y cmo definir el contenido del error personalizado y especificar qu operaciones pueden devolverlos.

Informacin general
Los errores de SOAP declarados son aqullos en los que una operacin tiene System.ServiceModel. FaultContractAttribute que especifica un tipo de error de SOAP personalizado. Los errores de SOAP no declarados son aqullos que no se especifican en el contrato para una operacin. Este tema le ayuda a identificar esas condiciones de error y crear un contrato de error para su servicio, que los clientes pueden utilizar para administrar correctamente esas condiciones de error cuando sean notificadas por errores de SOAP personalizados. Las tareas bsicas son, en orden: 1. 2. 3. Defina las condiciones que un cliente de su servicio debera saber. Defina el contenido personalizado de los errores de SOAP para esas condiciones de error. Marque sus operaciones para que los errores de SOAP especficos que inician se expongan a los clientes en WSDL. Definir Condiciones de error que los clientes deberan saber Los errores de SOAP son mensajes descritos pblicamente que llevan informacin de error para una operacin determinada. Dado que se describen junto con otros mensajes de la operacin en WSDL, los clientes saben y, por consiguiente, esperan controlar dichos errores al invocar una operacin. Sin embargo, dado que los servicios WCF se escriben en cdigo administrado, decidir qu condiciones de error en cdigo administrado se convertirn en errores y se devolvern al cliente le proporciona la oportunidad de separar las condiciones de error y errores en su servicio de la conversacin del error formal que usted tiene con un cliente. Por ejemplo, el ejemplo de cdigo siguiente muestra una operacin que toma dos enteros y devuelve otro entero. Aqu, se pueden producir varias excepciones, por lo que al disear el contrato del error, debe determinar qu condiciones de error son importantes para su cliente. En este caso, el servicio debera detectar la excepcin System.DivideByZeroException. <ServiceContract> _ Public Class CalculatorService <OperationContract]> _ Public Function Divide(ByVal a As Integer, ByVal b As Integer) _ As Integer If (b==0) Then Throw New Exception("Division by zero!") Return a/b End Function End Class En el ejemplo anterior, la operacin puede devolver un error de SOAP personalizado, especfico de dividir por cero, un error personalizado especfico a las operaciones de matemtica, pero con informacin especfica a dividir por cero, varios errores para varias situaciones de error diferentes, o ningn error de SOAP en absoluto. Definir el contenido de condiciones de error

MCT: Luis Dueas

Pag 45 de 135

Manual de Windows Communication Foundation


Una vez identificada una condicin de error como una que puede devolver un error de SOAP personalizado de forma til, el paso siguiente es definir los contenidos de ese error y garantizar que se puede serializar la estructura de contenido. El ejemplo de cdigo de la seccin anterior muestra un error especfico en una operacin Divide, pero si hay otras operaciones en el servicio Calculator, a continuacin, un error de SOAP personalizado nico puede informar el cliente de todas las condiciones de error de la calculadora, Divide incluido. El ejemplo de cdigo siguiente muestra la creacin de un error de SOAP personalizado, MathFault, que puede notificar los errores realizados utilizando todas las operaciones de matemtica, incluso Divide. Mientras que la clase puede especificar una operacin (la propiedad Operation ) y un valor que describe el problema (la propiedad ProblemType ), la clase y estas propiedades deben ser serializables para ser transferidas al cliente en un error de SOAP personalizado. Por consiguiente, System.Runtime.Serialization.DataContractAttribute y los atributos System.Runtime.Serialization.DataMemberAttribute se utilizan para hacer el tipo y sus propiedades serializables y tan interoperable como sea posible. Marcar operaciones para establecer el contrato de error Una vez definida una estructura de datos serializable que se devuelve como parte de un error de SOAP personalizado, el ltimo paso es marcar su contrato de operacin como iniciar un error de SOAP de ese tipo. Para ello, utilice el atributo System.ServiceModel.FaultContractAttribute y pase el tipo del tipo de datos personalizado que ha construido. El ejemplo de cdigo siguiente muestra cmo usar el atributo FaultContractAttribute para especificar que la operacin Divide puede devolver un error de SOAP del tipo MathFault. Otras operaciones basadas en matemticas, ahora, tambin pueden especificar que pueden devolver un MathFault. Una operacin puede especificar que devuelve ms de un error personalizado marcando esa operacin con ms de un atributo FaultContractAttribute. El paso siguiente, implementar el contrato de error en su implementacin de la operacin, se describe en el tema Envo y recepcin de errores. SOAP, WSDL y consideraciones de la interoperabilidad En algunas circunstancias, sobre todo al interoperar con otras plataformas, puede ser importante para controlar la manera en que aparece un error en un mensaje SOAP o la manera en el que se describe en los metadatos de WSDL. El atributo FaultContractAttribute tiene una propiedad Name que permite controlar el nombre del elemento de error WSDL que se genera en los metadatos para ese error. Segn la norma de SOAP, un error puede tener Action, Codey Reason. Action es controlado por la propiedad Action. La propiedad Code y la propiedad Reason son ambas propiedades de la clase System.ServiceModel. FaultException, que es la clase primaria del System.ServiceModel.FaultException genrico. Una propiedad Code incluye un miembro SubCode. Cuando se tiene acceso a los no servicios que generan los errores, existen ciertas limitaciones. WCF slo admite los errores con tipos de datos que describen el esquema y que son compatibles con los contratos de datos. Por ejemplo, tal y como se ha mencionado, WCF no admite errores que utilizan los atributos XML en sus tipos de datos o errores con ms de un elemento de nivel superior en la seccin de datos.

3.2.1.5.1.1. Cmo Declarar Errores en Contratos de Servicios


En cdigo administrado, las excepciones se inician al producirse condiciones de error. No obstante, en aplicaciones Windows Communication Foundation (WCF) los contratos de servicios especifican qu informacin de error se devuelve a los clientes mediante la declaracin de los errores de SOAP en el contrato de servicios.

MCT: Luis Dueas

Pag 46 de 135

Manual de Windows Communication Foundation


Crear un contrato de servicio que especifica un error de SOAP
1. 2. Crear un contrato de servicio que contiene al menos una operacin. Seleccione una operacin capaz de especificar una condicin de error sobre la que los clientes esperan ser informados. 3. Aplique System.ServiceModel.FaultContractAttribute a la operacin seleccionada y pase un tipo de error serializable al constructor. El ejemplo siguiente muestra cmo especificar que la operacin SampleMethod puede producir un GreetingFault. 4. Repita los pasos 2 y 3 en todas las operaciones del contrato que comunican las condiciones de error a los clientes.

Implementar una operacin para devolver un error de SOAP especificado


Cuando una operacin especifica que un error de SOAP concreto puede devolverse (como en el procedimiento anterior) para comunicar una condicin de error a la aplicacin que realiza la llamada, el siguiente paso es implementar esa especificacin. Iniciar el error de SOAP especificado en la operacin 1. Cuando se produce una condicin de error especificada en un FaultContractAttribute, inicie una nueva System.ServiceModel.FaultException en la que el error de SOAP especificado es el parmetro de tipo. El siguiente ejemplo muestra cmo iniciar el GreetingFault en SampleMethod mostrado en el procedimiento anterior y en la seccin de cdigo siguiente.

3.2.1.5.2. Envo y Recepcin de Errores


Los errores de SOAP transportan informacin de condicin de errores desde un servicio a un cliente y, en caso de comunicacin dplex, desde un cliente a un servicio de manera interoperable. Normalmente, un servicio define el contenido del error personalizado y especifica qu operaciones pueden devolverlos. Este tema discute cmo un servicio o cliente dplex puede enviar esos errores cuando la condicin de error correspondiente se ha producido y cmo una aplicacin de cliente o servicio administra estos errores.

Envo de errores SOAP


Los errores de SOAP declarados son aquellos en los que una operacin tiene System.ServiceModel. FaultContractAttribute que especifica un tipo de error de SOAP personalizado. Los errores de SOAP no declarados son aquellos que no se especifican en el contrato para una operacin. Envo de errores declarados Para enviar un error de SOAP declarado, detecte la condicin de error para la que el error de SOAP es adecuado y genere una nueva System.ServiceModel.FaultException, donde el parmetro de tipo es un nuevo objeto del tipo especificado en FaultContractAttribute para esa operacin. El ejemplo de cdigo siguiente muestra el uso de FaultContractAttribute para especificar que la operacin SampleMethod puede devolver un error de SOAP con el tipo de detalle de GreetingFault. Para transportar la informacin de error GreetingFault al cliente, detecte la condicin de error adecuada y genere una nueva System.ServiceModel.FaultException de tipo GreetingFault con un nuevo objeto GreetingFault como el argumento, como en el ejemplo de cdigo siguiente. Si el cliente es una aplicacin cliente de WCF, experimenta esto como una excepcin administrada donde el tipo es System.ServiceModel.FaultException de tipo GreetingFault. Envo de errores no declarados Enviar errores no declarados puede ser muy til para diagnosticar y depurar rpidamente los problemas en las aplicaciones de WCF, pero su utilidad como herramienta de depuracin es limitada. Ms generalmente, se recomienda al depurar que utilice la propiedad System.ServiceModel.Description.ServiceDebugBehavior.

MCT: Luis Dueas

Pag 47 de 135

Manual de Windows Communication Foundation


IncludeExceptionDetailInFaults. Al establecer este valor en true, los clientes experimentan tales errores como excepciones FaultException de tipo ExceptionDetail. Nota: Dado que las excepciones administradas pueden exponer informacin interna de la aplicacin, establecer System.ServiceModel.ServiceBehaviorAttribute.IncludeExceptionDetailInFaults o System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults en true puede permitir que los clientes WCF obtengan informacin sobre las excepciones de operaciones de servicio internas, incluida la informacin de identificacin personal u otro tipo de informacin confidencial. Por consiguiente, establecer System.ServiceModel.ServiceBehaviorAttribute.IncludeException DetailInFaults o System.ServiceModel.Description.ServiceDebugBehavior.IncludeException DetailInFaults en true slo est recomendado como una manera de depurar temporalmente una aplicacin de servicio. Adems, el WSDL para un mtodo que devuelve excepciones administradas no controladas de esta manera no contiene el contrato para la FaultException de tipo ExceptionDetail. Los clientes deben esperar la posibilidad de se produzca un error de SOAP desconocido (se devuelve a los clientes WCF como objetos System.ServiceModel.FaultException) para obtener correctamente la informacin de depuracin. Para enviar un error de SOAP no declarado, genere un objeto de System.ServiceModel.FaultException (esto es, no del tipo genrico FaultException) y pase la cadena al constructor. Esto se expone a las aplicaciones cliente de WCF como una excepcin System.ServiceModel.FaultException generada donde la cadena est disponible llamando al mtodo System.ServiceModel.FaultException.ToString. Nota: Si declara un error de SOAP de tipo cadena y, a continuacin, lo genera en su servicio como una FaultException donde el tipo del parmetro es una System.String, el valor de la cadena est asignado a la propiedad System.ServiceModel.FaultException.Detail, y no est disponible desde System.ServiceModel. FaultException.ToString.

Control de errores
En clientes WCF, los errores de SOAP que se producen durante la comunicacin que son de inters para las aplicaciones cliente se elevan como excepciones administradas. Aunque hay muchas excepciones que pueden producirse durante la ejecucin de cualquier programa, las aplicaciones que usan el modelo de programacin de cliente de WCF pueden esperar administrar excepciones de uno de los dos tipos siguientes como resultado de la comunicacin. TimeoutException CommunicationException Los objetos TimeoutException se producen cuando una operacin supera el perodo de tiempo de espera especificado. Los objetos CommunicationException se producen cuando hay alguna condicin de error de comunicacin recuperable en el servicio o el cliente. La clase CommunicationException tiene dos tipos derivados importantes: FaultException y el tipo FaultException genrico Las excepciones FaultException se producen cuando un agente de escucha recibe un error que no se espera o especifica en el contrato de operacin; normalmente esto sucede cuando se depura la aplicacin y el servicio tiene la propiedad System.ServiceModel.Description.ServiceDebugBehavior.IncludeException DetailInFaults establecida en true. Las excepciones FaultException se producen en el cliente cuando se recibe un error de SOAP especificado en el contrato de la operacin en respuesta a una operacin bidireccional (es decir, un mtodo con un atributo OperationContractAttribute con IsOneWay establecido en false).

MCT: Luis Dueas

Pag 48 de 135

Manual de Windows Communication Foundation

Nota: Cuando un servicio de WCF tiene la propiedad System.ServiceModel.ServiceBehaviorAttribute. IncludeExceptionDetailInFaults o System.ServiceModel.Description.ServiceDebugBehavior. IncludeExceptionDetailInFaults establecida en true, el cliente experimenta esto como una FaultException no declarada de tipo ExceptionDetail. Los clientes pueden detectar este error concreto o administrar el error en un bloque de deteccin de FaultException. Normalmente, slo las excepciones FaultException, TimeoutException y CommunicationException son de inters para los clientes y servicios. Nota: Por supuesto, se producen otras excepciones. Entre las excepciones no esperadas se incluyen errores catastrficos como System.OutOfMemoryException; normalmente las aplicaciones no deberan detectar ese tipo de mtodos. Detectar excepciones de errores en el orden correcto Puesto que FaultException deriva de FaultException, y FaultException deriva de CommunicationException, es importante detectar estas excepciones en el orden apropiado. Por ejemplo, si tiene un bloque de intento/deteccin en el que primero detecta CommunicationException, todos los errores SOAP especificados y no especificados se administran ah; los bloques de deteccin posteriores para administrar una excepcin FaultException personalizada nunca se invocan. Recuerde que una operacin puede devolver un nmero indefinido de errores especificados. Cada error es de un tipo nico y se ha de administrar separadamente. Administre las excepciones al cerrar el canal La mayor parte de la discusin anterior tiene que ver con los errores enviados en el curso del procesamiento de mensajes de aplicaciones, es decir, mensajes enviados explcitamente por el cliente cuando la aplicacin de cliente llama a las operaciones en el objeto de cliente de WCF. Incluso con la disposicin de objetos locales, el objeto puede elevar o enmascara excepciones que tienen lugar durante el proceso de reciclaje. Algo similar puede producirse al utilizar objetos de cliente de WCF. Al llamar a operaciones, est enviando mensajes a travs de una conexin establecida. Cerrar el canal puede producir excepciones si la conexin no se puede cerrar limpiamente o ya est cerrada, aun cuando todas las operaciones hayan devuelto correctamente. Normalmente, los canales de objeto de cliente se cierran de una de las siguientes maneras: Cuando se recicla el objeto de cliente de WCF. Cuando la aplicacin de cliente llama System.ServiceModel.ClientBase.Close. Cuando la aplicacin de cliente llama System.ServiceModel.ICommunicationObject.Close. Cuando la aplicacin de cliente llama a una operacin que es una operacin de finalizacin para una sesin. En todos los casos, cerrar el canal indica al canal que comience a cerrar todos los canales subyacentes que puedan estar enviando mensajes para admitir una funcionalidad compleja en el nivel de la aplicacin. Por ejemplo, cuando un contrato requiere sesiones, un enlace intenta establecer una sesin mediante el intercambio de mensajes con el canal del servicio hasta que se establezca una sesin. Cuando se cierre el canal, el canal de la sesin subyacente notifica al servicio que la sesin se ha terminado. En este caso, si el canal ya se ha anulado, cerrado o es inutilizable (por ejemplo, cuando se desconecta un cable de red), el canal de cliente no puede informar al canal del servicio que se finaliza la sesin y es posible que se produzca una excepcin.

MCT: Luis Dueas

Pag 49 de 135

Manual de Windows Communication Foundation


Anule el canal si fuese necesario Dado que cerrar el canal tambin puede producir excepciones, se recomienda que adems de detectar las excepciones de error en el orden correcto, es importante anular el canal que se utiliz para realizar la llamada en el bloque de deteccin. Si el error transporta informacin de error especfica de una operacin y sigue siendo posible que otros puedan utilizarla, no hay ninguna necesidad de anular el canal (aunque estos casos son aislados). En el resto de casos, se recomienda que anule el canal. El siguiente ejemplo de cdigo muestra cmo administrar las excepciones de errores de SOAP en una aplicacin de cliente bsica, incluyendo un error declarado y uno no declarado. Nota: Este cdigo de ejemplo no utiliza la construccin using. Dado que el cierre de canales puede producir excepciones, se recomienda que las aplicaciones creen primero un cliente de WCF, y, a continuacin, abran, utilicen y cierren el cliente de WCF en el mismo bloque de intento.

3.2.1.6. Uso de Sesiones


En las aplicaciones de Windows Communication Foundation (WCF), una sesin correlaciona un grupo de mensajes en una conversacin. Las sesiones de WCF son diferentes del objeto de sesin disponible en las aplicaciones de ASP.NET, admiten comportamientos diferentes y se controlan de diferente manera. En este tema se describen las caractersticas que habilitan las sesiones en las aplicaciones de WCF y cmo utilizarlas.

Sesiones en aplicaciones de Windows Communication Foundation


Cuando un contrato de servicios especifica que requiere una sesin, ese contrato est especificando que todas las llamadas (es decir, los intercambios de mensajes subyacentes que admiten las llamadas) deben formar parte de la misma conversacin. Si un contrato especifica que admite sesiones pero no requiere una, los clientes pueden conectarse y establecer o no una sesin. Si la sesin finaliza y se enva un mensaje se enva a travs del mismo canal, se produce una excepcin. Las sesiones de WCF tienen las siguientes caractersticas conceptuales principales: La aplicacin que realiza la llamada inicia y finaliza explcitamente las sesiones. Los mensajes entregados durante una sesin se procesan en el orden en el que se recibieron. Las sesiones correlacionan un grupo de mensajes en una conversacin. El significado de esa correlacin es una abstraccin. Por ejemplo, un canal basado en sesin puede correlacionar mensajes basados en una conexin de red compartida, mientras que otro canal basado en sesin puede correlacionar mensajes basados en una etiqueta compartida en el cuerpo del mensaje. Las caractersticas que se pueden derivar a partir de la sesin dependen de la naturaleza de la correlacin. No hay ningn almacn de datos general asociado a una sesin de WCF. Si est familiarizado con la clase System.Web.SessionState.HttpSessionState en aplicaciones ASP.NET y la funcionalidad que proporciona, podra observar las siguientes diferencias entre ese tipo de sesin y las sesiones de WCF: Las sesiones ASP.NET siempre son iniciadas por servidor. Las sesiones ASP.NET estn implcitamente desordenadas. Las sesiones ASP.NET proporcionan un mecanismo del almacenamiento de datos general para todas las solicitudes. Este tema describe: El comportamiento de ejecucin predeterminado al utilizar enlaces basados en sesin en el nivel de modelo de servicio.

MCT: Luis Dueas

Pag 50 de 135

Manual de Windows Communication Foundation


Los tipos de caractersticas que ofrecen los enlaces WCF basados en sesin proporcionados por el sistema. Cmo crear un contrato que declare un requisito de sesin. Cmo entender y controlar la creacin y finalizacin de la sesin y la relacin de la sesin con la instancia del servicio.

Comportamiento de ejecucin predeterminado mediante sesiones


Un enlace que intenta iniciar una sesin se denomina enlace basado en sesin. Los contratos de servicio especifican que requieren, permiten o rechazan enlaces basados en sesin estableciendo la propiedad System.ServiceModel.ServiceContractAttribute.SessionMode en la interfaz (o clase) del contrato de servicio en uno de los valores de enumeracin del System.ServiceModel.SessionMode. De forma predeterminada, el valor de esta propiedad es Allowed, que quiere decir que si un cliente utiliza un enlace basado en sesin con una implementacin de servicio de WCF, el servicio establece y utiliza la sesin proporcionada. Cuando un servicio WCF acepta una sesin de cliente, se habilitan las caractersticas siguientes de forma predeterminada: 1. El mismo objeto de servicio definido por el usuario administra todas las llamadas entre un objeto de cliente de WCF. 2. Adems de este comportamiento de creacin de instancias, diferentes enlaces basados en sesin proporcionan caractersticas adicionales.

Tipos de sesin proporcionados por el sistema


Un enlace basado en sesin admite la asociacin predeterminada de un objeto de servicio con una sesin determinada. Sin embargo, diferentes enlaces basados en sesin admiten diferentes caractersticas adems de habilitar el control de creacin de instancias basadas en sesin descrito anteriormente. WCF proporciona los siguientes tipos de comportamiento de aplicaciones basados en sesin: El System.ServiceModel.Channels.SecurityBindingElement admite sesiones basadas en seguridad, en las que ambos extremos de la comunicacin han acordado una conversacin segura concreta. Por ejemplo, el enlace System.ServiceModel.WSHttpBinding, que admite sesiones de seguridad y sesiones confiables, slo utiliza de forma predeterminada una sesin segura que cifra y firma digitalmente los mensajes. El enlace System.ServiceModel.NetTcpBinding admite las sesiones basadas en TCP/IP para asegurarse de que todos los mensajes estn correlacionados por la conexin en el nivel de socket. El elemento System.ServiceModel.Channels.ReliableSessionBindingElement, que implementa la

especificacin de WS-ReliableMessaging, proporciona la compatibilidad para las sesiones confiables en las que los mensajes se pueden configurar para que se entreguen en orden y slo una vez, posibilitando el establecimiento de relaciones de confianza incluso cuando los mensajes viajen por varios nodos durante la conversacin. El enlace System.ServiceModel.NetMsmqBinding proporciona sesiones de datagrama de MSMQ. Establecer la propiedad SessionMode no especifica el tipo de sesin que el contrato requiere, slo que requiere uno.

Creacin de un contrato que requiere una sesin


La creacin de un contrato que requiere una sesin hace que el grupo de operaciones que declara el contrato de servicios deba ejecutarse dentro de la misma sesin y que los mensajes deban entregarse en orden. Para validar el nivel de compatibilidad de la sesin que requiere un contrato de servicios, establezca la propiedad System.ServiceModel.ServiceContractAttribute.SessionMode de su clase o interfaz de contrato de servicios en el valor de la enumeracin System.ServiceModel.SessionMode para especificar si el contrato: Requiere una sesin.

MCT: Luis Dueas

Pag 51 de 135

Manual de Windows Communication Foundation


Permite a un cliente establecer una sesin. Prohbe una sesin. Establecer la propiedad SessionMode no especifica, sin embargo, el tipo de comportamiento basado en sesin que requiere el contrato. Indica a WCF que confirme en tiempo de ejecucin si el enlace configurado (que crea el canal de comunicacin) para el servicio establece, no establece o puede establecer una sesin al implementar un servicio. De nuevo, el enlace puede satisfacer ese requisito con cualquier tipo de comportamiento basado en sesin que elija: seguridad, transporte, confiable o alguna combinacin. El comportamiento exacto depende del valor de System.ServiceModel.SessionMode seleccionado. Si el enlace configurado del servicio no cumple con el valor de SessionMode, se produce una excepcin. Los enlaces, y los canales que esos enlaces crean, que admiten sesiones se dice que son basados en sesin. El siguiente contrato de servicios especifica que todas las operaciones de la ICalculatorSession se deben intercambiar dentro de una sesin. Ninguna de las operaciones devuelve un valor al llamador, salvo el mtodo Equals. Sin embargo, el mtodo Equals no toma ningn parmetro y, por consiguiente, slo puede devolver un valor distinto de cero dentro de una sesin en la que los datos ya se han pasado a otras operaciones. Este contrato requiere que una sesin funcione correctamente. Si no hay una sesin asociada a un cliente concreto, la instancia del servicio no tiene forma de saber qu datos anteriores ha enviado este cliente. Si un servicio permite una sesin, se establece una sesin y se utiliza si el cliente inicia una; de lo contrario, no se establece ninguna sesin.

Sesiones e instancias de servicios


Si utiliza el comportamiento de creacin de instancias predeterminado en WCF, la misma instancia de servicio administra todas las llamadas entre un objeto de cliente de WCF. Por consiguiente, en el nivel de aplicacin, puede considerar una sesin como la habilitacin de un comportamiento de aplicacin similar al comportamiento de la llamada local. Por ejemplo, al crear un objeto local: Se llama a un constructor. La misma instancia de objeto procesa todas las llamadas subsiguientes realizadas a la referencia de objeto de cliente de WCF. Se llama a un destructor cuando se destruye la referencia del objeto. Las sesiones habilitan un comportamiento similar entre clientes y servicios, siempre que se utilice el comportamiento de instancia de servicio predeterminado. Si un contrato de servicios requiere o admite sesiones, se pueden marcar una o ms operaciones del contrato como que inician o finalizan una sesin estableciendo las propiedades IsInitiating y IsTerminating. Las operaciones de inicio son aquellas que deben llamarse como la primera operacin de una nueva sesin. Las operaciones que no son de inicio slo pueden llamarse despus de que se haya llamado, al menos, a una operacin de inicio. Puede crear, por consiguiente, un tipo de constructor de sesin para su servicio mediante la declaracin de operaciones de inicio diseadas para tomar entradas de clientes apropiadas para el inicio de la instancia de servicio. (Sin embargo, el estado se asocia a la sesin, y no el objeto de servicio). Las operaciones de finalizacin, por el contrario, son aquellas a las que se debe llamar como el ltimo mensaje de una sesin existente. En el caso predeterminado, WCF recicla el objeto de servicio y su contexto despus de que se cierre la sesin a la que se asoci el servicio. Por consiguiente, puede crear un tipo de destructor declarando operaciones de finalizacin diseadas para realizar una funcin adecuada al final de la instancia de servicio. Nota: Aunque el comportamiento predeterminado se parece algo a los constructores y destructores locales, slo

MCT: Luis Dueas

Pag 52 de 135

Manual de Windows Communication Foundation

es eso, un parecido. Cualquier operacin de servicio de WCF puede ser una operacin de inicio o finalizacin, o ambas al mismo tiempo. Adems, en el caso predeterminado, las operaciones de inicio pueden llamarse cualquier nmero de veces en cualquier orden despus de que se llame a la primera; no se crean sesiones adicionales una vez que la sesin se establece y asocia a una instancia, a menos que especifique explcitamente que la duracin de la instancia del servicio (representada en tiempo de ejecucin mediante un objeto System.ServiceModel.InstanceContext). Finalmente, el estado se asocia a la sesin y no al objeto de servicio. Por ejemplo, el contrato de ICalculatorSession utilizado en el ejemplo anterior requiere que el objeto de cliente de WCF llame primero a la operacin Clear antes que a cualquier otra operacin y que la sesin con este objeto de cliente de WCF debera finalizar cuando llame a la operacin Equals. El ejemplo de cdigo siguiente muestra un contrato que exige estos requisitos. Se debe llamar primero a Clear para iniciar una sesin, y esa sesin finalizar cuando se llame Equals. Los servicios no inician sesiones con clientes. En aplicaciones cliente de WCF, existe una relacin directa entre la duracin del canal basado en sesin y la duracin de la propia sesin. Como tal, los clientes crean nuevas sesiones creando nuevos canales basados en sesin y acaban con las sesiones existentes cerrando correctamente los canales basados en sesin. Un cliente inicia una sesin con un extremo de servicio llamando a uno de los siguientes mtodos: System.ServiceModel.ICommunicationObject.Open en el canal devuelto por una llamada a System.ServiceModel.ChannelFactory.CreateChannel. System.ServiceModel.ClientBase.Open en el objeto de cliente de WCF generado por la ServiceModel Metadata Utility Tool (Svcutil.exe). Una operacin de inicio en cualquier tipo de objeto de cliente de WCF (de forma predeterminada, todas las operaciones son de inicio). Cuando se llama a la primera operacin, el objeto de cliente de WCF abre automticamente el canal e inicia una sesin. Por lo general, un cliente finaliza una sesin con un extremo de servicio llamando a uno de los siguientes mtodos: System.ServiceModel.ICommunicationObject.Close en el canal devuelto por una llamada a System.ServiceModel.ChannelFactory.CreateChannel. System.ServiceModel.ClientBase.Close en el objeto de cliente de WCF generado por Svcutil.exe. Una operacin de finalizacin en cualquier tipo de objeto de cliente de WCF (de forma predeterminada, ninguna operacin es de finalizacin; el contrato debe especificar explcitamente una operacin de finalizacin). Cuando se llama a la primera operacin, el objeto de cliente de WCF abre automticamente el canal e inicia una sesin.

Las sesiones interactan con la configuracin de InstanceContext


Hay una interaccin entre la enumeracin de SessionMode en un contrato y la propiedad System. ServiceModel.ServiceBehaviorAttribute.InstanceContextMode, que controla la asociacin entre canales y objetos de servicio concretos. Uso compartido de objetos InstanceContext Tambin puede controlar qu canal basado en sesin o llamada se asocia a qu objeto InstanceContext realizando esa asociacin usted mismo.

Sesiones y transmisin por secuencias


Cuando tiene una gran cantidad de datos para transferir, el modo de transferencia de secuencias en WCF es una alternativa factible al comportamiento predeterminado de almacenar en bfer y procesar los mensajes en memoria en su totalidad. Puede obtener un comportamiento inesperado al transmitir mediante secuencias las llamadas con un enlace basado en sesin. Todas las llamadas de transferencias por secuencias se realizan a travs de un canal nico (el canal del datagrama) que no admite sesiones aun cuando el enlace utilizado est

MCT: Luis Dueas

Pag 53 de 135

Manual de Windows Communication Foundation


configurado para utilizar sesiones. Si varios clientes realizan llamadas de transferencias por secuencias al mismo objeto de servicio sobre un enlace basado en sesin y el modo de simultaneidad del objeto de servicio se ha establecido como Single y su modo de contexto de instancia est establecido en PerSession, todas las llamadas deben pasar por el canal de datagrama y, por lo tanto, slo se procesa una llamada al mismo tiempo. Uno o ms clientes pueden superar el tiempo de espera. Puede solucionar este problema estableciendo InstanceContextMode del objeto de servicio en PerCall o la simultaneidad en mltiple. Nota: MaxConcurrentSessions no influye en este caso porque slo hay una "sesin" disponible.

3.2.1.6.1. Cmo Crear un Servicio que Requiere Sesiones


Las sesiones crean un estado compartido entre dos o ms extremos que habilita funciones tiles como las devoluciones de llamada, la seguridad de salto mltiple y asociaciones entre clientes e instancias de servicio.

Especificar que un contrato requiere su enlace para admitir sesiones


1. 2. Crear un contrato de servicio que contenga al menos una operacin. Modifique el System.ServiceModel.ServiceContractAttribute que declara el contrato estableciendo la propiedad System.ServiceModel.ServiceContractAttribute.SessionMode en: System.ServiceModel.SessionMode.Required si este contrato se debe ejecutar dentro de una sesin. System.ServiceModel.SessionMode.Allowed si este contrato puede ejecutarse dentro de una sesin. System.ServiceModel.SessionMode.NotAllowed si este contrato no se debe ejecutar dentro de una sesin. 3. Configure su extremo de servicio para que use un enlace que admita sesiones.

3.2.1.7. Operaciones Sincrnicas y Asincrnicas


Describe implementaciones asincrnicas locales e invocaciones, as como el uso sincrnico de intercambios de mensajes asincrnicos. Muchas aplicaciones llaman de forma asincrnica a los mtodos porque permite que la aplicacin siga realizando trabajo til mientras se ejecuta la llamada al mtodo. Los servicios y clientes Windows Communication Foundation (WCF) pueden participar en llamadas de operacin asincrnicas en dos niveles distintos de la aplicacin, que proporcionan a las aplicaciones WCF an ms flexibilidad para maximizar el rendimiento buscando el equilibrio con la interactividad.

Tipos de operaciones asincrnicas


Todos los contratos de servicio en WCF, sin tener en cuenta los tipos de parmetros y valores de retorno, usan atributos WCF para especificar un determinado modelo de intercambio de mensajes entre el cliente y el servicio. WCF enruta automticamente mensajes de entrada y salida a la operacin de servicio adecuada o al cdigo de cliente ejecutor. El cliente posee slo el contrato de servicio, que especifica el modelo de intercambio de mensajes para una operacin determinada. Los clientes pueden ofrecer cualquier modelo de programacin que elijan al programador, siempre y cuando se observe el modelo de intercambio de mensajes subyacente. As, tambin, los servicios pueden implementar operaciones de cualquier manera, siempre que se observe el modelo del mensaje especificado.

MCT: Luis Dueas

Pag 54 de 135

Manual de Windows Communication Foundation


La independencia del contrato de servicio del servicio o de la implementacin del cliente habilita los formularios siguientes de ejecucin asincrnica en aplicaciones WCF: Los clientes pueden invocar operaciones de solicitud/respuesta asincrnicamente mediante un intercambio de mensajes sincrnico. Los servicios pueden implementar una operacin de solicitud/respuesta asincrnicamente mediante un intercambio de mensajes sincrnico. Los intercambios de mensajes pueden ser unidireccionales, sin tener en cuenta la implementacin del cliente o servicio. Escenarios asincrnicos sugeridos Use un enfoque asincrnico en una implementacin de operacin de servicio si la implementacin del servicio de la operacin realiza una llamada en bloque, como al realizar operaciones de E/S. En una implementacin de operacin asincrnica, intente llamar a mtodos y operaciones asincrnicos para extender la ruta de acceso de la llamada asincrnica al mximo. Por ejemplo, llame a una BeginOperationTwo() desde BeginOperationOne(). Use un enfoque asincrnico en una aplicacin de cliente o que realiza la llamada en los casos siguientes: Si invoca operaciones desde una aplicacin de nivel intermedio. Si invoca operaciones desde una pgina ASP.NET, use pginas asincrnicas. Si invoca operaciones desde cualquier aplicacin de proceso simple, como Windows Forms o Windows Presentation Foundation (WPF). Si utiliza el modelo de llamada asincrnica basado en evento, el evento resultante se produce en el proceso de interfaz de usuario, agregando capacidad de respuesta a la aplicacin sin que sea necesario controlar procesos mltiples. En general, si puede elegir entre una llamada sincrnica y una asincrnica, elija la asincrnica. Llamadas asincrnicas del cliente Una aplicacin de cliente WCF puede utilizar uno o dos modelos de llamada asincrnica, ambos descritos en Asynchronous Programming Design Patterns: Operaciones asincrnicas que utilizan eventos. Operaciones asincrnicas que utilizan objetos System.IAsyncResult. El primer enfoque, el modelo asincrnico basado en eventos, se recomienda para llamar a aplicaciones, ya que slo requiere agregar un controlador de eventos para recibir una notificacin de la respuesta, y el evento resultante que se genera automticamente en el proceso de la interfaz de usuario. Para aplicar este enfoque, especifique las opciones de comando /async y /tcv:Version35 con la ServiceModel Metadata Utility Tool (Svcutil.exe), como en el ejemplo siguiente. svcutil http://localhost:8000/servicemodelsamples/service/mex /async /tcv:Version35 Una vez hecho esto, Svcutil.exe genera una clase de cliente WCF con la infraestructura de cliente que permite a la aplicacin de llamada implementar y asignar un controlador de eventos para recibir la respuesta y realizar la accin apropiada. El modelo asincrnico basado en eventos, sin embargo, slo est disponible en .NET Framework versin 3.5. Adems, no est permitido ni en .NET Framework 3,5 cuando se crea un canal de cliente WCF mediante System.ServiceModel.ChannelFactory. Con objetos de canal de cliente WCF, debe utilizar objetos System.IAsyncResult para invocar sus operaciones asincrnicamente. Para aplicar este enfoque, especifique la opcin de comando /async con la ServiceModel Metadata Utility Tool (Svcutil.exe), como en el ejemplo siguiente. svcutil http://localhost:8000/servicemodelsamples/service/mex /async Esto genera un contrato de servicio en el cual cada operacin se modela como un mtodo <Begin> con la propiedad AsyncPattern establecida en true y un mtodo <End> correspondiente. En cualquier caso, las aplicaciones pueden invocar una operacin asincrnicamente aun cuando se implementa el servicio sincrnicamente, del mismo modo que una aplicacin puede usar el mismo modelo para invocar de

MCT: Luis Dueas

Pag 55 de 135

Manual de Windows Communication Foundation


forma asincrnica un mtodo sincrnico local. Cmo se implementa la operacin no es significativo para el cliente; cuando llega el mensaje de respuesta, su contenido se enva al mtodo <End> de extremo asincrnico del cliente y el cliente recupera la informacin. Implementaciones de operacin asincrnica Igualmente, una operacin de servicio se puede implementar asincrnicamente mediante el modelo de programacin asincrnico .NET Framework y marcando el mtodo <Begin> con la propiedad AsyncPattern establecida en true. En este caso, la operacin asincrnica se expone en metadatos de la misma manera que una operacin sncrona: se expone como una operacin nica con un mensaje de solicitud y un mensaje de respuesta correlativo. Los modelos de programacin de cliente tienen entonces una opcin. Pueden representar este modelo como una operacin sncrona o como una asincrnica, siempre que se origine un intercambio de mensajes solicitud-respuesta cuando se invoque el servicio. Para definir una operacin de contrato X que se ejecuta asincrnicamente sin tener en cuenta cmo se llama en la aplicacin cliente: Defina dos mtodos mediante el modelo BeginOperation y EndOperation. El mtodo BeginOperation incluye parmetros in y out para la operacin y devuelve un tipo IAsyncResult. El mtodo EndOperation incluye un parmetro IAsyncResult as como los parmetros out y in y devuelve el tipo de valor devuelto de las operaciones. Por ejemplo, vea el mtodo siguiente. Function DoWork(ByVal data As String, ByRef inout As String, _ out outonly As out) As Integer Para crear una operacin asincrnica, los dos mtodos seran: <OperationContract(AsyncPattern := True)> _ Function BeginDoWork(ByVal data As String, ByRef inout As String, _ ByVal callback As AsyncCallback, ByVal state As Object) As IAsyncResult Function EndDoWork(ByRef inout As String, ByRef outonly As String, ByVal result As IAsyncResult) As Integer Nota: El atributo OperationContractAttribute se aplica solamente a los mtodos de BeginDoWork. El contrato resultante tiene una operacin WSDL denominada DoWork. Modelos de intercambio de mensajes unidireccional Tambin puede crear un modelo de intercambio de mensajes asincrnico en el que las operaciones unidireccionales (las operaciones para las que System.ServiceModel.OperationContractAttribute.IsOneWay es true no tienen ninguna respuesta puesta en correlacin) se pueden enviar en cualquier direccin por el cliente o por el servicio, independientemente del otro lado. (Esto utiliza el modelo de intercambio de mensajes dplex con mensajes unidireccionales.) En este caso, el contrato de servicio especifica un intercambio de mensajes unidireccional que cada parte puede implementar como llamadas asincrnicas o implementaciones, o no, segn corresponda. Por lo general, cuando el contrato es un intercambio de mensajes unidireccionales, las implementaciones pueden ser muchas veces sincrnicas porque una vez se enva un mensaje, la aplicacin no espera a una respuesta y puede continuar haciendo otro trabajo. Clientes asincrnicos y contratos de mensajes basados en eventos Las directrices de diseo del modelo asincrnico basado en eventos afirman que si se devuelve ms de un valor, uno de los valores se devuelve como propiedad Result y los dems se devuelven como propiedades del objeto EventArgs. De esto resulta que si un cliente importa metadatos mediante opciones de comando asincrnicas basadas en eventos y la operacin devuelve ms de un valor, el objeto EventArgs predeterminado devuelve un valor como propiedad Result y el resto son propiedades del objeto EventArgs.

MCT: Luis Dueas

Pag 56 de 135

Manual de Windows Communication Foundation


Si desea recibir el objeto del mensaje como propiedad Result y que los valores devueltos sean propiedades de ese objeto, use la opcin de comando /messageContract. Esto genera una firma que devuelve el mensaje de respuesta como la propiedad Result del objeto EventArgs. Todos los valores de devolucin internos se convierten, pues, en propiedades del objeto de mensaje de respuesta.

3.2.1.7.1. Cmo: Implementar una Operacin de Servicios Asincrnica


En aplicaciones de Windows Communication Foundation (WCF), se puede implementar una operacin de servicio de forma asincrnica o sincrnica sin dictar al cliente cmo llamarla. Por ejemplo, las operaciones de servicio asincrnicas pueden realizar llamadas sincrnicamente y a las operaciones de servicio sincrnicas se las puede llamar de manera asincrnica.

Implementacin de una operacin de servicio de manera asincrnica


1. En su contrato de servicio, declare un par de mtodos asincrnicos segn las directrices de diseo asincrnico de .NET. El mtodo Begin toma un parmetro, un objeto de devolucin de llamada y un objeto de estado, y devuelve un System.IAsyncResult y un mtodo End correspondiente que toma System.IAsyncResult y devuelven el valor devuelto. 2. Marque el mtodo Begin del par de mtodos asincrnicos con el atributo System.ServiceModel. OperationContractAttribute y establezca la propiedad System.ServiceModel.OperationContract Attribute.AsyncPattern en true. Por ejemplo, el cdigo siguiente realiza los pasos 1 y 2. 3. Implemente el par de mtodo Begin/End en su clase de servicio segn las instrucciones de diseo asincrnicas. Por ejemplo, el siguiente ejemplo de cdigo muestra una implementacin en la que una cadena se escribe en la consola en porciones Begin y End de la operacin de servicio asincrnica y el valor devuelto de la operacin End se devuelve al cliente.

3.2.1.8. Servicios de Confianza


Las colas y las sesiones de confianza son las caractersticas de Windows Communication Foundation (WCF) que implementan la mensajera de confianza. En este tema se explican las caractersticas de mensajera confiable de WCF. La mensajera de confianza se define como la manera en que un origen de mensajera de confianza (denominado origen) transfiere mensajes de manera fiable a un destino de mensajera de confianza (denominado destino). La mensajera de confianza realiza las funciones siguientes: Transfiere garantas para los mensajes enviados desde un origen a un destino sin tener en cuenta la transferencia de los mensajes o los errores de transporte. Separa el origen del destino. Este hecho proporciona un error independiente y la recuperacin del origen y el destino, adems de la transferencia confiable y la entrega de los mensajes aun cuando no est disponible el origen o el destino. La mensajera de confianza viene aparejada con frecuencia al coste de la latencia alta. La latencia es el tiempo que tarda un mensaje en alcanzar el destino desde el origen. Por consiguiente, WCF proporciona los tipos siguientes de mensajera de confianza: Sesiones de confianza, que proporciona la transferencia de confianza sin el coste de una latencia alta. Colas en Windows Communication Foundation, que proporciona transferencias de confianza y la separacin entre el origen y el destino.

Sesiones de confianza
Las sesiones de confianza proporcionan transferencia confiable de un extremo a otro de mensajes entre un origen y un destino mediante el protocolo de mensajera de confianza WS, sin tener en cuenta el nmero o tipo de intermediarios que separan los extremos de la mensajera (origen y destino). Esto incluye a cualquier intermediario de transporte que no utiliza SOAP (por ejemplo, los servidores proxy HTTP) o los intermediarios

MCT: Luis Dueas

Pag 57 de 135

Manual de Windows Communication Foundation


que utilizan SOAP (por ejemplo, los enrutadores basados en SOAP o los puentes) que son necesarios para que los mensajes fluyan entre los extremos. Las sesiones confiables utilizan una ventana de transferencia en memoria para enmascarar errores de nivel de mensaje de SOAP y restablecer las conexiones en el caso de errores de transporte. Las sesiones de confianza proporcionan transferencias de mensajes de confianza de latencia baja. Las proporcionan para los mensajes SOAP sobre cualquier proxy o intermediarios, el equivalente a qu TCP proporciona paquetes sobre los puentes de IP. Colas Las colas en WCF proporcionan ambas transferencias de confianza de mensajes y la separacin entre los orgenes y destinos a costa de la alta latencia. La comunicacin en cola de WCF se crea encima de Message Queue Server (MSMQ). MSMQ se distribuye como un componente opcional con Windows. El servicio de MSMQ se ejecuta como un servicio de Windows. Captura mensajes para la transmisin en una cola de transmisin en nombre del origen y lo entrega a una cola de destino. La cola de destino acepta los mensajes en nombre del destino para la entrega posterior siempre que el destino solicite mensajes. Los administradores de MSMQ implementan un protocolo de transferencias de mensajes de confianza de manera que los mensajes no se pierdan durante la transmisin. El protocolo puede ser nativo o un protocolo basado en SOAP denominado "Protocolo de mensajera de confianza de SOAP" (SRMP). La separacin, acoplada con las transferencias de mensaje de confianza entre las colas, permite que las aplicaciones que estn acopladas se comuniquen de forma fiable. A diferencia de las sesiones de confianza, el origen y el destino no tienen que estar ejecutndose a la vez. Esto habilita escenarios de forma implcita all donde se usan las colas como un mecanismo de nivelacin de carga cuando la tasa de origen de la produccin de mensajes y la tasa de destino de consumo de mensajes no coinciden.

3.2.1.9. Servicios y Transacciones


Las aplicaciones Windows Communication Foundation (WCF) pueden iniciar una transaccin desde dentro de un cliente y coordinar la transaccin dentro de la operacin del servicio. Los clientes pueden iniciar una transaccin e invocacin varias operaciones del servicio y garantizar que las operaciones del servicio se confirmen o reviertan como una unidad nica. Puede habilitar el comportamiento y de la transaccin su en el contrato de servicios y las especificando propiedades

ServiceBehaviorAttribute

estableciendo

TransactionIsolationLevel

TransactionScopeRequired para las operaciones del servicio que requieren las transacciones del cliente. El parmetro TransactionAutoComplete especifica si la transaccin en la que el mtodo se ejecuta se completa automticamente si no se produce ninguna excepcin no controlada. El trabajo que se realiza en las operaciones del servicio y que es administrado por un administrador de recursos, como registrar las actualizaciones de base de datos, forma parte de la transaccin del cliente. El ejemplo siguiente muestra el uso de los atributos ServiceBehaviorAttribute y OperationBehaviorAttribute para controlar el comportamiento de la transaccin del lado del servicio. [ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)] public class CalculatorService: ICalculatorLog { [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] public double Add(double n1, double n2) {

MCT: Luis Dueas

Pag 58 de 135

Manual de Windows Communication Foundation


recordToLog(String.Format("Added {0} to {1}", n1, n2)); return n1 + n2; } [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] public double Subtract(double n1, double n2) { recordToLog(String.Format("Subtracted {0} from {1}", n1, n2)); return n1 - n2; } [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] public double Multiply(double n1, double n2) { recordToLog(String.Format("Multiplied {0} by {1}", n1, n2)); return n1 * n2; } [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] public double Divide(double n1, double n2) { recordToLog(String.Format("Divided {0} by {1}", n1, n2)); return n1 / n2; } } Puede habilitar transacciones y el flujo de la transaccin configurando el cliente y los enlaces de servicio para utilizar el protocolo WS-AtomicTransaction y estableciendo el elemento <transactionFlow> en true, como se muestra en la configuracin del ejemplo siguiente. <client> <endpoint address="net.tcp://localhost/ServiceModelSamples/service" binding="netTcpBinding" bindingConfiguration="netTcpBindingWSAT" contract="Microsoft.ServiceModel.Samples.ICalculatorLog" /> </client> <bindings> <netTcpBinding> <binding name="netTcpBindingWSAT" transactionFlow="true" transactionProtocol="WSAtomicTransactionOctober2004" /> </netTcpBinding> </bindings> Los clientes pueden comenzar una transaccin creando TransactionScope e invocando las operaciones del servicio dentro del mbito de la transaccin. using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) { //Do work here ts.Complete(); }

3.2.2. Implementacin de Contratos de Servicio


Un servicio es una clase que expone la funcionalidad disponible a los clientes en uno o ms extremos. Para crear un servicio, escriba una clase que implemente un contrato Windows Communication Foundation (WCF). Hay dos maneras de hacerlo. Puede definir el contrato separadamente como una interfaz y, a continuacin, crear una clase que implemente esa interfaz. Tambin puede crear la clase y el contrato directamente colocando el atributo ServiceContractAttribute en la misma clase y el atributo OperationContractAttribute en los mtodos disponibles para los clientes del servicio.

Crear una clase de servicio

MCT: Luis Dueas

Pag 59 de 135

Manual de Windows Communication Foundation


A continuacin, se muestra un ejemplo de un servicio que implementa un contrato IMath que se ha definido separadamente. // Define the IMath contract. [ServiceContract] public interface IMath { [OperationContract] double Add(double A, double B); [OperationContract] double Multiply (double A, double B); } // Implement the IMath contract in the MathService class. public class MathService : IMath { public double Add (double A, double B) { return A + B; } public double Multiply (double A, double B) { return A * B; } } De forma alternativa, un servicio puede exponer un contrato directamente. A continuacin, se muestra un ejemplo de una clase de servicio que define e implementa un contrato MathService. // Define the MathService contract directly on the service class. [ServiceContract] class MathService { [OperationContract] public double Add(double A, double B) { return A + B; } [OperationContract] private double Multiply (double A, double B) { return A * B; } } Tenga en cuenta que los servicios anteriores exponen contratos diferentes porque los nombres del contrato son diferentes. En el primer caso, el contrato expuesto se denomina "IMath" mientras que, en el segundo caso, el contrato se denomina" MathService". Puede establecer algunas cosas en el servicio y niveles de implementacin de operacin, como simultaneidad y creacin de instancias. Despus de implementar un contrato de servicios, debe crear uno o ms extremos para el servicio.

3.2.2.1. Cmo: Crear un Contrato de WCF con una Clase


La manera preferida de crear un contrato Windows Communication Foundation (WCF) es utilizar una interfaz. Una alternativa, descrita aqu, es crear una clase y despus aplicar directamente la clase ServiceContractAttribute a la clase directamente y la clase OperationContractAttribute a cada uno de los mtodos de la clase que forman parte del contrato.

Creacin de un contrato de Windows Communication Foundation con una clase


1. Cree una nueva clase mediante Visual Basic, C# o cualquier otro lenguaje de Common Language Runtime. 2. 3. 4. Aplique la clase ServiceContractAttribute a la clase. Cree los mtodos en la clase. Aplique la clase OperationContractAttribute a cada mtodo que debe exponerse como parte del contrato pblico de WCF.

3.2.2.2. Procedimiento para Crear un Servicio con una Interfaz de Contrato


La manera preferida de crear un contrato de Windows Communication Foundation (WCF) es utilizar una interfaz. Este contrato especifica la coleccin y estructura de mensajes requeridas para obtener acceso a las

MCT: Luis Dueas

Pag 60 de 135

Manual de Windows Communication Foundation


operaciones que el servicio proporciona. Esta interfaz define los tipos de entrada y salida aplicando la clase ServiceContractAttribute a la interfaz y la clase OperationContractAttribute a los mtodos que desee exponer.

Creacin de un contrato WCF con una interfaz


1. Cree una nueva interfaz mediante Visual Basic, C# o cualquier otro lenguaje de Common Language Runtime. 2. 3. 4. Aplique la clase ServiceContractAttribute a la interfaz. Defina los mtodos en la interfaz. Aplique la clase OperationContractAttribute a cada mtodo que debe exponerse como parte del contrato pblico de WCF.

3.2.2.3. Especificacin del Comportamiento en Tiempo Ejecucin del Servicio


Una vez que ha diseado un contrato de servicios (Diseo de contratos de servicios) y ha implementado su contrato de servicios (Implementacin de contratos de servicio) puede configurar el comportamiento de la operacin del tiempo de ejecucin del servicio. En este tema se tratan los comportamientos de operaciones y el servicio proporcionado por el sistema y describe dnde encontrar ms informacin para crear nuevos comportamientos. Aunque algunos comportamientos se aplican como atributos, muchos se aplican utilizando un archivo de configuracin de la aplicacin o mediante programacin.

Informacin general
El contrato define las entradas, las salidas, los tipos de datos y las funciones de un servicio de ese tipo. Al implementar un contrato de servicios, se crea una clase que, cuando se configura con un enlace en una direccin, cumple el contrato que implementa. El cliente conoce la informacin contractual, de enlace y direccin; sin esa informacin, el cliente no puede utilizar el servicio. Sin embargo, las caractersticas de la operacin, como los problemas de los subprocesos o la administracin de instancias, son opacas para los clientes. Cuando haya implementado su contrato de servicios, puede configurar un gran nmero de caractersticas de operaciones utilizando los comportamientos. Los comportamientos son objetos que modifican el tiempo de ejecucin de Windows Communication Foundation (WCF) estableciendo una propiedad en tiempo de ejecucin o insertando un tipo de personalizacin en el tiempo de ejecucin. Los atributos System.ServiceModel.ServiceBehaviorAttribute y System.ServiceModel.OperationBehaviorAttribute son los comportamientos ms tiles y exponen las funciones de operaciones ms solicitadas. Puesto que son atributos, se han de aplicar a la implementacin de la operacin o el servicio. Otros comportamientos, como System.ServiceModel.Description.ServiceMetadataBehavior utilizarlos mediante programacin. Este tema ofrece informacin general sobre los atributos ServiceBehaviorAttribute y OperationBehavior Attribute, describe los diversos mbitos en los que pueden funcionar los comportamientos y proporciona una descripcin rpida de muchos de los comportamientos proporcionados por el sistema en los diversos mbitos que pueden ser de inters para los programadores de WCF. o System.ServiceModel.Description.ServiceDebug Behavior, se aplican, normalmente, mediante un archivo de configuracin de la aplicacin, aunque puede

ServiceBehaviorAttribute y OperationBehaviorAttribute
Los comportamientos ms importantes son los atributos ServiceBehaviorAttribute y OperationBehavior Attribute, que puede utilizar para controlar: La duracin de las instancias La compatibilidad con respecto a la concurrencia y la sincronizacin Comportamiento de configuracin

MCT: Luis Dueas

Pag 61 de 135

Manual de Windows Communication Foundation


Comportamiento de transaccin Comportamiento de serializacin Transformacin de metadatos Duracin de sesin Filtrado de direcciones y procesamiento de encabezados Suplantacin Para utilizar estos atributos, marque el servicio o implementacin de la operacin con el atributo adecuado a ese mbito y establezca las propiedades. Muchas de las propiedades requieren una compatibilidad adicional del enlace. Por ejemplo, una operacin que requiere una transaccin del cliente se debe configurar para que utilice un enlace que admita transacciones de flujo. Servicios conocidos singleton Puede utilizar los atributos ServiceBehaviorAttribute y OperationBehaviorAttribute para controlar ciertas duraciones, de InstanceContext y de los objetos de servicio que implementan las operaciones. Por ejemplo, la propiedad System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode controla con qu frecuencia se libera el InstanceContext, y y las propiedades System.ServiceModel. OperationBehaviorAttribute.ReleaseInstanceMode System.ServiceModel.ServiceBehaviorAttribute.Release

ServiceInstanceOnTransactionComplete controlan cuando se libera el objeto de servicios. Sin embargo, tambin puede crear un objeto de servicio y crear el host de servicio mediante ese objeto. Para hacerlo, debe establecer tambin la propiedad System.ServiceModel.ServiceBehaviorAttribute. InstanceContextMode en Single o se producir una excepcin al abrir el host del servicio. Utilice el constructor System.ServiceModel.ServiceHost.#ctor(System.Object,System.Uri[]) para crear este tipo de servicio. Ofrece una alternativa para implementar un System.ServiceModel.Dispatcher.IInstanceContext Initializer personalizado cuando desee proporcionar una instancia de objeto concreta para su uso con el servicio de singleton. Puede utilizar esta sobrecarga cuando su tipo de implementacin de servicio sea difcil de construir (por ejemplo, si no implementa un constructor pblico predeterminado que no tiene parmetros). Tenga en cuenta que cuando se proporciona un objeto a este constructor, algunas caractersticas relacionadas con el comportamiento de creacin de instancias de Windows Communication Foundation (WCF) funcionan de manera diferente. Por ejemplo, llamar a System.ServiceModel.InstanceContext.ReleaseServiceInstance, no tiene ningn efecto cuando se proporciona una instancia de objeto conocida. De igual forma, se omite cualquier otro mecanismo de lanzamiento de instancia. La clase ServiceHost siempre se comporta como si la propiedad System.ServiceModel.OperationBehaviorAttribute.ReleaseInstanceMode System.ServiceModel.ReleaseInstanceMode.None para todas las operaciones. se hubiese establecido en

Otros comportamientos de servicio, extremo, contrato y operacin


Los comportamientos de servicios, como el atributo ServiceBehaviorAttribute, funcionan en a lo largo de todo un servicio. Por ejemplo, si establece la propiedad System.ServiceModel.ServiceBehaviorAttribute. ConcurrencyMode en System.ServiceModel.ConcurrencyMode. Multiple debe administrar usted mismo los problemas de sincronizacin de subprocesos dentro de cada operacin de ese servicio. Los comportamientos de extremos funcionan a lo largo de un extremo; muchos de los comportamientos de extremo proporcionados por el sistema se han creado para ofrecer funcionalidad de cliente. Los comportamientos de contratos funcionan en el nivel del contrato y los comportamientos de operaciones modifican la entrega de la operacin.

MCT: Luis Dueas

Pag 62 de 135

Manual de Windows Communication Foundation


Muchos de estos comportamientos se implementan en atributos y usted los utiliza como lo hara con los atributos ServiceBehaviorAttribute y OperationBehaviorAttribute; aplicndolos a la clase de servicio o implementacin de operaciones adecuada. Otros comportamientos, como los objetos ServiceMetadata Behavior o ServiceDebugBehavior, se aplican, normalmente, mediante un archivo de configuracin de la aplicacin, aunque pueden usarse mediante programacin. Por ejemplo, la publicacin de metadatos se configura utilizando el objeto ServiceMetadataBehavior. El siguiente archivo de configuracin de la aplicacin muestra el uso ms comn. Las secciones siguientes describen muchos de los comportamientos proporcionados por el sistema ms tiles que puede utilizar para modificar la entrega en tiempo de ejecucin de su servicio o cliente. Vea el tema de referencia para determinar cmo utilizar cada uno. Comportamientos de servicio Los siguientes comportamientos funcionan en servicios. AspNetCompatibilityRequirementsAttribute. Aplicado a un servicio de WCF para indicar si ese servicio puede ejecutarse mediante cdigo de compatibilidad de ASP.NET. ServiceAuthorizationBehavior. Controla cmo autoriza el servicio las notificaciones de cliente. ServiceCredentials. Configura una credencial de servicio. Utilice esta clase para especificar la credencial del servicio, como un certificado X.509. ServiceDebugBehavior. Habilita las caractersticas de depuracin y de informacin de Ayuda para un servicio de WCF. ServiceMetadataBehavior. Controla la publicacin de metadatos de servicio e informacin asociada. ServiceSecurityAuditBehavior. Especifica el comportamiento de la auditora de eventos de seguridad. ServiceThrottlingBehavior. Configura los valores de rendimiento en tiempo de ejecucin que le permiten ajustar el rendimiento del servicio. Comportamientos del extremo Los siguientes comportamientos funcionan en extremos. Muchos de estos comportamientos se utilizan en aplicaciones de cliente. CallbackBehaviorAttribute. Configura una implementacin de servicio de devolucin de llamada en una aplicacin cliente dplex. CallbackDebugBehavior. Habilita la depuracin de servicio para un objeto de devolucin de llamada WCF. ClientCredentials. Permite al usuario configurar las credenciales de cliente y servicio, as como los valores de autenticacin de credenciales de servicio para su uso en el cliente. ClientViaBehavior. Utilizado por clientes para especificar el Identificador uniforme de recursos (URI) para el que se debera crear el canal de transporte. MustUnderstandBehavior. Indica a WCF que deshabilite el procesamiento de MustUnderstand. SynchronousReceiveBehavior. Indica al tiempo de ejecucin que utilice un proceso de recepcin sincrnico para los canales. TransactedBatchingBehavior. Optimiza las operaciones de recepcin para los transportes que admiten recepciones transaccionales. Comportamientos de contrato DeliveryRequirementsAttribute. Especifica los requisitos de caractersticas que los enlaces deben proporcionar al servicio o implementacin del cliente. Comportamientos de la operacin

MCT: Luis Dueas

Pag 63 de 135

Manual de Windows Communication Foundation


Los siguientes comportamientos de operacin especifican los controles de serializacin y transaccin de las operaciones. DataContractSerializerOperationBehavior. Representa el comportamiento en tiempo de ejecucin del System.Runtime.Serialization.DataContractSerializer. XmlSerializerOperationBehavior. Controla comportamiento en tiempo de ejecucin del XmlSerializer y lo asocia a una operacin. TransactionFlowAttribute. Especifica el nivel en el que una operacin de servicio acepta un encabezado de transaccin.

3.2.2.3.1. Cmo Controlar la Creacin de Instancias de Servicio


Establecer el modo de instancia de un servicio le permite especificar cundo se crea (y su objeto de servicio asociado definido por el usuario) System.ServiceModel.InstanceContext. Consulte la enumeracin Instance ContextMode de modos existentes.

Para controlar la duracin de instancia de servicio mediante el cdigo


1. 2. Aplique ServiceBehaviorAttribute a la clase de servicio. Establezca la propiedad InstanceContextMode a uno de los siguientes valores: PerCall, PerSession, o Single.

3.3. Configuracin de Servicios


Cuando haya diseado e implementado su contrato de servicios, usted est listo para configurar su servicio. En este momento define y personaliza cmo se expone su servicio a los clientes, adems de especificar la direccin donde se puede encontrar, el transporte y codificacin de mensajes que utiliza para enviar y recibir mensajes y el tipo de seguridad que requiere. La configuracin tal y como se utiliza aqu incluye todas las maneras, imperativamente en cdigo o utilizando un archivo de configuracin, en el que puede definir y personalizar los diferentes aspectos de un servicio, como especificar sus direcciones de extremo, los transportes utilizados y sus esquemas de seguridad. En la prctica, escribir la configuracin es una parte importante de la programacin de aplicaciones WCF.

3.3.1. Configuracin de Servicios mediante Archivos de Configuracin


Configurar un servicio de Windows Communication Foundation (WCF) con un archivo de configuracin le da la flexibilidad de proporcionar datos de extremo y comportamiento del servicio en el punto de implementacin en lugar de hacerlo en la fase de diseo. En este tema se describen las principales tcnicas disponibles. Se puede configurar un servicio de WCF mediante la tecnologa de configuracin .NET Framework. Por lo general, los elementos XML se agregan al archivo Web.config para un sitio de Internet Information Services (IIS) que hospeda un servicio WCF. Los elementos le permiten cambiar detalles como las direcciones de extremos (las direcciones reales utilizadas para comunicarse con el servicio) equipo a equipo. Adems, WCF incluye varios elementos proporcionados por el sistema que le permiten seleccionar rpidamente las caractersticas ms bsicas de un servicio. En la prctica, escribir la configuracin es una parte principal de la programacin de aplicaciones de WCF.

System.Configuration: Web.config y App.config


WCF utiliza el sistema de configuracin System.Configuration de .NET Framework. Al configurar un servicio en Visual Studio, utilice un archivo Web.config o un archivo App.config para especificar los valores. El entorno de hospedaje determina la eleccin realizada del nombre del archivo de configuracin para el servicio. Si est utilizando IIS para hospedar su servicio, utilice un archivo Web.config. Si est utilizando cualquier otro entorno de hospedaje, utilice un archivo App.config.

MCT: Luis Dueas

Pag 64 de 135

Manual de Windows Communication Foundation


En Visual Studio, el archivo denominado App.config se utiliza para crear el archivo de configuracin final. El nombre final realmente utilizado para la configuracin depende del nombre de ensamblado. Por ejemplo, un ensamblado denominado "Cohowinery.exe" tiene un nombre final de archivo de configuracin de "Cohowinery.exe.config". Sin embargo, slo necesita modificar el archivo App.config. Los cambios realizados en ese archivo se realizan automticamente en tiempo de compilacin en el archivo final de configuracin de la aplicacin. Al utilizar un archivo App.config, el sistema de configuracin combina el archivo App.config con el contenido del archivo Machine.config cuando se inicia la aplicacin y se aplica la configuracin. Este mecanismo permite definir los valores de equipo en el archivo Machine.config. El archivo App.config se puede utilizar para invalidar los valores del archivo Machine.config; tambin puede bloquear los valores en el archivo Machine.config para que se utilicen. En el caso de Web.config, el sistema de configuracin combina los archivos Web.config en todos los directorios ascendiendo hasta el directorio de la aplicacin de la configuracin que se aplica.

Secciones principales del archivo de configuracin


Las secciones principales del archivo de configuracin incluyen los elementos siguientes. <system.ServiceModel> <services> <service> <endpoint/> </service> </services> <bindings> <!-- Specify one or more of the system-provided binding elements, for example, <basicHttpBinding> --> <!-- Alternatively, <customBinding> elements. --> <binding> <!-- For example, a <BasicHttpBinding> element. --> </binding> </bindings> <behaviors> <!-- One or more of the system-provided or custom behavior elements. --> <behavior> <!-- For example, a <throttling> element. --> </behavior> </behaviors> </system.ServiceModel> Nota: Las secciones de enlaces y comportamientos son opcionales y slo se incluyen si son necesarias. El elemento <services> El elemento services contiene las especificaciones para todos los servicios que la aplicacin hospeda. El elemento <service> Cada elemento service tiene estos atributos: name. Especifica el tipo que proporciona una implementacin de un contrato de servicios. ste es un nombre completo (espacio de nombres y nombre de tipo). behaviorConfiguration. Especifica el nombre de uno de los elementos behavior encontrados en el elemento behaviors. El comportamiento especificado rige las acciones como si el servicio permitiese la suplantacin. <service> element reference El elemento <endpoint>

MCT: Luis Dueas

Pag 65 de 135

Manual de Windows Communication Foundation


Cada extremo requiere una direccin, un enlace y un contrato, que estn representados por los atributos siguientes: address. Especifica el Identificador uniforme de recursos (URI) del servicio, que puede ser una direccin absoluta o una relativa a la direccin base del servicio. Si est establecido en una cadena vaca, indica que el extremo est disponible en la direccin base que se especifica al crear ServiceHost para el servicio. binding. Normalmente especifica un enlace proporcionado por el sistema como WsHttpBinding, pero tambin puede especificar un enlace definido por el usuario. El enlace especificado determina el tipo de transporte, seguridad y codificacin utilizados y si se admiten o habilitan sesiones confiables, transacciones, o la transmisin por secuencias. bindingConfiguration. Si se deben modificar los valores predeterminados de un enlace, esto se puede hacer configurando el elemento de binding adecuado en el elemento bindings. Este atributo debera recibir el mismo valor que el atributo name del elemento de binding que se utiliza para cambiar los valores predeterminados. contract. Especifica la interfaz que define el contrato. sta es la interfaz implementada en el tipo de Common Language Runtime (CLR) especificado por el atributo name del elemento service. <endpoint> element reference El elemento <bindings> El elemento bindings contiene las especificaciones para todos los enlaces que puede utilizar cualquier extremo definido en cualquier servicio. El elemento <binding> Los elementos binding contenidos en el elemento bindings pueden ser uno de los enlaces proporcionados por el sistema o un enlace personalizado. El elemento binding tiene un atributo name que pone en correlacin el enlace con el extremo especificado en el atributo bindingConfiguration del elemento endpoint. El elemento <behaviors> ste es un elemento contenedor para los elementos behavior que definen los comportamientos de un servicio. El elemento <behavior> Cada elemento behavior es identificado por un atributo name y proporciona o un comportamiento proporcionado por el sistema, como <throttling> o un comportamiento personalizado.

Uso de las configuraciones de comportamientos y enlaces


WCF hace fcil compartir las configuraciones entre extremos utilizando un sistema de referencia en la configuracin. En lugar de asignar directamente los valores de configuracin a un extremo, los valores de configuracin relacionados con el enlace se agrupan en elementos bindingConfiguration de la seccin <binding>. Una configuracin de enlace es un grupo con nombre de valores en un enlace. Entonces, los extremos pueden hacer referencia a bindingConfiguration por nombre. <?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <bindings> <basicHttpBinding> <binding name="myBindingConfiguration1" closeTimeout="00:01:00" /> <binding name="myBindingConfiguration2" closeTimeout="00:02:00" /> </basicHttpBinding> </bindings> <services> <service name="myServiceType"> <endpoint

MCT: Luis Dueas

Pag 66 de 135

Manual de Windows Communication Foundation


address="myAddress" binding="basicHttpBinding" bindingConfiguration="myBindingConfiguration1" /> </service> </services> </system.serviceModel> </configuration> El name de la bindingConfiguration se establece en el elemento <binding>. El name debe ser una cadena nica dentro del mbito del tipo de enlace, en este caso el <basicHttpBinding>. El extremo vincula a la configuracin estableciendo el atributo bindingConfiguration en esta cadena. Una behaviorConfiguration se implementa de la misma manera, tal y como se muestra en el ejemplo siguiente. <?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="myBehavior"> <callbackDebug includeExceptionDetailInFaults="true" /> </behavior> </endpointBehaviors> </behaviors> <services> <service name="NewServiceType"> <endpoint address="myAddress" behaviorConfiguration="myBehavior" binding="basicHttpBinding" /> </service> </services> </system.serviceModel> </configuration> Este sistema permite a los extremos compartir configuraciones comunes sin volver a definir la configuracin. Si se requiere el mbito de equipo, cree el comportamiento de enlace o configuracin en Machine.config. Los valores de configuracin estn disponibles en todos los archivos App.config. La Configuration Editor Tool (SvcConfigEditor.exe) facilita la creacin de configuraciones.

3.3.2. Enlaces de Windows Communication Foundation


Los enlaces especifican cmo un extremo de servicio Windows Communication Foundation (WCF) se comunica con otros extremos. En lo ms bsico, un enlace debe especificar el transporte (por ejemplo, HTTP o TCP) a utilizar. Tambin puede establecer otras caractersticas, como seguridad y soporte de transacciones, a travs de los enlaces.

3.3.2.1. Informacin General de Enlaces de WCF


Los enlaces son objetos que se utilizan para especificar los datos de la comunicacin requeridos para conectar al extremo de un servicio Windows Communication Foundation (WCF). Cada extremo en un servicio WCF requiere que un enlace est bien especificado. En este tema, se describen los tipos de datos de comunicacin que los enlaces definen, los elementos de un enlace, qu enlaces estn incluidos en WCFy cmo se puede especificar un enlace para un extremo.

Qu define un enlace
La informacin de un enlace puede ser muy bsica o muy compleja. El enlace ms bsico especifica slo el protocolo de transporte (como HTTP) que se debe utilizar para conectar al extremo. En trminos ms generales, la informacin que contiene un enlace sobre cmo conectarse a un extremo queda incluida en una de las siguientes categoras. Protocolos

MCT: Luis Dueas

Pag 67 de 135

Manual de Windows Communication Foundation


Determina el mecanismo de seguridad utilizado: funcin de la mensajera de confianza o configuracin de flujo de contexto de transaccin. Codificacin Determina la codificacin del mensaje (por ejemplo, texto o binario). Transporte Determina el protocolo de transporte subyacente que se utilizar (por ejemplo, TCP o HTTP).

Los elementos de un enlace


Un enlace est bsicamente compuesto de una pila ordenada de elementos de enlace, cada uno de los cuales especifica parte de la informacin de la comunicacin requerida para conectar a un extremo de servicio. Las dos capas ms bajas de la pila son necesarias. En la base de la pila se encuentra el elemento de enlace de transporte y justo antes que ste se encuentra el elemento que contiene las especificaciones de la codificacin del mensaje. Los elementos de enlace opcionales que especifican los otros protocolos de comunicaciones se disponen en capas antes a los dos elementos necesarios.

Enlaces proporcionados por el sistema


La informacin de un enlace puede ser compleja y puede que parte de su configuracin no sea compatible con otros. Por esta razn, WCF incluye un conjunto de enlaces proporcionados por el sistema. Estos enlaces estn diseados para cubrir la mayora de los requisitos de aplicacin. Las clases siguientes representan algunos ejemplos de enlaces proporcionados por el sistema: BasicHttpBinding: Un enlace de protocolo HTTP adecuado para conectar a los Servicios Web que cumple con la especificacin del WS-I Basic Profile (por ejemplo, servicios web ASP.NET - servicios basados). WSHttpBinding: Un enlace interoperable adecuado para conectar a los extremos que se ajustan a WS * protocolos. NetNamedPipeBinding: Utiliza .NET Framework para conectar a otros extremos WCF en el mismo equipo. NetMsmqBinding: Utiliza .NET Framework para crear las conexiones de mensajes en cola con otros extremos WCF.

Utilizar sus propios enlaces


Si ninguno de los enlaces proporcionados por el sistema incluidos tiene la combinacin correcta de caractersticas que requiere una aplicacin de servicio, puede crear su propio enlace. Existen dos formas de lograr esto. Puede crear un nuevo enlace a partir de los elementos de enlace preexistentes mediante un objeto CustomBinding o puede crear un enlace completamente definido por el usuario derivado a partir del enlace Binding.

Utilizar los enlaces


El uso de enlaces conlleva dos pasos bsicos: 1. Seleccione o defina un enlace. El mtodo ms fcil es elegir uno de los enlaces proporcionados por el sistema incluido con WCF y lo utiliza con su configuracin predeterminada. Puede elegir tambin un enlace proporcionado por el sistema y restablecer sus valores de propiedad para satisfacer sus necesidades Otra manera es crear un enlace personalizado o un enlace definido por el usuario para tener grados de control y personalizacin ms altos. 2. Cree un extremo que utilice el enlace seleccionado o definido.

Cdigo y configuracin
Puede definir los enlaces de dos maneras: a travs del cdigo o a travs de la configuracin. Estos dos enfoques no dependen de si est utilizando un enlace proporcionado por el sistema o un enlace personalizado. En general, utilizar el cdigo le proporciona un control total sobre la definicin de un enlace y el tiempo de diseo. Por otro lado, la configuracin permite a un administrador del sistema o el usuario de un servicio WCF o cliente cambiar los parmetros de un enlace sin tener que volver a compilar la aplicacin de servicio. Esta flexibilidad es a menudo deseable, porque no hay ninguna manera de predecir los requisitos especficos del

MCT: Luis Dueas

Pag 68 de 135

Manual de Windows Communication Foundation


equipo con los que se implementar una aplicacin WCF. Dejar fuera la informacin de enlace (y el direccionamiento) del cdigo les permite cambiar sin requerir recopilacin o nueva implementacin de la aplicacin. Tenga en cuenta que se crean enlaces definidos en cdigo despus de los enlaces especificados en la configuracin, de modo que se permite a los enlaces definidos por cdigo sobrescribir los enlaces definidos por la configuracin.

3.3.2.2. Enlaces Proporcionados por el Sistema


Los enlaces especifican el mecanismo de comunicacin que se ha de utilizar al hablar con un extremo e indican cmo conectarse a un extremo. Un enlace contiene los siguientes elementos: La pila de protocolos determina la seguridad, confiabilidad y valores de flujo de contexto que se han de utilizar para los mensajes que se envan al extremo. El transporte determina el protocolo de transporte subyacente que se ha de utilizar al enviar mensajes al extremo, como, por ejemplo, TCP o HTTP. La codificacin determina la codificacin de la conexin que se ha de utilizar para los mensajes que se envan al extremo, como, por ejemplo, texto/XML, binaria o Mecanismo de optimizacin de transmisin de mensajes (MTOM). En este tema se presentan todos los enlaces de Windows Communication Foundation (WCF) proporcionados por el sistema. Si ninguno de ellos cumple los criterios exactos de su aplicacin, puede crear un enlace personalizado. Un enlace seguro e interoperable que admite el protocolo WS-Federation permite a las organizaciones que estn en una federacin autenticar y autorizar eficazmente a los usuarios. Nota: Siempre seleccione un enlace que incluya seguridad. De forma predeterminada, todos los enlaces salvo el elemento <basicHttpBinding> tienen habilitada la seguridad. Si no selecciona un enlace seguro o deshabilita la seguridad, asegrese de proteger sus datos de alguna otra manera, como realizar el almacenamiento en un centro de datos seguro o en una red aislada. Nota: Nunca utilice contratos dplex con enlaces que no admiten la seguridad o que tienen la seguridad deshabilitada, a menos que proteja los datos de algn otro modo.

Enlaces proporcionados por el sistema


Los siguientes enlaces vienen con WCF. Elemento de configuracin <basicHttpBinding>

Enlace BasicHttpBinding

Descripcin Un enlace que es til para la comunicacin con servicios web conformes con WS-Basic Profile, como, por ejemplo, servicios basados en servicios web de ASP.NET (ASMX). Este enlace utiliza HTTP como el transporte, y texto/XML como la codificacin de mensajes predeterminada. Un enlace seguro e interoperable, adecuado para contratos de servicio que no son dplex. Un enlace seguro e interoperable adecuado para contratos de servicios dplex o para la comunicacin a travs de intermediarios de SOAP. Un enlace seguro e interoperable que admite

WSHttpBinding

<wsHttpBinding>

WSDualHttpBinding

<wsDualHttpBinding>

WSFederationHttpBinding

<wsFederationHttpBinding>

MCT: Luis Dueas

Pag 69 de 135

Manual de Windows Communication Foundation

el protocolo WS-Federation que permite a las organizaciones que estn en una federacin autenticar y autorizar eficazmente a los usuarios. NetTcpBinding <netTcpBinding> Un enlace seguro y optimizado adecuado para la comunicacin entre equipos entre aplicaciones de WCF. Un enlace seguro, confiable y optimizado que es adecuado para la comunicacin en equipos entre aplicaciones de WCF. Un enlace en cola adecuado para la comunicacin entre equipos entre aplicaciones de WCF. Un enlace que permite una comunicacin segura entre mltiples equipos. Un enlace adecuado para la comunicacin entre equipos entre una aplicacin de WCF y aplicaciones de Message Queue Server existentes. Un enlace adecuado para la comunicacin con los servicios web compatibles con el perfil WS-Basic que permite el uso de cookies HTTP para intercambiar el contexto. Un enlace seguro y optimizado adecuado para la comunicacin entre aplicaciones WCF en distintos equipos que permite utilizar encabezados SOAP para intercambiar el contexto. Un enlace que se utiliza para configurar los extremos de los servicios web de WCF que se exponen mediante solicitudes HTTP en lugar de mensajes SOAP. Un enlace seguro e interoperable que es adecuado para los contratos de servicios no dplex que permite utilizar encabezados SOAP para intercambiar el contexto.

NetNamedPipeBinding

<netNamedPipeBinding>

NetMsmqBinding

<netMsmqBinding>

NetPeerTcpBinding

<netPeerTcpBinding>

MsmqIntegrationBinding

<msmqIntegrationBinding>

BasicHttpContextBinding

<basicHttpContextBinding>

NetTcpContextBinding

<netTcpContextBinding>

WebHttpBinding

<webHttpBinding>

WSHttpContextBinding

<wsHttpContextBinding>

La siguiente tabla muestra las caractersticas de cada uno de los enlaces proporcionados por el sistema. Los enlaces se encuentran en las columnas de la tabla; las caractersticas se enumeran en las filas y se describen en una segunda tabla. La siguiente tabla proporciona una clave para las abreviaturas de enlaces utilizadas. Para seleccionar un enlace, determine qu columna satisface todas las caractersticas de fila que necesite. Codificacin (valor predet) Texto, (MTOM) Transmisin por secuencias (predet.). S (almacenado en bfer)

Enlace BasicHttp Binding

Interop Basic Profile 1.1

Seguridad (valor predet..) (Ninguno), transporte, mensaje, mixto Transporte, (mensaje), mixto

Sesin (Predet). (Ninguno)

Transac ciones (Ninguno)

Dplex n/a

WSHttp Binding

WS

(Ninguno), sesin confiable,

(Ninguno), S

n/a

(Texto), MTOM

No

MCT: Luis Dueas

Pag 70 de 135

Manual de Windows Communication Foundation

sesin de seguridad WSDualHttp Binding WS (Mensaje), ninguno (Sesin confiable), sesin de seguridad (Ninguno), sesin confiable, sesin de seguridad (Transporte), sesin confiable, sesin de seguridad Ninguno, (transporte) (Ninguno), S S (Texto), MTOM No

WSFederation HttpBinding

WSFedera tion

(Mensaje), mixto, ninguno

(Ninguno), S

No

(Texto), MTOM

No

NetTcp Binding

.NET

(Transporte), mensaje, ninguno, mixto

(Ninguno), S

Binario

S (almacenado en bfer)

NetNamedPipe Binding

.NET

(Transporte), ninguno

(Ninguno), S

Binario

S (almacenado en bfer) No

NetMsmq Binding

.NET

Mensaje, (Transporte), Ninguno (Transporte)

(Ninguno), transporte

Ninguno, (S)

No

Binario

NetPeerTcp Binding

Del mismo nivel MSMQ

(Ninguno)

(Ninguno)

No

Msmq Integration Binding Basic HttpContext Binding

(Transporte)

(Ninguno)

Ninguno, (S)

n/a

n/a

No

Basic Profile 1.1

(Ninguno), transporte, mensaje, mixto (Transporte), mensaje, ninguno, mixto

(Ninguno)

(Ninguno)

n/a

Texto, (MTOM)

S (almacenado en bfer)

NetTcp Context Binding

.NET

(Transporte), sesin confiable, sesin de seguridad (Ninguno), sesin confiable, sesin de seguridad

(Ninguno), S

Binario

S (almacenado en bfer)

WSHttp Context Binding

WS

Transporte, (mensaje), mixto

(Ninguno), S

n/a

Texto, (MTOM)

No

La siguiente tabla explica las caractersticas enumeradas en la tabla anterior. Caracterstica Tipo de interoperabilidad Seguridad Descripcin Nombra el protocolo o tecnologa con la que el enlace asegura la interoperacin.

Especifica cmo se protege el canal: Ninguno: el mensaje SOAP no se protege y no se autentica el cliente. Transporte: los requisitos de seguridad se satisfacen en el nivel de transporte.

MCT: Luis Dueas

Pag 71 de 135

Manual de Windows Communication Foundation

Mensaje: los requisitos de seguridad se satisfacen en la capa del mensaje. Mixto: las demandas se llevan en el mensaje; el nivel de transporte cumple los requisitos de integridad y confidencialidad. Sesin Transacciones Dplex Especifica si este enlace admite contratos de sesin. Especifica si las transacciones estn habilitadas. Especifica si se admiten los contratos dplex. Observe que esta caracterstica requiere que el enlace admita sesiones. Especifica el formato de conexin del mensaje. Entre los valores permitidos se incluyen: Texto: por ejemplo, UTF-8. Binario Mecanismo de optimizacin de transmisin del mensaje (MTOM): mtodo para codificar de forma eficaz elementos XML binarios dentro del contexto de un sobre SOAP. Transmisin por secuencias Especifica si se admite la transmisin por secuencias para mensajes de entrada y de salida. Utilice la propiedad TransferMode del enlace para establecer el valor. Entre los valores permitidos se incluyen: Buffered: los mensajes de respuesta y solicitud se almacenan en bfer. Streamed: los mensajes de solicitud y respuesta se transmiten por secuencias. StreamedRequest: el mensaje de solicitud se transmite por secuencias y el mensaje de respuesta se almacena en bfer. StreamedResponse: el mensaje de solicitud se almacena en bfer y el mensaje de respuesta se transmite por secuencias.

Codificacin

3.3.2.3. Utilizacin de Enlaces para Configurar Servicios y Clientes


Los enlaces son los objetos que especifican los datos de comunicacin exigidos para conectar a un extremo. Ms especficamente, los enlaces contienen informacin de configuracin utilizada para crear el cliente o servicio en tiempo de ejecucin mediante la definicin de las caractersticas de transportes, formatos de la conexin (codificacin de mensajes) y protocolos que se utilizarn en el extremo respectivo o canal de cliente. Para crear un servicio Windows Communication Foundation (WCF) en funcionamiento, cada extremo del servicio exige un enlace. Este tema explica qu enlaces son, cmo se definen, y cmo se especifica un enlace determinado para un extremo.

Qu define un enlace
La informacin de un enlace puede ser muy bsica o muy compleja. El enlace ms bsico especifica slo el protocolo de transporte (como HTTP) que se debe utilizar para conectar al extremo. Ms generalmente, la informacin que contiene un enlace sobre cmo conectarse a un extremo queda incluida en una de las categoras de la tabla siguiente. Protocolos Determina el mecanismo de seguridad utilizado, funcin de la mensajera de confianza o configuracin de flujo de contexto de transaccin. Transporte Determina el protocolo de transporte subyacente que se utilizar (por ejemplo, TCP o Http). Codificacin

MCT: Luis Dueas

Pag 72 de 135

Manual de Windows Communication Foundation


Determina la codificacin del mensaje, por ejemplo, texto/XML, binario o Mecanismo de optimizacin de transmisin del mensaje (MTOM), que determinan cmo se representan los mensajes como secuencias de bytes en la conexin.

Enlace proporcionado por el sistema


WCF incluye un conjunto de enlaces proporcionados por el sistema que estn diseados para cubrir la mayora de los requisitos de aplicacin y escenarios. Las clases siguientes representan algunos ejemplos de enlaces proporcionados por el sistema: BasicHttpBinding: Un enlace de protocolo HTTP conveniente para conectar a los Servicios Web que cumple a la especificacin del WS-I Basic Profile 1.1 (por ejemplo, servicios web ASP.NET [ASMX] servicios basados). WsHttpBinding: Un enlace de protocolo HTTP conveniente para conectar a los extremos que cumplen con los protocolos de especificaciones de servicios Web. NetNamedPipeBinding: Utiliza la codificacin binaria .NET y las tecnologas de trama junto con el transporte de canalizacin con nombre de Windows para conectar a otros extremos WCF en el mismo equipo. NetMsmqBinding: Utiliza la codificacin binaria .NET y las tecnologas de trama junto con el Message Queue Server (tambin conocido como MSMQ) para crear las conexiones de mensaje en cola con otros extremos WCF.

Enlaces personalizados
Si la coleccin de enlaces proporcionados por el sistema no tiene la combinacin correcta de caractersticas que requiere una aplicacin de servicio, puede crear un enlace CustomBinding.

Utilizar los enlaces


El uso de enlaces conlleva dos pasos bsicos: 1. Seleccione o defina un enlace. El mtodo ms fcil es elegir uno de los enlaces proporcionados por el sistema y utilizar su configuracin predeterminada. Puede elegir tambin un enlace proporcionado por el sistema y restablecer sus valores de propiedad para satisfacer sus necesidades Tambin puede crear un enlace personalizado y establecer las propiedades como necesite. 2. Cree un extremo que utiliza este enlace.

Cdigo y configuracin
Puede definir o configurar los enlaces a travs del cdigo o configuracin. Estos dos enfoques son independientes segn el tipo de enlace utilizado, por ejemplo, si utiliza un enlace proporcionado por el sistema o un enlace CustomBinding. En general, el uso de cdigo proporciona un control total sobre la definicin de un enlace cuando se compila. El uso de configuracin, por otro lado, permite al administrador del sistema o al usuario de un servicio WCF o cliente cambiar los parmetros de enlaces. Esta flexibilidad es a menudo deseable porque no hay ninguna manera de predecir los requisitos especficos del equipo y las condiciones de red en la cual se implementar una aplicacin WCF. Separar la informacin de enlace (y direccionamiento) del cdigo permite a los administradores cambiar los datos obligatorios sin tener que volver a compilar o implementar de nuevo la aplicacin. Tenga en cuenta que si el enlace se define en cdigo, sobrescribe las definiciones basadas en configuracin realizadas en el archivo de configuracin.

3.3.2.3.1. Cmo: Especificar un Enlace de Servicio en la Configuracin


En este ejemplo, se define un contrato ICalculator para un servicio de calculadora bsico; el servicio se implementa en la clase CalculatorService y, despus, su extremo se configura en el archivo Web.config, donde se especifica que el servicio usa BasicHttpBinding. Normalmente es el mejor procedimiento para especificar el enlace y la informacin de direccin de forma declarativa en configuracin en lugar de hacerlo de forma imperativa en cdigo. Normalmente, no resulta muy prctico definir los extremos en el cdigo ya que los enlaces y las direcciones de un servicio implementado son,

MCT: Luis Dueas

Pag 73 de 135

Manual de Windows Communication Foundation


por lo general, diferentes de los utilizados durante el desarrollo del servicio. Ms generalmente, manteniendo el enlace y la informacin de direccin fuera del cdigo permite cambiarlos sin tener que volver a compilar o implementar la aplicacin. Todos los pasos de configuracin siguientes se pueden realizar utilizando Configuration Editor Tool (SvcConfigEditor.exe).

Para especificar BasicHttpBinding para utilizarlo para configurar el servicio


1. 2. Defina un contrato de servicios para el tipo de servicio. Implemente el contrato de servicios en una clase de servicio. Nota: La informacin de direccin o enlace no se especifica dentro de la implementacin del servicio. Por lo tanto, el cdigo no tiene que escribirse para recuperar esa informacin del archivo de configuracin. 3. Cree un archivo Web.config para configurar un extremo para CalculatorService que utiliza

WSHttpBinding. <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name=" CalculatorService" > <endpoint <-- Leave the address blank to be populated by default--> <--from the hosting environment,in this case IIS, so --> <-- the address will just be that of the IIS Virtual --> <--Directory.--> address="" <--Specify the binding type --> binding="wsHttpBinding" <--Specify the binding configuration name for that --> <--binding type. This is optional but useful if you --> <--want to modify the properties of the binding. --> <--The bindingConfiguration name Binding1 is defined --> <--below in the bindings element. --> bindingConfiguration="Binding1" contract="ICalculator" /> </service> </services> <bindings> <wsHttpBinding> <binding name="Binding1"> <-- Binding property values can be modified here. --> <--See the next procedure. --> </binding> </wsHttpBinding> </bindings> </system.serviceModel> </configuration> 4. Cree un archivo Service.svc que contenga la lnea siguiente y colquelo en su directorio virtual de Internet Information Services (IIS). <%@ServiceHost language=c# Service="CalculatorService" %>

Para modificar los valores predeterminados de las propiedades de enlace


1. Para modificar uno de los valores de propiedad predeterminados de WSHttpBinding, cree un nuevo nombre de la configuracin de enlace (<binding name="Binding1">) dentro del elemento <wsHttpBinding> y establezca los nuevos valores para los atributos del enlace en este elemento de

MCT: Luis Dueas

Pag 74 de 135

Manual de Windows Communication Foundation


enlace. Por ejemplo, para cambiar los valores predeterminados de abrir y cerrar el tiempo de espera de 1 minuto a 2 minutos, agregue el siguiente al archivo de configuracin. <wsHttpBinding> <binding name="Binding1" closeTimeout="00:02:00" openTimeout="00:02:00"> </binding> </wsHttpBinding>

3.3.2.3.2. Cmo: Especificar un Enlace de Servicio en el Cdigo


En este ejemplo, se define un contrato de ICalculator para un servicio de la calculadora, el servicio se implementa en la clase CalculatorService y a continuacin, su extremo se define mediante cdigo, donde se especifica que el servicio debe utilizar la clase BasicHttpBinding. Normalmente es el mejor procedimiento para especificar el enlace y la informacin de direccin de forma declarativa en configuracin en lugar de hacerlo de forma imperativa en cdigo. Normalmente, no resulta muy prctico definir los extremos en el cdigo ya que los enlaces y las direcciones de un servicio implementado son, por lo general, diferentes de los utilizados durante el desarrollo del servicio. Ms generalmente, manteniendo el enlace y la informacin de direccin fuera del cdigo permite cambiarlos sin tener que volver a compilar o implementar la aplicacin.

Para especificar mediante cdigo que se use BasicHttpBinding para el servicio


1. 2. 3. Defina un contrato de servicios para el tipo de servicio. Implemente el contrato de servicios en una clase de servicio. En la aplicacin de alojamiento, cree la direccin base que han de utilizar el servicio y el enlace con el servicio. 4. Cree el host para el servicio, agregue el extremo y, a continuacin, abra el host.

Para modificar los valores predeterminados de las propiedades de enlace


1. Para modificar uno de los valores predeterminados de propiedades de la clase BasicHttpBinding, establezca el valor de la propiedad del enlace en el nuevo valor antes de crear el host. Por ejemplo, para cambiar los valores predeterminados de tiempos de espera de apertura y cierre de 1 a 2 minutos, utilice lo siguiente.

3.3.2.3.3. Cmo: Especificar un Enlace de Cliente en la Configuracin


En este ejemplo, se crea una aplicacin de consola de cliente para utilizar un servicio de calculadora y el enlace para ese cliente se especifica de manera declarativa en la configuracin. El cliente obtiene acceso al CalculatorService, que implementa la interfaz ICalculator, y el servicio y el cliente utilizan la clase BasicHttpBinding. El procedimiento descrito asume que el servicio de calculadora se est ejecutando. Tambin utiliza ServiceModel Metadata Utility Tool (Svcutil.exe) que Windows Communication Foundation (WCF) proporciona para generar automticamente los componentes de cliente. La herramienta genera el cdigo de cliente y la configuracin para obtener acceso al servicio. El cliente se genera en dos partes. Svcutil.exe genera la ClientCalculator que implementa la interfaz ICalculator. Esta aplicacin de cliente se construye a continuacin mediante la creacin de una instancia de ClientCalculator. Normalmente es el mejor procedimiento para especificar el enlace y la informacin de direccin de forma declarativa en configuracin en lugar de hacerlo de forma imperativa en cdigo. Normalmente, no resulta muy prctico definir los extremos en el cdigo ya que los enlaces y las direcciones de un servicio implementado son, por lo general, diferentes de los utilizados durante el desarrollo del servicio. Ms generalmente, manteniendo el enlace y la informacin de direccin fuera del cdigo permite cambiarlos sin tener que volver a compilar o implementar la aplicacin.

MCT: Luis Dueas

Pag 75 de 135

Manual de Windows Communication Foundation


Puede realizar todos los pasos de configuracin siguientes utilizando Configuration Editor Tool

(SvcConfigEditor.exe).

Especificacin de un enlace de cliente mediante configuracin


1. Utilice Svcutil.exe desde la lnea de comandos para generar el cdigo a partir de los metadatos del servicio. Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address> 2. El cliente que se genera contiene la interfaz ICalculator que define el contrato de servicios que la implementacin del cliente debe cumplir. 3. 4. El cliente generado tambin contiene la implementacin de ClientCalculator. Svcutil.exe tambin genera la configuracin para el cliente que utiliza la clase BasicHttpBinding. Al utilizar Visual Studio, nombre a este archivo como App.config. Observe que la informacin de enlace y direccin no se especifican en ninguna parte de la implementacin del servicio. Adems, el cdigo tiene que escribirse para recuperar esa informacin del archivo de configuracin. 5. Cree una instancia de ClientCalculator en una aplicacin y, a continuacin, llame a las operaciones del servicio. 6. Compile y ejecute el cliente.

3.3.2.3.4. Cmo: Especificar un Enlace de Cliente en el Cdigo


En este ejemplo, se crea un cliente para utilizar un servicio de la calculadora y el enlace para ese cliente se especifica en cdigo de manera imperativa. El cliente obtiene acceso al CalculatorService, que implementa la interfaz ICalculator, y el servicio y el cliente utilizan la clase BasicHttpBinding. Este procedimiento asume que el servicio de la calculadora se est ejecutando. Tambin utiliza ServiceModel Metadata Utility Tool (Svcutil.exe) que Windows Communication Foundation (WCF) proporciona para generar automticamente los componentes de cliente. La herramienta genera el cdigo de cliente para tener acceso al servicio. El cliente se genera en dos partes. Svcutil.exe genera la ClientCalculator que implementa la interfaz ICalculator. Esta aplicacin de cliente se construye mediante la creacin de una instancia de ClientCalculator y especificando, a continuacin, el enlace y la direccin del servicio mediante cdigo.

Para especificar un enlace personalizado mediante cdigo


1. Utilice Svcutil.exe desde la lnea de comandos para generar el cdigo a partir de los metadatos del servicio. Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address> 2. El cliente que se genera contiene la interfaz ICalculator que define el contrato de servicios que la implementacin del cliente debe cumplir. 3. 4. El cliente generado tambin contiene la implementacin de ClientCalculator. Cree una instancia de ClientCalculator que utiliza la clase BasicHttpBinding en una aplicacin cliente y, a continuacin, llame a las operaciones del servicio en la direccin especificada. 5. Compile y ejecute el cliente.

3.3.2.4. Configuracin de Enlaces para Servicios WCF


Con frecuencia al crear una aplicacin desea delegar las decisiones al administrador tras la implementacin de la aplicacin. Por ejemplo, a menudo no hay manera de conocer de antemano qu ser una direccin de servicio o un URI. En lugar de incluir una direccin en el cdigo, es preferible permitir a un administrador hacerlo despus de crear un servicio. Esta flexibilidad se logra a travs de la configuracin. Nota:

MCT: Luis Dueas

Pag 76 de 135

Manual de Windows Communication Foundation

Utilice ServiceModel Metadata Utility Tool (Svcutil.exe) con el modificador /config para crear rpidamente archivos de configuracin.

Secciones principales
El esquema de configuracin Windows Communication Foundation (WCF) incluye las tres secciones principales siguientes (serviceModel, bindingsy services): <configuration> <system.serviceModel> <bindings> </bindings> <services> </services> <behaviors> </behaviors> </system.serviceModel> </configuration> Elementos ServiceModel Puede utilizar la seccin limitada por el elemento system.ServiceModel para configurar un tipo de servicio con uno o ms extremos, as como los valores para un servicio. Cada extremo se puede configurar a continuacin con una direccin, un contrato y un enlace. Un enlace especifica transportes (HTTP, TCP, canalizaciones, Message Queue Server) y protocolos (seguridad, confiabilidad, flujos de transaccin) y est compuesto de elementos de enlace, cada uno de los cuales especifica un aspecto sobre cmo un extremo se comunica con el mundo. Por ejemplo, especificar el elemento basicHttpBinding indica que se utilice http como el transporte para un extremo. Se utiliza para conectar el extremo en tiempo de ejecucin cuando se abre el servicio utilizando este extremo. Hay dos tipos de enlaces: predefinidos y personalizados. Los enlaces predefinidos contienen combinaciones tiles de elementos que se utilizan en escenarios comunes. Si ninguna coleccin de enlace predefinido tiene la combinacin correcta de caractersticas que una aplicacin de servicio necesita, puede construir enlaces personalizados para satisfacer los requisitos de la aplicacin. Los cuatro ejemplos siguientes muestran las configuraciones de enlace ms comunes utilizadas para preparar un servicio WCF. Especificar un extremo para utilizar un tipo de enlace El primer ejemplo muestra cmo especificar un extremo configurado con una direccin, un contrato y un enlace. <service type="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"> <endpoint address="/HelloWorld2/" contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" binding="basicHttpBinding" /> </endpoint> </service> En este ejemplo, el atributo de type indica para qu tipo de servicio es la configuracin. Al crear un servicio en su cdigo con el contrato HelloWorld, se inicializa con todos los extremos definidos en la configuracin del ejemplo. Si el ensamblado implementa slo uno contrato de servicios, se puede omitir el atributo type porque el servicio utiliza el nico tipo disponible. El atributo toma una cadena, que debe tener el formato Namespace.Class, AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

MCT: Luis Dueas

Pag 77 de 135

Manual de Windows Communication Foundation


El atributo address especifica el URI que otros extremos utilizan para comunicarse con servicio. El URI puede ser una ruta de acceso absoluta o relativa. Si se proporciona una direccin relativa, se espera que el host proporcione una direccin base que sea adecuada para el esquema de transporte usado en el enlace. Si no se configura una direccin, se supone que la direccin base es la direccin para ese extremo. El atributo contract especifica el contrato que este extremo est exponiendo. El tipo de implementacin de servicio debe implementar el tipo de contrato. Si una implementacin de servicio implementa un tipo de contrato nico, entonces se puede omitir esta propiedad. El atributo binding selecciona un enlace predefinido o personalizado para utilizarlo para este extremo concreto. Un extremo que no selecciona explcitamente un enlace utiliza la seleccin de enlace predeterminada, que es BasicHttpBinding. Modificar un enlace predefinido En el ejemplo siguiente, un enlace predefinido se modifica y denomina. Se puede utilizar a continuacin para configurar cualquier extremo en el servicio. El enlace se modifica estableciendo el valor ReceiveTimeout en 1 segundo. Observe que la propiedad devuelve un objeto TimeSpan. Ese enlace alterado se encuentra en la seccin de enlaces y se proporciona un nombre nico al enlace alterado, shortTimeout, establecido por el atributo name. Este enlace alterado se puede utilizar al crear cualquier extremo estableciendo el atributo binding en el elemento endpoint en el nombre nico. Esto le permite tener un nmero casi ilimitado de variaciones del enlace estndar. Nota: Si no crea variaciones de un enlace estndar, no tiene que establecer el atributo bindingConfiguration en ningn valor. En ese caso, se utiliza el enlace predefinido no modificado. <service type="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"> <endpoint address="/HelloWorld2/" contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" binding="basicHttpBinding" /> </endpoint> </service> <bindings> <basicHttpBinding name="shortTimeout" receiveTimeout="00:00:01"/> </bindings>

Configurar un comportamiento para aplicarlo a un servicio


En el ejemplo siguiente, un comportamiento concreto se configura para el tipo de servicio. El elemento metadataPublishing se utiliza para permitir a ServiceModel Metadata Utility Tool (Svcutil.exe) a consultar el servicio y generar los documentos Web Services Description Language (WSDL) de los metadatos. <behaviors> <behavior name="MetaPlusExceptions" > <metadataPublishing enableGetWsdl="true" /> </behavior> </behaviors> <services> <service type="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" serviceBehaviorName="MetaPlusExceptions"> <endpoint address="http://computer:8080/Hello" contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" binding="basicHttpBinding" /> </endpoint> </service> </services> La configuracin anterior permite a un cliente llamar

MCT: Luis Dueas

Pag 78 de 135

Manual de Windows Communication Foundation


svcutil /config:Client.exe.config http://computer:8080/Hello?wsdl y obtener los metadatos del servicio tipo "HelloWorld".

Especificar un servicio con dos extremos utilizando valores de enlace diferentes


En este ltimo ejemplo, dos extremos se configuran para el tipo de servicio Hello. Cada extremo utiliza un atributo bindingConfiguration personalizado diferente del mismo tipo de enlace (cada uno modifica basicHttpBinding). <service type="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null"> <endpoint address="http://computer:8080/Hello" contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" binding="basicHttpBinding" bindingConfiguration="shortTimeout" </endpoint> <endpoint address="http://computer:8080/Hello" contract="HelloWorld, IndigoConfig, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null" binding="basicHttpBinding" bindingConfiguration="Secure" </endpoint> </service> <bindings> <basicHttpBinding name="shortTimeout" timeout="00:00:00:01" /> <basicHttpBinding name="Secure" /> <Security mode="Transport" /> </bindings>

3.3.3. Extremos en Windows Communication Foundation


Toda la comunicacin con un servicio Windows Communication Foundation (WCF) se produce a travs de los extremos del servicio. Los extremos proporcionan a los clientes acceso a la funcionalidad que un servicio WCF ofrece. Cada extremo contiene: Una direccin que indica dnde buscar el extremo. Un enlace que especifica cmo un se puede comunicar un cliente con el extremo. Un contrato que identifica los mtodos disponibles.

3.3.3.1. Informacin General acerca de la Creacin de Puntos Finales


Toda la comunicacin con un servicio Windows Communication Foundation (WCF) se produce a travs de los extremos del servicio. Los extremos proporcionan a los clientes acceso a la funcionalidad que ofrece un servicio WCF. Esta seccin describe la estructura de un extremo, y detalla cmo definir un extremo en la configuracin y el cdigo.

Estructura de un extremo
Cada extremo contiene una direccin que indica dnde se encuentra el extremo, un enlace que especifica cmo puede comunicarse un cliente con el extremo, y un contrato que identifica los mtodos disponibles. Direccin. La direccin identifica nicamente el extremo e indica a los consumidores potenciales dnde se ubica el servicio. En el modelo de objeto WCF est representada por la direccin EndpointAddress, que contiene un Identificador uniforme de recursos (URI) y propiedades de direccin que incluyen una identidad, algunos elementos del lenguaje de descripcin de servicios web (WSDL), y una coleccin de encabezados opcionales. Los encabezados opcionales proporcionan informacin de direccionamiento adicional para identificar o interactuar con el extremo. Enlace. El enlace especifica cmo comunicarse con el extremo. Tambin especifica cmo se comunica el extremo con el mundo, incluido el protocolo de transporte que utiliza (por ejemplo, TCP o HTTP), la

MCT: Luis Dueas

Pag 79 de 135

Manual de Windows Communication Foundation


codificacin utilizada en los mensajes (por ejemplo, texto o binario) y los requisitos de seguridad necesarios (por ejemplo, capa de sockets seguros [SSL] o seguridad del mensaje SOAP). Contrato de servicios. El contrato de servicios describe qu funcionalidad expone el extremo al cliente. Un contrato especifica las operaciones a las que puede llamar un cliente, la forma del mensaje y el tipo de parmetros de entrada o los datos necesarios para llamar a la operacin, as como el tipo de mensaje de procesamiento o respuesta que puede esperar el cliente. Existen tres tipos bsicos de contratos que se corresponden con los modelos de intercambio de mensajes bsicos (MEP): datagrama (unidireccional), solicitud/respuesta y dplex (bidireccional). El contrato de servicios tambin puede utilizar contratos de datos y mensajes para exigir tipos de datos y formatos de mensaje especficos cuando se obtiene acceso. Tenga en cuenta que tambin pueden exigrsele a un cliente que implemente un contrato definido por servicio, denominado un contrato de devolucin de llamada, para recibir los mensajes del servicio en un MEP dplex. El extremo de un servicio puede especificarse de manera imperativa, mediante el cdigo, o de manera declarativa a travs de la configuracin. Normalmente, no resulta muy prctico definir los extremos en el cdigo ya que los enlaces y las direcciones de un servicio implementado son, por lo general, diferentes de los utilizados durante el desarrollo del servicio. Generalmente, es ms prctico definir extremos de servicio mediante la configuracin en lugar del cdigo. Mantener la informacin del enlace y el direccionamiento fuera del cdigo permite cambiar los extremos sin tener que volver a compilar e implementar la aplicacin. Nota: Cuando se agrega un extremo de servicio que realiza la suplantacin, debe utilizarse uno de los mtodos AddServiceEndpoint, o el mtodo GetContract para cargar correctamente el contrato en un nuevo objeto ServiceDescription.

Definir los extremos en cdigo


El siguiente ejemplo muestra cmo especificar un extremo en cdigo: Defina un contrato para un tipo de servicio IEcho que acepta el nombre de alguien y responde con un mensaje de eco "Hola <nombre>! ". Implemente un servicio Echo del tipo definido por el contrato IEcho. Especifique una direccin de extremo de http://localhost:8000/Echo para el servicio. Configure el servicio Echo mediante un enlace WSHttpBinding. ' Define the contract for the IEcho service <ServiceContract()> _ Public Interface IEcho <OperationContract()> _ Function Hello(ByVal name As String) As String End Interface ' Create an Echo service that implements IEcho contract Public Class Echo Implements IEcho Public Function Hello(ByVal name As String) As String Implements ICalculator.Hello Dim result As String = "Hello" + name + "!" Return result End Function ' Specify the base address for Echo service. Dim echoUri As Uri = New Uri("http://localhost:8000/") ' Create a ServiceHost for the Echo service. Dim svcHost As ServiceHost = New ServiceHost(GetType(HelloWorld), echoUri) ' Use a predefined WSHttpBinding to configure the service. Dim binding As New WSHttpBinding() ' Add the endpoint for this service to the service host. serviceHost.AddServiceEndpoint(GetType(IEcho), binding, echoUri) ' Open the service host to run it. serviceHost.Open()

MCT: Luis Dueas

Pag 80 de 135

Manual de Windows Communication Foundation

Nota: El host del servicio se crea con una direccin base y, a continuacin, se especifica el resto de la direccin, relacionada con la direccin base, como parte de un extremo. Esta subdivisin de la direccin permite definir varios extremos de manera ms conveniente para los servicios de un host. Nota: Las propiedades de ServiceDescription en la aplicacin de servicio no deben modificarse despus del mtodo OnOpening en ServiceHostBase. Algunos miembros, como la propiedad Credentials y los mtodos AddServiceEndpoint en ServiceHostBase y ServiceHost, inician una excepcin si se modifican pasado ese punto. Otros permiten modificarlos, pero el resultado no est definido. De igual forma, en el cliente no se deben modificar los valores ServiceEndpoint despus de la llamada a OnOpening en ChannelFactory. La propiedad Credentials inicia una excepcin si se modifican pasado ese punto. Los otros valores de descripcin del cliente pueden modificarse sin el error, pero el resultado no est definido. Tanto si es para el servicio como para el cliente, se recomienda modificar la descripcin antes de llamar a Open.

Definir los extremos en configuracin


Con frecuencia al crear una aplicacin se desea delegar las decisiones al administrador que est implementando la aplicacin. Por ejemplo, es habitual que no pueda saberse de antemano cul ser la direccin de servicio (una URI). En lugar de incluir una direccin en el cdigo, es preferible permitir a un administrador hacerlo despus de crear un servicio. Esta flexibilidad se logra a travs de la configuracin. Nota: Utilice ServiceModel Metadata Utility Tool (Svcutil.exe) con el modificador /config:nombre de archivo[, nombre de archivo] para crear rpidamente archivos de configuracin.

3.3.3.2. Especificacin de una Direccin de Extremo


Toda comunicacin con un servicio de Windows Communication Foundation (WCF) se produce a travs de sus extremos. Cada ServiceEndpoint contiene un Address, un Bindingy un Contract. El contrato especifica qu operaciones estn disponibles. El enlace especifica cmo comunicarse con el servicio y la direccin especifica dnde encontrar el servicio. Cada extremo debe tener una direccin nica. La clase EndpointAddress representa la direccin de extremo, que contiene un Identificador uniforme de recursos (URI) que representa la direccin del servicio, una Identity, que representa la identidad de seguridad del servicio, y una coleccin de Headers opcional. Los encabezados opcionales proporcionan informacin ms detallada de direccionamiento para identificar o interactuar con el extremo. Por ejemplo, los encabezados pueden indicar cmo procesar un mensaje entrante, dnde el extremo debera enviar un mensaje de respuesta o qu instancia de un servicio se va a utilizar para procesar un mensaje entrante de un usuario determinado cuando hay varias instancias disponibles.

Definicin de una direccin del extremo


En WCF, una EndpointAddress modela una referencia del extremo (EPR), tal y como se define en la norma WS-Addressing. El URI de la direccin de la mayora de transportes tiene cuatro partes. Por ejemplo, este URI, "http://www.fabrikam.com: 322/mathservice .svc/secureEndpoint" tiene las cuatro partes siguientes: Esquema: http: Equipo: www.fabrikam.com (opcional) Puerto: 322 Ruta de acceso: /mathservice.svc/secureEndpoint

MCT: Luis Dueas

Pag 81 de 135

Manual de Windows Communication Foundation


Parte del modelo EPR consiste en que cada referencia de extremo puede llevar algunos parmetros de referencia que agregan informacin de identificacin adicional. En WCF, estos parmetros de referencia se modelan como instancias de la clase AddressHeader. La direccin del extremo de un servicio puede especificarse de manera imperativa mediante cdigo, o de manera declarativa mediante configuracin. Normalmente, no resulta muy prctico definir los extremos mediante cdigo, ya que los enlaces y las direcciones de un servicio implementado son, por lo general, diferentes de los utilizados durante el desarrollo del servicio. Generalmente, es ms prctico definir extremos de servicio mediante configuracin en lugar de mediante cdigo. Mantener la informacin del enlace y el direccionamiento fuera del cdigo les permite cambiar sin tener que volver a compilar e implementar la aplicacin. Hay dos maneras de especificar las direcciones del extremo de un servicio en WCF. Puede especificar una direccin absoluta para cada extremo asociado al servicio o puede proporcionar una direccin base para ServiceHost de un servicio y, a continuacin, especificar una direccin para cada extremo asociado a este servicio que se define relativo a esta direccin base. Puede utilizar cada uno de estos procedimientos para especificar las direcciones de extremo de un servicio mediante configuracin o cdigo. Si no especifica una direccin relativa, el servicio utiliza la direccin base. Tambin puede tener varias direcciones base para un servicio, pero en cada servicio se permite slo una direccin base para cada transporte. Si tiene varios extremos, cada uno de los cuales est configurado con un enlace diferente, sus direcciones deben ser nicas. Los extremos que utilizan el mismo enlace pero contratos diferentes pueden utilizar la misma direccin. Al hospedarse con IIS, no administra por s mismo las instancias ServiceHost. La direccin base siempre es la direccin especificada en el archivo .svc para el servicio al hospedarse en IIS. De modo que siempre debe utilizar direcciones de extremo relativas para los extremos de servicio hospedados en IIS. Proporcionar una direccin de extremo completa puede conducir a errores en la implementacin del servicio.

Definicin de direcciones de extremos mediante configuracin


Para definir un extremo en un archivo de configuracin, utilice el elemento <endpoint>. Cuando se llama (es decir, cuando la aplicacin de hospedaje intenta iniciar el servicio) al mtodo Open, el sistema busca un elemento <service> con un atributo de nombre que especifica "UE.Samples.HelloWorld". Si se encuentra el elemento <service>, el sistema carga la clase especificada y crea los extremos utilizando las definiciones de extremo proporcionadas en el archivo de configuracin. Este mecanismo le permite cargar e iniciar un servicio con dos lneas de cdigo, mientras mantiene la informacin de enlace y direccin fuera de su cdigo. La ventaja de este enfoque es que estas modificaciones se pueden realizar sin tener que volver a compilar o implementar la aplicacin. Los encabezados opcionales se declaran en <headers> element. Lo siguiente es un ejemplo de los elementos utilizados para especificar los extremos de un servicio en un archivo de configuracin que distinga entre dos encabezados: Clientes "Gold" de http://tempuri1.org/ y clientes "Standard" de http://tempuri2.org/. El cliente que llama a este servicio debe tener el <headers> element adecuado en su archivo de configuracin. Los encabezados tambin se pueden definir como en mensajes individuales en lugar de todos los mensajes en un extremo (como se ha mostrado previamente). Ello se consigue utilizando OperationContextScope para crear un nuevo contexto en una aplicacin de cliente para agregar un encabezado personalizado al mensaje saliente, tal y como se muestra en el ejemplo siguiente.

Direccin del extremo en metadatos


Una direccin de extremo se representa en el Lenguaje de descripcin de servicios web (WSDL) como un elemento EndpointReference (EPR) de WS-Addressing dentro del elemento wsdl:port del extremo

MCT: Luis Dueas

Pag 82 de 135

Manual de Windows Communication Foundation


correspondiente. El EPR contiene la direccin del extremo, as como todas las propiedades de la direccin. Observe que la EPR dentro de wsdl:port reemplaza a soap:Address, como se observa en el siguiente ejemplo.

Definicin de direcciones del extremo mediante cdigo


Una direccin de extremo se puede crear mediante cdigo con la clase EndpointAddress. El URI especificado para la direccin del extremo puede ser una ruta de acceso completa o una ruta de acceso relativa a la direccin base del servicio. En el siguiente ejemplo observaremos cmo crear una nueva instancia de la clase EndpointAddress y agregarla a la instancia ServiceHost que hospeda el servicio.

3.3.3.3. Cmo Crear un Extremo de Servicio en Configuracin


Los extremos proporcionan a los clientes acceso a la funcionalidad que ofrece un servicio de Windows Communication Foundation (WCF). Puede definir uno o ms extremos para un servicio utilizando una combinacin de direcciones de extremo relativas y absolutas.

Ejemplo
La siguiente configuracin de servicio especifica una direccin base y cinco extremos. La direccin base se especifica utilizando el elemento add, bajo service/host/baseAddresses, como se muestra en el siguiente ejemplo. La primera definicin de extremo mostrada en el siguiente ejemplo especifica una direccin relativa, que significa que la direccin del extremo es una combinacin de la direccin base y la direccin relativa siguiendo las reglas de composicin de identificadores uniformes de recursos (URI). La direccin relativa est vaca (""), por lo que la direccin del extremo es igual a la direccin base. La direccin del extremo real es http://localhost:8000/servicemodelsamples/service. La segunda definicin de extremo tambin especifica una direccin relativa, como se muestra en el siguiente ejemplo de configuracin. La direccin relativa, "test", se anexa a la direccin base. La direccin del extremo real es http://localhost:8000/servicemodelsamples/service/test. La tercera definicin de extremo especifica una direccin absoluta, como se muestra en el siguiente ejemplo de configuracin. La direccin base no juega ningn papel en la direccin. La direccin del extremo real es http://localhost:8001/hello/servicemodelsamples. La cuarta direccin del extremo especifica una direccin absoluta y un TCP de transporte diferente. La direccin base no juega ningn papel en la direccin. La direccin del extremo real es net.tcp://localhost:9000/servicemodelsamples/service.

3.3.3.4. Cmo Crear un Extremo de Servicio en Cdigo


En este ejemplo, se define un contrato de ICalculator para un servicio de la calculadora, el servicio se implementa en la clase CalculatorService y a continuacin, su extremo se define mediante cdigo, donde se especifica que el servicio debe utilizar la clase BasicHttpBinding. Normalmente es el mejor procedimiento para especificar el enlace y la informacin de direccin de forma declarativa en configuracin en lugar de hacerlo de forma imperativa en cdigo. Normalmente, no resulta muy prctico definir los extremos en el cdigo ya que los enlaces y las direcciones de un servicio implementado son, por lo general, diferentes de los utilizados durante el desarrollo del servicio. Ms generalmente, manteniendo el enlace y la informacin de direccin fuera del cdigo permite cambiarlos sin tener que volver a compilar o implementar la aplicacin.

MCT: Luis Dueas

Pag 83 de 135

Manual de Windows Communication Foundation


Procedimiento
Creacin de un extremo de servicio mediante cdigo 1. 2. 3. Cree la interfaz que define el contrato de servicios. Implemente el contrato de servicios definido en el paso 1. En la aplicacin de alojamiento, cree la direccin base que han de utilizar el servicio y el enlace con el servicio. 4. Cree el host y llame al mtodo AddServiceEndpoint o una de las otras sobrecargas para agregar el extremo de servicio del host.

3.3.3.5. Publicacin de Extremos de Metadatos


Los servicios de Windows Communication Foundation (WCF) publican metadatos mediante la publicacin de uno o ms extremos de metadatos. La publicacin de metadatos de servicio pone los metadatos a disposicin mediante protocolos estandarizados, como WS-MetadataExchange (MEX) y solicitudes HTTP/GET. Los extremos de metadatos son similares a otros extremos de servicio en cuanto que tienen una direccin, un enlace y un contrato, y se pueden agregar a un host del servicio mediante configuracin o cdigo. Para habilitar la publicacin de extremos de metadatos, debe agregar el comportamiento de servicio ServiceMetadataBehavior al servicio. De forma predeterminada, los servicios de WCF no publican los extremos de metadatos, por lo que debe agregarlos explcitamente a su servicio para habilitar la publicacin de metadatos para su servicio.

3.3.3.5.1. Cmo Publicar Metadatos para un Servicio mediante un Archivo de Configuracin


ste es uno de dos temas de instrucciones para la publicacin de metadatos para un servicio de Windows Communication Foundation (WCF). Hay dos maneras de especificar cmo debera publicar metadatos un servicio: mediante un archivo de configuracin y mediante cdigo. En este tema se muestra cmo publicar metadatos para un servicio mediante un archivo de configuracin. La publicacin de metadatos permite a los clientes recuperar los metadatos mediante una solicitud GET de WS-Transfer o mediante una solicitud HTTP/GET utilizando la cadena de solicitud ?wsdl. Para estar seguro de que el cdigo funciona, cree un servicio bsico de WCF. Se proporciona un servicio autohospedado bsico para simplificar en el cdigo siguiente. Este servicio es un servicio autohospedado que se configura utilizando un archivo de configuracin. El archivo de configuracin siguiente sirve de punto de partida para este tema.

Publicacin de metadatos para un servicio WCF mediante un archivo de configuracin


1. Dentro del archivo App.config, despus del elemento </services> de cierre, cree un elemento <behaviors>. 2. 3. Dentro del elemento <behaviors>, agregue un nuevo elemento <serviceBehaviors>. Agregue un elemento <behavior> al elemento <serviceBehaviors> y especifique un valor para el atributo name del elemento <behavior>. 4. Agregue un elemento <serviceMetadata> al elemento <behavior>. Establecer el atributo httpGetEnabled en true y el atributo policyVersion en Policy15. httpGetEnabled permite al servicio responder a las solicitudes de metadatos realizadas por una solicitud HTTP GET. policyVersion indica al servicio que cumpla con WS-Policy 1.5 al generar los metadatos. 5. Agregue un atributo behaviorConfiguration al elemento <service> y especifique el atributo name del elemento <behavior> agregado en el paso 1, como en el siguiente cdigo de ejemplo. 6. Agregue uno o ms elementos <endpoint> con el contrato establecido en IMetadataExchange, como en el siguiente cdigo de ejemplo. 7. Para los extremos de metadatos agregados en el paso 6, establezca el atributo binding en uno de los siguientes valores: mexHttpBinding para la publicacin HTTP.

MCT: Luis Dueas

Pag 84 de 135

Manual de Windows Communication Foundation


mexHttpsBinding para la publicacin HTTPS. mexNamedPipeBinding para la publicacin de la canalizacin con nombre. mexTcpBinding para la publicacin TCP. 8. Para los extremos de metadatos agregados en el paso 6, establezca la direccin en: Una cadena vaca para utilizar la direccin base de la aplicacin host como el punto de publicacin si la direccin base es igual que el enlace de los metadatos. Una direccin relativa si la aplicacin host tiene una direccin base. Una direccin absoluta 9. Genere y ejecute la aplicacin de consola.

10. Utilice Internet Explorer para ir a la direccin base del servicio (http://localhost:8001/MetadataSample en este ejemplo) y comprobar que la publicacin de los metadatos est activada. Si no, un mensaje en la parte superior de la pgina resultante muestra: "La publicacin de metadatos para este servicio est deshabilitad actualmente".

3.3.3.5.2. Publicacin de Metadatos para un Servicio mediante Cdigo


ste es uno de dos temas de instrucciones para la publicacin de metadatos para un servicio de Windows Communication Foundation (WCF). Hay dos maneras de especificar cmo debera publicar metadatos un servicio: mediante un archivo de configuracin y mediante cdigo. En este tema se muestra cmo publicar metadatos para un servicio mediante cdigo. La publicacin de metadatos permite a los clientes recuperar los metadatos mediante una solicitud GET de WS-Transfer o mediante una solicitud HTTP/GET utilizando la cadena de solicitud ?wsdl. Para asegurarse de que el cdigo funciona, debe crear un servicio bsico de WCF. En el cdigo siguiente, se proporciona un servicio autohospedado bsico.

Publicacin de metadatos mediante cdigo


1. Dentro del mtodo principal de una aplicacin de consola, cree instancias de un objeto ServiceHost pasando el tipo de servicio y la direccin base. 2. Cree un bloque try justo debajo del cdigo del paso 1, esto detecta cualquier excepcin que se produzca mientras se est ejecutando el servicio. 3. Compruebe si el host del servicio ya contiene un ServiceMetadataBehavior, si no, cree una nueva instancia de ServiceMetadataBehavior. 4. 5. Establezca la propiedad HttpGetEnabled en true.. El ServiceMetadataBehavior contiene una propiedad MetadataExporter. El MetadataExporter contiene una propiedad PolicyVersion. Establezca el valor de la propiedad PolicyVersion en Policy15. La propiedad PolicyVersion tambin se puede establecer en Policy12. Cuando se establece en Policy15, el exportador de metadatos genera informacin de directivas con los metadatos que cumple la especificacin WS-Policy 1.5. Cuando se establece en Policy12, el exportador de metadatos genera informacin de directiva que cumple la especificacin WS-Policy 1.2. 6. Agregue la instancia de ServiceMetadataBehavior a la coleccin de comportamientos del host del servicio. 7. 8. 9. Agregue el extremo de intercambio de metadatos al host del servicio. Agregue un extremo de aplicacin al host del servicio. Abra el host del servicio y espere las llamadas entrantes. Cuando el usuario presione Entrar, cierre el host del servicio. 10. Genere y ejecute la aplicacin de consola. 11. Utilice Internet Explorer para ir a la direccin base del servicio (http://localhost:8001/MetadataSample en este ejemplo) y comprobar que la publicacin de los metadatos est activada. Debera ver una pgina web que dice "Servicio Simple" en la parte superior y, justo debajo, "Ha creado un servicio". Si

MCT: Luis Dueas

Pag 85 de 135

Manual de Windows Communication Foundation


no, un mensaje en la parte superior de la pgina resultante muestra: "La publicacin de metadatos para este servicio est deshabilitad actualmente".

3.3.4. Seguridad de Servicios


La seguridad de un servicio Windows Communication Foundation (WCF) se basa en dos requisitos primarios: la seguridad de la transferencia y la autorizacin. (Un tercer requisito, la auditora de los eventos de seguridad, se describe en Auditora de eventos de seguridad.) Resumiendo, la seguridad de la transferencia incluye la autenticacin (comprobar la identidad del servicio y del cliente), la confidencialidad (cifrado de mensajes) y la integridad (firma digital para detectar la modificacin). La autorizacin es el control del acceso a los recursos, por ejemplo, permitiendo la lectura de un archivo slo a usuarios privilegiados. Con las caractersticas de WCF, se implementan fcilmente los dos requisitos primarios. Excepto la clase BasicHttpBinding (o el elemento <basicHttpBinding> en configuracin), la seguridad de la transferencia est habilitada de forma predeterminada para todos los enlaces predefinidos. Los temas de esta seccin tratan dos escenarios bsicos: la implementacin de la seguridad de la transferencia y la autorizacin en un servicio de la intranet que se hospeda en IIS (Internet Information Services), y la implementacin de la seguridad de la transferencia y la autorizacin en un servicio hospedado en IIS. Nota: Windows XP Home no admite la autenticacin de Windows. Por lo tanto, no debera ejecutar un servicio en ese sistema.

Fundamentos de seguridad
La seguridad se basa en las credenciales. Una credencial demuestra que una entidad es quin notifica ser. (Una entidad puede ser una persona, un proceso de software, una compaa, o cualquier cosa que est autorizada.) Por ejemplo, un cliente de un servicio realiza una notificacin de identidad, y la credencial demuestra esa notificacin de alguna manera. En un escenario tpico, se produce un intercambio de credenciales. Primero, un servicio realiza una notificacin de su identidad y lo prueba ante el cliente con una credencial. A la inversa, el cliente realiza una notificacin de identidad y presenta una credencial al servicio. Si ambas partes confan en las respectivas credenciales, a continuacin, se puede establecer un contexto seguro en el que todos los mensajes se intercambian de manera confidencial, y todos los mensajes estn firmados para proteger su integridad. Una vez que el servicio establece la identidad del cliente, puede hacer coincidir las notificaciones de la credencial con una funcin o la pertenencia de un grupo. En cualquier caso, mediante la funcin o el grupo al que pertenece el cliente, el servicio autoriza al cliente a realizar un conjunto limitado de operaciones basado en los privilegios de la funcin o el grupo.

Mecanismos de seguridad de Windows


Si tanto el cliente como el equipo de servicio pertenecen a un dominio de Windows que exige a ambos el inicio de una sesin en la red, la infraestructura de Windows proporcionar las credenciales. En ese caso, las credenciales se establecen cuando un usuario del equipo inicia sesin en la red. Cada usuario y cada equipo de la red deben validarse como pertenecientes al conjunto seguro de usuarios y equipos. En un sistema de Windows, cada uno de estos usuarios y equipos se conoce tambin como una entidad de seguridad. En un dominio de Windows respaldado por un controlador de Kerberos, ste utiliza un esquema basado en otorgar los vales a cada entidad de seguridad. Los vales que otorga el controlador son de confianza para otros emisores de vales del sistema. Siempre que una entidad intenta realizar alguna operacin o tener acceso a un recurso (como un archivo o directorio en un equipo), se examina la validez del vale y, si se aprueba, se otorga otro vale para la operacin a la entidad de seguridad. Este mtodo de otorgar vales es ms eficaz que la alternativa de intentar validar la entidad de seguridad en cada operacin.

MCT: Luis Dueas

Pag 86 de 135

Manual de Windows Communication Foundation


Un mecanismo anterior y menos seguro que se utiliza en dominios de Windows es NT LAN Manager (NTLM). En casos donde no se puede utilizar Kerberos (normalmente fuera de un dominio de Windows, como en un grupo de trabajo), se puede utilizar NTLM como alternativa. NTLM tambin est disponible como opcin de seguridad para IIS. En un sistema de Windows, la autorizacin funciona asignando cada equipo y usuario a un conjunto de funciones y grupos. Por ejemplo, cada equipo de Windows debe estar configurado y controlado por una persona (o grupo de personas) con la funcin de administrador. Otra funcin es la del usuario, que tiene un conjunto mucho ms restringido de permisos. Adems de a la funcin, los usuarios estn asignados a grupos. Un grupo permite a varios usuarios actuar en la misma funcin. Por lo tanto, en la prctica, un equipo de Windows se administra asignando usuarios a los grupos. Por ejemplo, se pueden asignar varios usuarios al grupo de usuarios de un equipo, y asignar un conjunto mucho ms restringido de usuarios al grupo de administradores. En un equipo local, un administrador tambin puede crear grupos nuevos y asignarle otros usuarios (o incluso otros grupos). En un equipo que ejecuta Windows, puede protegerse cada carpeta de un directorio. Es decir, puede seleccionar una carpeta y controlar quin tiene acceso a los archivos y si pueden o no copiarlos, o (en el caso ms privilegiado) cambiar o eliminar un archivo, o agregar archivos a la carpeta. Esto se conoce como control de acceso, y su mecanismo como la lista de control de acceso (ACL). Al crear la ACL, puede asignar los privilegios de acceso a cualquier grupo o grupos, as como los miembros individuales de un dominio. La infraestructura WCF est diseada para utilizar estos mecanismos de seguridad de Windows. Por lo tanto, si est creando un servicio que se implementa en una intranet, y sus clientes estn restringidos a los miembros del dominio de Windows, la seguridad se implementar fcilmente. Slo los usuarios vlidos pueden iniciar sesin en el dominio. Despus de que los usuarios inicien la sesin, el controlador de Kerberos permite a cada uno de ellos establecer contextos seguros con cualquier otro equipo o aplicacin. En un equipo local, los grupos pueden crearse fcilmente y al proteger carpetas especficas, pueden utilizarse esos grupos para asignar los privilegios de acceso al equipo.

Implementacin de la seguridad de Windows en servicios de la intranet


Para proteger una aplicacin que se ejecuta exclusivamente en un dominio de Windows, puede utilizar la configuracin de seguridad predeterminada de WSHttpBinding, o el enlace NetTcpBinding. De forma predeterminada, cualquier usuario del mismo dominio de Windows puede tener acceso a los servicios WCF. Dado que esos usuarios han iniciado sesin en la red, son de confianza. Los mensajes entre un servicio y un cliente se cifran por motivos de confidencialidad y se firman por razones de integridad. Autorizacin utilizando la clase PrincipalPermissionAttribute Si necesita restringir el acceso de recursos de un equipo, la manera ms sencilla es utilizar la clase PrincipalPermissionAttribute. Este atributo permite restringir la invocacin de operaciones del servicio exigiendo que el usuario pertenezca a un grupo o funcin de Windows especfico, o bien ser un usuario concreto. Suplantacin La suplantacin es otro mecanismo que puede utilizarse para controlar el acceso a los recursos. De forma predeterminada, un servicio hospedado por IIS se ejecutar bajo la identidad de la cuenta ASPNET. La cuenta ASPNET slo puede tener acceso a los recursos para los que tiene permiso. Sin embargo, es posible establecer la ACL para que una carpeta excluya la cuenta de servicio ASPNET, pero permitir que otras identidades tengan acceso a la carpeta. La cuestin entonces es cmo permitir a esos usuarios tener acceso a la carpeta si la cuenta ASPNET no est autorizada a hacerlo. La respuesta es utilizar la suplantacin, con lo que el servicio est autorizado a utilizar las credenciales del cliente para tener acceso a un recurso determinado. Otro ejemplo es el acceso a una base de datos de SQL Server para la que slo ciertos usuarios tienen permiso.

MCT: Luis Dueas

Pag 87 de 135

Manual de Windows Communication Foundation


Seguridad en Internet
La seguridad en Internet se basa en los mismos requisitos que la seguridad en una intranet. Un servicio necesita presentar sus credenciales para demostrar su autenticidad, y los clientes necesitan demostrar su identidad al servicio. Una vez demostrada la identidad de un cliente, el servicio puede controlar qu tipo de acceso a los recursos posee el cliente. No obstante, debido a la naturaleza heterognea de Internet, las credenciales presentadas difieren de las utilizadas en un dominio de Windows. Si bien un controlador de Kerberos administra la autenticacin de usuarios en un dominio mediante vales para las credenciales, en Internet, los servicios y clientes confan en cualquiera de las distintas maneras de presentar credenciales. El objetivo de este tema, sin embargo, es presentar un enfoque comn que le permita crear un servicio WCF accesible a travs de Internet. Utilizacin de IIS y ASP.NET Los requisitos de seguridad de Internet, as como los mecanismos para resolver esos problemas, no son algo nuevo. IIS es el servidor web de Microsoft para Internet y posee muchas caractersticas de seguridad para resolver esos problemas; adems, ASP.NET incluye caractersticas de seguridad que los servicios WCF pueden utilizar. Para beneficiarse de estas caractersticas de seguridad, hospede un servicio WCF en IIS. Utilizacin de la pertenencia a ASP.NET y los proveedores de funciones ASP.NET incluye una pertenencia y un proveedor de funciones. El proveedor es una base de datos de pares de nombre de usuario/contrasea para la autenticacin de autores de llamadas, que tambin permite especificar los privilegios de acceso de cada autor de llamada. Con WCF, puede utilizar fcilmente, a travs de la configuracin, una pertenencia y un proveedor de funciones existente previamente. Credenciales utilizadas por IIS A diferencia de un dominio de Windows respaldado por un controlador de Kerberos, Internet es un entorno sin un nico controlador que administre los millones de usuarios que inician sesin al mismo tiempo. En vez de eso, las credenciales en Internet se encuentran con mayor frecuencia en forma de certificados X.509 (que tambin se conocen como certificados de Capa de sockets seguros, o SSL). Normalmente, estos certificados los emite una entidad de certificacin, que puede ser una compaa de otro fabricante que responde de la autenticidad del certificado y la persona para la que se emiti. Para exponer su servicio en Internet, tambin debe proporcionar este tipo de certificado de confianza como autenticacin de su servicio. La pregunta que surge en este punto es cmo obtener este tipo de certificado? Una solucin es acudir a una entidad de certificacin de otro fabricante, como Authenticode o VeriSign, cuando est en disposicin de implementar el servicio, y adquirir un certificado para el mismo. Sin embargo, si se encuentra en la fase de desarrollo con WCF, y an no est listo para adquirir un certificado, existen herramientas y tcnicas de creacin de certificados X.509 que puede utilizar para simular una implementacin de la produccin.

Modos de seguridad
La programacin de la seguridad de WCF conlleva algunas decisiones crticas. Una de las ms bsica es la eleccin del modo de seguridad. Los dos modos de seguridad principales son el modo de transporte y el modo de mensaje. Un tercer modo, que combina la semntica de los dos modos principales, es el modo de transporte con credenciales de mensaje. El modo de seguridad determina la proteccin de los mensajes, y cada eleccin presenta ventajas y desventajas, como se indica a continuacin. Modo de transporte

MCT: Luis Dueas

Pag 88 de 135

Manual de Windows Communication Foundation


Existen varias capas entre la red y la aplicacin. Uno de ellas es la capa de transporte,que administra la transferencia de mensajes entre los puntos finales. Para el propsito que nos ocupa, slo necesita comprender que WCF utiliza varios protocolos de transporte, cada uno de los cuales puede proteger la transferencia de mensajes. Un protocolo utilizado frecuentemente es HTTP; otro es TCP. Cada uno de estos protocolos puede proteger la transferencia del mensaje mediante un mecanismo (o mecanismos) determinado del protocolo. Por ejemplo, el protocolo HTTP se protege utilizando SSL sobre HTTP, normalmente abreviado como "HTTPS". As, al seleccionar el modo de transporte para la seguridad, est decidiendo utilizar el mecanismo dictado por el protocolo. Por ejemplo, si selecciona la clase WSHttpBinding y establece su modo de seguridad en Transporte, est seleccionando SSL sobre HTTP (HTTPS) como mecanismo de seguridad. La ventaja del modo de transporte es que es ms eficaz que el modo de mensaje ya que la seguridad se integra en un nivel comparativamente bajo. Al utilizar el modo de transporte, el mecanismo de seguridad se debe implementar segn la especificacin para el transporte, de este modo los mensajes pueden fluir de manera segura de un punto a otro del transporte. Modo de mensaje Por el contrario, el modo de mensaje proporciona seguridad incluyendo los datos de seguridad en cada mensaje. Utilizando XML y encabezados de seguridad de SOAP, las credenciales y otros datos necesarios para garantizar la integridad y confidencialidad del mensaje se incluyen en cada mensaje. Cada mensaje incluye los datos de seguridad, lo que afecta negativamente al rendimiento debido a que cada mensaje debe procesarse de manera individual. En el modo de transporte, una vez protegida la capa de transporte, todos los mensajes fluyen libremente. Sin embargo, el modo de seguridad tiene una ventaja sobre la seguridad de transporte: es ms flexible. Es decir, el transporte no determina los requisitos de seguridad. Puede utilizar cualquier tipo de credencial de cliente para proteger el mensaje. En modo de transporte, el protocolo de transporte determina el tipo de credencial de cliente que puede utilizarse. Transporte con credenciales de mensaje El tercer modo combina lo mejor de la seguridad de transporte y de mensaje. En este modo, la seguridad de transporte se utiliza para proteger eficazmente la confidencialidad e integridad de cada mensaje. Al mismo tiempo, cada mensaje incluye sus datos de credencial, lo que permite la autenticacin del mensaje. Con la autenticacin, tambin puede implementarse la autorizacin. Mediante la autenticacin de un remitente, el acceso a los recursos puede otorgarse (o denegarse) conforme a la identidad del remitente.

Especificacin del tipo de credencial de cliente y del valor de credencial


Despus de seleccionar un modo de seguridad, es posible que tambin desee especificar un tipo de credencial de cliente. El tipo de credencial de cliente especifica qu tipo debe utilizar un cliente para autenticarse al servidor. No obstante, no todos los escenarios requieren un tipo de credencial de cliente. Utilizando SSL sobre HTTP (HTTPS), un servicio se autentica al cliente. Como parte de esta autenticacin, se enva el certificado del servicio al cliente en un proceso denominado negociacin. El transporte protegido por SSL garantiza que todos los mensajes son confidenciales. Si est creando un servicio que requiere la autenticacin del cliente, la eleccin de un tipo de credencial de cliente depende del transporte y el modo seleccionados. Por ejemplo, si utiliza el transporte HTTP y opta por el modo de transporte, podr elegir entre varias opciones, como Bsica, Implcita, y otras.

MCT: Luis Dueas

Pag 89 de 135

Manual de Windows Communication Foundation


Si crea un servicio en un dominio de Windows que slo estar disponible para otros usuarios de la red, el ms fcil de utilizar es el tipo de credencial de cliente de Windows. Sin embargo, tambin puede que tenga que proporcionar un certificado al servicio. Valores de credencial Un valor de credencial es la credencial real utilizada por el servicio. Cuando se especifica un tipo de credencial, tambin puede ser necesario configurar el servicio con las credenciales reales. Si se selecciona Windows (y el servicio se ejecutar en un dominio de Windows), no ser necesario especificar un valor de credencial real.

Identidad
En WCF, el trmino identidad tiene significados diferentes para el servidor y para el cliente. Resumiendo, al ejecutar un servicio, se asigna una identidad al contexto de seguridad despus de la autenticacin. Para ver la identidad real, compruebe las propiedades WindowsIdentity y PrimaryIdentity de la clase ServiceSecurityContext. Por el contrario, en el cliente, la identidad se utiliza para validar el servicio. Durante el diseo, un programador del cliente puede establecer el elemento <identity> en un valor obtenido del servicio. Durante la ejecucin, el cliente contrasta el valor del elemento con la identidad real del servicio. Si se produce un error en la comprobacin, el cliente finaliza la comunicacin. El valor puede ser un nombre principal del usuario (UPN), si el servicio se ejecuta bajo la identidad de un usuario determinado, o un nombre principal de servicio (SPN) si el servicio se ejecuta bajo una cuenta de equipo. La credencial tambin puede ser un certificado, o un campo de un certificado que identifica a ste ltimo.

Niveles de proteccin
La propiedad ProtectionLevel se encuentra en varias clases de atributo (como las clases ServiceContract Attribute y OperationContractAttribute ). El nivel de proteccin es un valor que especifica si los mensajes (o partes del mensaje) compatibles con un servicio se firman, se firman y cifran, o bien se envan sin firmas ni cifrado.

3.3.4.1. Cmo: Proteger un Servicio con Credenciales de Windows


En este tema se muestra cmo habilitar la seguridad de transferencia en un servicio Windows Communication Foundation (WCF) que reside en un dominio de Windows y al que llaman los clientes del mismo dominio. En este tema se parte del supuesto de que ya tiene definidas una interfaz e implementacin de contrato. Tambin puede modificar un servicio y cliente existentes. Puede proteger completamente un servicio con credenciales de Windows en el cdigo. Alternativamente, puede omitir una parte del cdigo mediante un archivo de configuracin. En este tema se explican ambos mtodos. Asegrese de que sigue solamente uno de ellos. Los tres primeros procedimientos muestran cmo proteger el servicio en el cdigo. En el cuarto y quinto procedimientos se muestra cmo hacerlo con un archivo de configuracin.

Mediante cdigo
El primer procedimiento le gua en la creacin y configuracin de una clase WSHttpBinding en el cdigo. El enlace usa el transporte HTTP. El mismo enlace se usa en el cliente. Para crear un WSHttpBinding que utiliza credenciales de Windows y seguridad de mensaje 1. El cdigo de este procedimiento se encuentra insertado al principio del mtodo Run de la clase Test en el cdigo del servicio, en la seccin Ejemplo. 2. Cree una instancia de la clase WSHttpBinding.

MCT: Luis Dueas

Pag 90 de 135

Manual de Windows Communication Foundation


3. 4. Establezca la propiedad Mode de la clase WsHttpSecurity en Message. Establezca la propiedad ClientCredentialType de la clase MessageSecurityOverHttp en Windows.

Utilizar el enlace en un servicio ste es el segundo procedimiento, que muestra cmo usar el enlace en un servicio autohospedado. Utilizar un enlace en un servicio 1. 2. Inserte el cdigo de este procedimiento despus del cdigo del procedimiento anterior. Cree una variable TypecontractType con nombre y asgnele el tipo de la interfaz (ICalculator). Cuando utilice Visual Basic, utilice al operador GetType; cuando utilice C#, utilice la palabra clave typeof. 3. Cree una segunda variable TypeserviceType con nombre y asgnele el tipo del contrato implementado (Calculator). 4. Cree una instancia de la clase Uri denominada baseAddress con la direccin base del servicio. La direccin base debe tener un esquema que coincida con el transporte. En este caso, el esquema de transporte es HTTP y la direccin incluye el identificador uniforme de recursos (URI) especial "localhost" y un nmero de puerto (8036) as como una direccin de extremo base ("serviceModelSamples/): http://localhost:8036/serviceModelSamples/. 5. 6. Cree una instancia de la clase ServiceHost con serviceType y variables baseAddress. Agregue un extremo al servicio incluyendo contractType, el enlace y el nombre del extremo ("secureCalculator"). Un cliente debe concatenar la direccin base y el nombre de extremo al iniciar una llamada al servicio. 7. Llame al mtodo Open para iniciar el servicio. El cdigo de este procedimiento se muestra aqu:

Utilizar el enlace en un cliente Este procedimiento muestra cmo generar un proxy que se comunica con el servicio. El proxy se genera con la ServiceModel Metadata Utility Tool (Svcutil.exe), que usa los metadatos del servicio para crear el proxy. En este procedimiento tambin se crea una instancia de la clase WSHttpBinding para comunicarse con el servicio y, a continuacin, se llama al servicio. Este ejemplo slo utiliza cdigo para crear el cliente. Como alternativa, puede utilizar un archivo de configuracin, que se muestra en la seccin que sigue a este procedimiento. Para usar un enlace en un cliente con el cdigo 1. Use la herramienta SvcUtil.exe para generar el cdigo del proxy a partir de los metadatos del servicio. El cdigo de proxy generado hereda de la clase ClientBase, lo cual garantiza que cada cliente tenga los constructores, mtodos y propiedades necesarios para comunicarse con un servicio WCF. En este ejemplo, el cdigo generado incluye la clase CalculatorClient, que implementa la interfaz ICalculator, habilitando la compatibilidad con el cdigo del servicio. 2. El cdigo de este procedimiento se encuentra insertado al principio del mtodo Main del programa cliente. 3. Cree una instancia de la clase WSHttpBinding y establezca su modo de seguridad en Message y su tipo de credencial de cliente en Windows. El ejemplo denomina el clientBindingvariable. 4. Cree una instancia de la clase EndpointAddress denominada serviceAddress. Inicialice la instancia con la direccin base concatenada con el nombre de extremo. 5. 6. 7. Cree una instancia de la clase de cliente generada con serviceAddress y las variables clientBinding. Llame el mtodo Open, como se indica el siguiente cdigo. Llame al servicio y muestre los resultados.

Usar el archivo de configuracin

MCT: Luis Dueas

Pag 91 de 135

Manual de Windows Communication Foundation


En lugar de crear el enlace con cdigo de procedimiento, puede usar el cdigo siguiente, que se muestra para la seccin de enlaces del archivo de configuracin. Nota Este cdigo de configuracin se usa tanto en el archivo de configuracin del servicio como del cliente.

Habilitar la seguridad de la transferencia en un servicio en un dominio de Windows utilizando la configuracin 1. Agregue un elemento <wsHttpBinding> a la seccin del elemento <bindings> del archivo de configuracin. 2. Agregue un elemento <binding> al elemento <WSHttpBinding> y establezca el atributo configurationName en un valor apropiado a su aplicacin. 3. 4. 5. Agregue un elemento <security> y establezca el atributo mode en Message. Agregue un elemento <message> y establezca el atributo clientCredentialType en Windows. En el archivo de configuracin del servicio, reemplace la seccin <bindings> con el cdigo siguiente. <bindings> <wsHttpBinding> <binding name = "wsHttpBinding_Calculator"> <security mode="Message"> <message clientCredentialType="Windows"/> </security> </binding> </wsHttpBinding> </bindings>

Utilizar el enlace en un cliente En este procedimiento se muestra cmo generar dos archivos: un proxy que se comunica con el servicio y un archivo de configuracin. Tambin se describen los cambios en el programa cliente, que es el tercer archivo utilizado en el cliente. Para usar un enlace en un cliente mediante configuracin 1. Use la herramienta SvcUtil.exe para generar el cdigo proxy y el archivo de configuracin a partir de los metadatos del servicio. 2. Reemplace la seccin <Bindings> del archivo de configuracin generado con el cdigo de configuracin de la seccin anterior. 3. 4. El cdigo de procedimiento se encuentra insertado al principio del mtodo Main del programa cliente. Cree una instancia de la clase de cliente generada, pasando el nombre del enlace en el archivo de configuracin como parmetro de entrada. 5. 6. Llame al mtodo Open, como se muestra en el siguiente cdigo. Llame al servicio y muestre los resultados.

3.3.4.2. Cmo: Establecer el Modo de Seguridad


La seguridad de Windows Communication Foundation (WCF) tiene tres modos de seguridad comunes que se encuentran en la mayora de los enlaces predefinidos: transporte, mensaje y transporte con credencial del mensaje. Dos modos adicionales son especficos para dos enlaces: el modo slo credencial de transporte encontrado en el BasicHttpBindingy el modo Ambos encontrado en el NetMsmqBinding. Sin embargo, este tema se concentra en los tres modos de seguridad comunes: Transport, Message y TransportWithMessage Credential. Tenga en cuenta que no todos los enlaces predefinidos admiten todos estos modos. Este tema establece el modo con las clases WSHttpBinding y NetTcpBinding y muestra cmo establecer el modo mediante programacin y configuracin.

MCT: Luis Dueas

Pag 92 de 135

Manual de Windows Communication Foundation


Para establecer el modo de seguridad en cdigo
1. Cree una instancia de la clase del enlace que est utilizando. En el siguiente ejemplo se crea una instancia de la clase WSHttpBinding. 2. Establezca la propiedad Mode del objeto devuelto por la propiedad Security. De manera alternativa, establezca el modo en mensaje, como se muestra en el cdigo siguiente. O establezca el modo en transporte con credenciales de mensaje, como se muestra en el cdigo siguiente. 3. Tambin puede establecer el modo en el constructor del enlace, como se muestra en el cdigo siguiente.

Establecimiento de la propiedad la propiedad ClientCredentialType


El establecimiento del modo en uno de los tres valores determina cmo establece la propiedad ClientCredentialType. Por ejemplo, el uso de la clase WSHttpBinding, estableciendo el modo en Transport implica que debe establecer la propiedad ClientCredentialType de la clase HttpTransportSecurity en un valor adecuado. Para establecer la propiedad ClientCredentialType para el modo de transporte 1. 2. 3. Cree una instancia del enlace. Establezca la propiedad Mode en Transport. Establezca la propiedad ClientCredential en un valor apropiado. El siguiente cdigo establece la propiedad en Windows: Para establecer la propiedad ClientCredentialType para el modo de mensaje 1. 2. 3. Cree una instancia del enlace. Establezca la propiedad Mode en Message. Establezca la propiedad ClientCredential en un valor apropiado. El siguiente cdigo establece la propiedad en Certificate: Para establecer el Modo y la propiedad ClientCredentialType en configuracin 1. Agregue un elemento de enlace apropiado al elemento <bindings> del archivo de configuracin. El siguiente ejemplo agrega un elemento <wsHttpBinding>. 2. 3. Agregue un elemento <binding> y defina su atributo name en un valor adecuado. Agregue un elemento <security> y establezca el atributo mode en Message, Transport o TransportWithMessageCredential. 4. Si se establece el modo en Transport, agregue un elemento <transport> y establezca el atributo clientCredential en un valor apropiado. El siguiente ejemplo establece el modo en Transport", y, a continuacin, establece el atributo clientCredentialType del <transport> en Windows". <wsHttpBinding> <binding name="TransportSecurity"> <security mode="Transport" /> <transport clientCredentialType = "Windows" /> </security> </binding> </wsHttpBinding > De manera alternativa, establezca el security mode en "Message", seguido por un elemento <"message">. Este ejemplo establece el clientCredentialType en "Certificate". <wsHttpBinding> <binding name="MessageSecurity"> <security mode="Message" /> <message clientCredentialType = "Certificate" /> </security> </binding>

MCT: Luis Dueas

Pag 93 de 135

Manual de Windows Communication Foundation


</wsHttpBinding > Utilizar el valor TransportWithMessageCredential es un caso especial y se explica ms adelante. Uso de TransportWithMessageCredential Al establecer el modo de seguridad en TransportWithMessageCredential, el transporte determina el mecanismo real que proporciona la seguridad de nivel de transporte. Por ejemplo, el protocolo HTTP utiliza Secure Sockets Layer (SSL) sobre HTTP (HTTPS). Por consiguiente, se omite el establecimiento de la propiedad ClientCredentialType de cualquier objeto de seguridad de transporte (como HttpTransportSecurity). En otras palabras, slo puede establecer el ClientCredentialType del objeto de seguridad del mensaje (para el enlace WSHttpBinding, el objeto NonDualMessageSecurityOverHttp).

3.3.4.3. Cmo: Especificar el Tipo de Credencial de Cliente


Despus de establecer un modo de seguridad (ya sea transporte o mensaje), tiene la opcin de establecer el tipo de credencial de cliente. Esta propiedad especifica qu tipo de credencial debe proporcionar el cliente al servicio para su autenticacin.

Para establecer el tipo de credencial de cliente en el cdigo


1. Cree una instancia del enlace que el servicio va a usar. En el ejemplo siguiente se utiliza el enlace WSHttpBinding. 2. 3. Establezca la propiedad Mode en un valor adecuado. Este ejemplo utiliza el modo de mensaje. Establezca la propiedad ClientCredentialType en un valor apropiado. Este ejemplo establece el uso de la autenticacin de Windows (Windows).

Para establecer el tipo de credencial en la configuracin


1. 2. 3. 4. Agregue un elemento <system.ServiceModel> al archivo de configuracin. Como elemento secundario, aada un elemento <bindings>. Agregue un enlace adecuado. En el ejemplo siguiente se utiliza el elemento <wsHttpBinding>. Agregue un elemento <binding> y establezca el atributo name en un valor adecuado. Este ejemplo utiliza el nombre "SecureBinding". 5. Agregue un enlace <security>. Establezca el atributo mode en un valor adecuado. Este ejemplo lo define en "Message". 6. Agregue un elemento <message> o <transport>, tal y como se haya determinado en el modo de seguridad. Establezca el atributo clientCredentialType en un valor adecuado. Este ejemplo utiliza "Windows". <system.serviceModel> <bindings> <wsHttpBinding> <binding name="SecureBinding"> <security mode="Message"> <message clientCredentialType="Windows" /> </security> </binding> </wsHttpBinding> </bindings> </system.serviceModel>

3.3.4.4. Cmo Restringir el Acceso con la Clase PrincipalPermissionAttribute


Controlar el acceso a los recursos en un equipo del dominio de Windows es una tarea de seguridad bsica. Por ejemplo, slo ciertos usuarios deberan poder ver los datos confidenciales, como la informacin de la nmina. Este tema explica cmo restringir el acceso a un mtodo exigiendo que el usuario pertenezca a un grupo predefinido.

MCT: Luis Dueas

Pag 94 de 135

Manual de Windows Communication Foundation


La tarea est compuesta de dos procedimientos independientes. El primero crea el grupo y lo rellena con usuarios. El segundo aplica la clase PrincipalPermissionAttribute para especificar el grupo.

Para crear un grupo de Windows


1. 2. 3. 4. 5. 6. 7. Abra la consola Administracin del equipo. En el panel izquierdo, haga clic en Usuarios y grupos locales. Haga clic con el botn secundario en Gruposy haga clic en Nuevo grupo. En la casilla Nombre de grupo, escriba un nombre para el nuevo grupo. En la casilla Descripcin, escriba una descripcin del nuevo grupo. Para agregar nuevos miembros al grupo, haga clic en Agregar. Si se ha agregado al grupo y desea probar el cdigo siguiente, debe cerrar la sesin en el equipo y volver a iniciarla para estar incluido en el grupo.

Para exigir la pertenencia del usuario


1. Abra el archivo de cdigo de Windows Communication Foundation (WCF) que contiene el cdigo del contrato de servicio implementado. 2. Aplique el atributo PrincipalPermissionAttribute a cada mtodo que debe estar restringido a un grupo concreto. Establezca la propiedad Action en Demand y la propiedad Role en el nombre del grupo. Por ejemplo: Nota: Si se aplica el atributo a un contrato PrincipalPermissionAttribute, SecurityException. El atributo slo puede aplicarse en el nivel del mtodo. se iniciar una

Uso de un certificado para controlar el acceso a un mtodo


Tambin puede utilizar la clase PrincipalPermissionAttribute para controlar el acceso a un mtodo si el tipo de credencial de cliente es un certificado. Para hacerlo, debe tener el asunto y la huella digital del certificado. Para controlar el acceso mediante un certificado 1. 2. 3. Aplique la clase PrincipalPermissionAttribute al mtodo al que desea restringir el acceso. Establezca la accin del atributo en System.Security.Permissions.SecurityAction.Demand. Establezca la propiedad Name en una cadena que est compuesta del nombre del sujeto y la huella digital del certificado. Separe los dos valores con un punto y coma y un espacio, como se muestra en el ejemplo siguiente: 4. Establezca la propiedad PrincipalPermissionMode en UseAspNetRoles como se muestra en el siguiente ejemplo de configuracin: <behaviors> <serviceBehaviors> <behavior name="SvcBehavior1"> <serviceAuthorization principalPermissionMode="UseAspNetRoles" /> </behavior> </serviceBehaviors> </behaviors> Establecer este valor en UseAspNetRoles indica que la propiedad Name del PrincipalPermission Attribute se utilizar para realizar una comparacin de cadenas. Cuando se utiliza un certificado como una credencial del cliente, WCF concatena de forma predeterminada el nombre comn del certificado y la huella digital con un punto y coma para crear un valor nico para la identidad primaria del cliente. Con UseAspNetRoles establecido como PrincipalPermissionMode en el servicio, este valor de identidad primaria se compara con el valor de la propiedad Name para determinar los derechos de acceso del usuario.

MCT: Luis Dueas

Pag 95 de 135

Manual de Windows Communication Foundation

3.3.4.5. Cmo Suplantar a un Cliente en un Servicio


Suplantar un cliente en un servicio de Windows Communication Foundation (WCF) permite al servicio realizar acciones en nombre del cliente. Para las acciones sujetas a las comprobaciones de la lista de control de acceso (ACL), como el acceso a los directorios y archivos de un equipo o el acceso a una base de datos de SQL Server, ACL realiza una comprobacin frente a la cuenta de usuario del cliente. Este tema muestra los pasos bsicos requeridos para permitir a un cliente de un dominio de Windows establecer un nivel de la suplantacin del cliente. Nota: Cuando el cliente y el servicio se estn ejecutando en el mismo equipo y el cliente se est ejecutando bajo una cuenta del sistema (por ejemplo, Local System o Network Service), no se puede suplantar el cliente cuando se establece una sesin segura con tokens de contexto de seguridad con estado. Un WinForms o una aplicacin de consola se ejecuta normalmente con la cuenta con la que haya iniciado la sesin, de manera que la cuenta pueda suplantarse de manera predeterminada. No obstante, cuando el cliente es una pgina ASP.NET que se hospeda en IIS 6.0 o ISS 7.0, el cliente se ejecuta, de manera predeterminada, en la cuenta Network Service. Todos los enlaces proporcionados por el sistema que admiten sesiones seguras utilizan de forma predeterminada un token de contexto de seguridad sin estado. Sin embargo, si el cliente es una pgina ASP.NET y las sesiones seguras con tokens de seguridad de contexto se utilizan, no se puede suplantar el cliente.

Para habilitar la suplantacin de un cliente desde un token de Windows almacenado en memoria cach en un servicio
1. 2. Cree el servicio. Utilice un enlace que use autenticacin de Windows y cree una sesin, como NetTcpBinding o WSHttpBinding. 3. Al crear la implementacin de la interfaz del servicio, aplique la clase OperationBehaviorAttribute al mtodo que requiere la suplantacin del cliente. Establezca la propiedad Impersonation en Required.

Para establecer el nivel de suplantacin permitido en el cliente


1. 2. Cree el cdigo de cliente del servicio utilizando ServiceModel Metadata Utility Tool (Svcutil.exe). Despus de crear el cliente WCF, establezca la propiedad AllowedImpersonationLevel de la clase WindowsClientCredential en uno de los valores de enumeracin TokenImpersonationLevel. Nota: Para usar Delegation, la autenticacin de Kerberos negociada (a veces conocida como Kerberos multibifurcacin o multipaso) se ha de usar.

3.3.4.6. Cmo: Examinar el Contexto de Seguridad


Al programar servicios Windows Communication Foundation (WCF), el contexto de seguridad de servicio le permite determinar los detalles sobre las demandas y credenciales del cliente y utilizadas para autenticarse con el servicio. Esto se hace utilizando las propiedades de la clase ServiceSecurityContext. Por ejemplo, puede recuperar la identidad del cliente actual utilizando la propiedad PrimaryIdentity o WindowsIdentity. Para determinar si el cliente es annimo, utilice la propiedad IsAnonymous. Tambin puede determinar qu demandas se estn realizando en nombre del cliente recorriendo en iteraciones la coleccin de demandas en la propiedad AuthorizationContext.

Obtencin del contexto de seguridad actual


Tenga acceso a la propiedad esttica Current para obtener el contexto de seguridad actual. Examine cualquiera de las propiedades del contexto actual de la referencia.

Determinacin de la identidad del llamador

MCT: Luis Dueas

Pag 96 de 135

Manual de Windows Communication Foundation


1. Imprima el valor de las propiedades PrimaryIdentity y WindowsIdentity.

Anlisis de las demandas de un llamador


1. Devuelva la clase AuthorizationContext actual. Utilice la propiedad Current para devolver el contexto de seguridad de servicio actual, a continuacin, devuelva el AuthorizationContext mediante la propiedad AuthorizationContext. 2. Analice la coleccin de objetos de vueltos de ClaimSet mediante la propiedad ClaimSets de la clase AuthorizationContext.

3.3.4.7. Descripcin de los Niveles de Proteccin


La propiedad ProtectionLevel se encuentra en muchas clases diferentes, como las clases ServiceContractAttribute y OperationContractAttribute. La propiedad controla cmo se protege una parte de un mensaje (o todo entero). En este tema se explica la caracterstica Windows Communication Foundation (WCF) y cmo funciona. Nota: Los niveles de proteccin slo se pueden establecer en el cdigo, no en la configuracin.

Fundamentos
Para entender la caracterstica de nivel de proteccin, se aplican las instrucciones bsicas siguientes: Existen tres niveles bsicos de proteccin para cualquier parte de un mensaje. La propiedad (dondequiera que se produzca) est establecida como uno de los valores de enumeracin de ProtectionLevel. En orden ascendente de proteccin, incluyen: None. Sign. La parte protegida est firmada digitalmente. De esta manera se garantiza la deteccin de cualquier modificacin en la parte protegida del mensaje. EncryptAndSign. La parte del mensaje se cifra para garantizar la confidencialidad antes de firmarse. Slo puede establecer los requisitos de proteccin para los datos de la aplicacin con esta caracterstica. Por ejemplo, los encabezados de WS-Addressing son los datos de la infraestructura y, por consiguiente, no se vern afectados por ProtectionLevel. Cuando el modo de seguridad est establecido como Transport, el mecanismo de transporte protege el mensaje completo. Por consiguiente, establecer un nivel de proteccin independiente para las distintas partes de un mensaje no tendr ningn efecto. ProtectionLevel es una manera para que el programador establezca el nivel mnimo que un enlace debe cumplir. Cuando se implementa un servicio, el enlace real especificado en la configuracin puede admitir o no el nivel mnimo. Por ejemplo, de forma predeterminada, la clase BasicHttpBinding no proporciona seguridad (aunque puede estar habilitada). Por consiguiente, utilizarlo con un contrato que tiene un valor distinto de None producir una excepcin. Si el servicio requiere que el valor mnimo de ProtectionLevel para todos los mensajes sea Sign, un cliente (quizs creado por una tecnologa que no sea de WCF ) puede cifrar y firmar todos los mensajes (que es ms que el mnimo requerido). En este caso, WCF no producir una excepcin porque el cliente ha hecho ms que el mnimo. Tenga en cuenta, sin embargo, que las aplicaciones WCF (servicios o clientes) no sobreprotegern una parte del mensaje si es posible, sino que cumplirn con el nivel mnimo. Adems, tenga en cuenta que al utilizar Transport como modo de seguridad, el transporte puede sobreproteger la secuencia de mensajes porque no puede proteger en un nivel ms especfico. Si establece ProtectionLevel como Sign o EncryptAndSign, deber usar un enlace con la seguridad habilitada o se producir una excepcin. Si selecciona un enlace que habilita la seguridad y no establece la propiedad ProtectionLevel en cualquier parte del contrato, se cifrarn y firmarn todos los datos de la aplicacin.

MCT: Luis Dueas

Pag 97 de 135

Manual de Windows Communication Foundation


Si selecciona un enlace que no tiene la seguridad habilitada (por ejemplo, la clase BasicHttpBinding tiene la seguridad deshabilitada de forma predeterminada) y no se establece ProtectionLevel explcitamente, no se proteger ninguno de los datos de la aplicacin. Si est utilizando un enlace que aplica la seguridad en el nivel de transporte, todos los datos de la aplicacin se protegern segn las capacidades del transporte. Si utiliza un enlace que aplica la seguridad en el nivel de mensaje, a continuacin, los datos de la aplicacin se protegern segn los niveles de proteccin establecidos en el contrato. Si no especifica un nivel de proteccin, a continuacin, se cifrarn y firmarn todos los datos de la aplicacin en los mensajes. Se puede establecer ProtectionLevel en distintos niveles de mbito. Hay una jerarqua asociada con el mbito, que se explicar en la seccin siguiente.

mbito
Establecer ProtectionLevel en la API de nivel superior define el nivel para todos los niveles debajo de ella. Si ProtectionLevel est establecido con un valor diferente en un nivel ms bajo, todas las API debajo de ese nivel en la jerarqua se restablecern ahora en el nuevo nivel (sin embargo, las API por encima de l se seguirn viendo afectadas por el nivel superior). La jerarqua es la siguiente. Los atributos en el mismo nivel son del mismo nivel. ServiceContractAttribute OperationContractAttribute FaultContractAttribute MessageContractAttribute MessageHeaderAttribute MessageBodyMemberAttribute

Programacin de ProtectionLevel
Para programar ProtectionLevel en cualquier punto de la jerarqua, basta con establecer la propiedad con un valor adecuado cuando se aplique el atributo. Nota: Establecer la propiedad en errores y contratos de mensaje exige conocer cmo funcionan esas caractersticas.

Dependencia de WS-Addressing
En la mayora de los casos, usar ServiceModel Metadata Utility Tool (Svcutil.exe) para generar un cliente garantiza que los contratos del cliente y de servicios son idnticos. Sin embargo, los contratos aparentemente idnticos pueden hacer que el cliente produzca una excepcin. Esto ocurre siempre que un enlace no admita la especificacin de WS-Addressing y se especifiquen varios niveles de proteccin en el contrato. Por ejemplo, la clase BasicHttpBinding no admite la especificacin o si crea un enlace personalizado que no admite WSAddressing. La caracterstica ProtectionLevel confa en la especificacin de WS-Addressing para habilitar los niveles de proteccin diferentes en un contrato nico. Si el enlace no admite la especificacin de WSAddressing, todos los niveles estarn establecidos en el mismo nivel de proteccin. El nivel de proteccin eficaz para todos los mbitos del contrato estar establecido en el nivel de proteccin ms alto utilizado en el contrato. Esto puede producir un problema que ser difcil depurar a primera vista. Es posible crear un contrato de cliente (una interfaz) que incluya los mtodos para ms de un servicio. Es decir, la misma interfaz se utiliza para crear un cliente que comunica con muchos servicios y la interfaz contiene los mtodos para todos los servicios. El desarrollador debe tener cuidado en este escenario atpico para invocar slo aquellos mtodos que son aplicables para cada servicio determinado. Si el enlace es la clase BasicHttpBinding, no se pueden admitir varios niveles de proteccin. Sin embargo, un servicio que responde al cliente podra responder a un cliente con un nivel de proteccin ms bajo que el necesario. En este caso, el cliente producir una excepcin porque espera un nivel ms alto.

MCT: Luis Dueas

Pag 98 de 135

Manual de Windows Communication Foundation


El siguiente ejemplo del cdigo muestra este problema. El ejemplo siguiente muestra un contrato de servicio y uno de cliente. Suponga que el enlace es el elemento <basicHttpBinding>. Por consiguiente, todas las operaciones en un contrato tienen el mismo nivel de proteccin. Este nivel de proteccin uniforme se determina como el nivel de proteccin mximo en todas las operaciones. El contrato de servicios es: En el siguiente ejemplo de cdigo se muestra una interfaz de contrato de cliente. Observe que incluye un mtodo Tax que se utilizar con un servicio diferente: Cuando el cliente llama al mtodo Price, produce una excepcin cuando recibe una respuesta del servicio. Esto se produce porque el cliente no especifica un ProtectionLevel en ServiceContractAttribute y, por consiguiente, el cliente utiliza el valor predeterminado (EncryptAndSign) para todos los mtodos, incluido el mtodo Price. Sin embargo, el servicio devuelve el valor mediante el nivel Sign porque el contrato de servicios define un mtodo nico que tiene el nivel de proteccin definido en Sign. En este caso, se producir un error en el cliente al validar la respuesta del servicio.

3.3.4.8. Cmo: Establecer la Propiedad ProtectionLevel


Puede establecer el nivel de proteccin aplicando un atributo adecuado y estableciendo la propiedad. Puede establecer la proteccin en el nivel del servicio para que afecte a todas las partes de cada mensaje o puede establecer la proteccin en los niveles cada vez ms individuales, desde los mtodos a las partes del mensaje. Nota: Puede establecer niveles de proteccin slo mediante cdigo, no mediante configuracin.

Para firmar todos los mensajes para un servicio


1. 2. Cree una interfaz para el servicio. Aplique el atributo ServiceContractAttribute al servicio y establezca la propiedad ProtectionLevel en Sign, como se muestra en el cdigo siguiente (el nivel predeterminado es EncryptAndSign).

Para firmar todas las partes del mensaje para una operacin
1. 2. 3. Cree una interfaz para el servicio y aplique el atributo ServiceContractAttribute a la interfaz. Agregue una declaracin de mtodo a la interfaz. Aplique el atributo OperationContractAttribute al mtodo, y establezca la propiedad ProtectionLevel en Sign, como se muestra en el siguiente cdigo.

Proteccin de mensajes de error


Las excepciones que se producen en un servicio se pueden enviar a un cliente como errores de SOAP. Para proteger un mensaje de error 1. Cree un tipo que represente el mensaje de error. El ejemplo siguiente crea una clase denominada MathFault con dos campos. 2. Aplique el atributo DataContractAttribute al tipo y un atributo DataMemberAttribute a cada campo que se debera serializar, como se muestra en el cdigo siguiente. 3. En la interfaz que devolver el error, aplique el atributo FaultContractAttribute al mtodo que devolver el error y establezca el parmetro detailType en el tipo de la clase de error. 4. Tambin en el constructor, establezca la propiedad ProtectionLevel en EncryptAndSign, como se muestra en el cdigo siguiente.

Proteccin de las partes del mensaje


Utilice un contrato del mensaje para proteger partes de un mensaje. Para proteger el cuerpo de un mensaje

MCT: Luis Dueas

Pag 99 de 135

Manual de Windows Communication Foundation


1. Cree un tipo que representa al mensaje. El siguiente ejemplo crea una clase Company con dos campos, CompanyName y CompanyID. 2. Aplique el atributo MessageContractAttribute a la clase y establezca la propiedad ProtectionLevel en EncryptAndSign. 3. Aplique el atributo MessageHeaderAttribute a un campo que se expresar como un encabezado de mensaje y establezca la propiedad ProtectionLevel en EncryptAndSign. 4. Aplique el MessageBodyMemberAttribute a cualquier campo que se expresar como parte del mensaje y establezca la propiedad ProtectionLevel en EncryptAndSign, como se muestra en el siguiente ejemplo.

3.3.5. Creacin de Servicios Interoperables de WS-I Basic Profile 1.1


Para configurar un extremo del servicio WCF para ser interoperable con clientes de servicios Web ASP.NET: Utilice el tipo System.ServiceModel.BasicHttpBinding como tipo de enlace para su extremo de servicio. No utilice devolucin de llamada sino caractersticas de contrato de sesin o comportamientos de transaccin en su extremo de servicio Puede habilitar opcionalmente el soporte para HTTPS y la autenticacin del cliente del nivel de transporte en el enlace. Las caractersticas siguientes de la clase BasicHttpBinding requieren la funcionalidad ms all de WS-I Basic Profile 1.1: Codificacin de mensajes del Mecanismo de optimizacin de transmisin del mensajes (MTOM) controlada por la propiedad System.ServiceModel.BasicHttpBinding.MessageEncoding. Deje esta propiedad en su valor predeterminado, que es System.ServiceModel.WSMessageEncoding.Text para no utilizar MTOM. La seguridad de mensaje que controla el valor System.ServiceModel.BasicHttpBinding.Security proporciona compatibilidad con WS-Security en conformidad con WS-I Basic Security Profile 1.0. Deje este propiedad en su valor predeterminado, que es System.ServiceModel.SecurityMode.Transport para no usar WS-Security. Para que los metadatos para un servicio WCF estn disponibles para ASP.NET, utilice las herramientas de cliente de servicio Web: Web Services Description Language Tool (Wsdl.exe), Web Services Discovery Tool (Disco.exe), y la caracterstica Add Web Reference en Visual Studio; debe habilitar la publicacin de metadatos.

3.3.6. Administracin y Diagnstico


Windows Communication Foundation (WCF) proporciona un conjunto enriquecido de funcionalidades que pueden ayudarle a supervisar las diferentes fases de la vida de una aplicacin. Por ejemplo, puede utilizar la configuracin para configurar servicios y clientes en la implementacin. WCF incluye un conjunto grande de contadores de rendimiento para ayudarle a calibrar el rendimiento de su aplicacin. WCF tambin expone datos de inspeccin de un servicio en tiempo de ejecucin a travs de un proveedor de Instrumentacin de administracin de Windows (WMI) de WCF. Cuando la aplicacin experimenta un error o comienza a actuar incorrectamente, puede utilizar el Registro de eventos para ver si algo significativo ha sucedido. Tambin puede utilizar el registro y seguimiento de mensajes para ver qu eventos estn pasando de un extremo a otro en su aplicacin. Estas caractersticas ayudan a los programadores y a profesionales de TI a solucionar problemas de una aplicacin de WCF cuando estas no se comportan correctamente. Nota: Si recibe errores sin informacin detallada especfica, debe habilitar el atributo includeExceptionDetailInFaults del elemento de configuracin <serviceDebug>. De este modo se indica a WCF que enve detalles de la excepcin a los clientes, lo que permite detectar muchos problemas habituales sin tener que realizar un diagnstico ms avanzado.

MCT: Luis Dueas

Pag 100 de 135

Manual de Windows Communication Foundation


Caractersticas de diagnstico proporcionadas por WCF
WCF proporciona las siguientes funcionalidades de diagnosis: El seguimiento de extremo a extremo proporciona los datos de instrumentacin para solucionar los problemas de una aplicacin sin utilizar un depurador. WCF genera los seguimientos de los hitos del proceso, as como mensajes de error. Esto puede incluir abrir un generador de canales o el envo y recepcin de mensajes por parte un host de servicio. Se puede habilitar el seguimiento para una aplicacin en ejecucin para supervisar su progreso. El registro de mensajes le permite ver el aspecto de los mensajes antes y despus de la transmisin. Para obtener ms informacin, consulte el tema Registro de mensajes. El seguimiento de eventos escribe los eventos en el Registro de eventos para poder ver cualquier problema importante. Puede utilizar a continuacin el Visor de eventos para examinar cualquier anormalidad. Los contadores de rendimiento expuestos a travs del Monitor de rendimiento le permiten supervisar el estado de su aplicacin y del sistema. El espacio de nombres System.ServiceModel.Configuration le permite cargar archivos de configuracin y establecer un extremo de servicio o cliente. Puede utilizar el modelo de objetos para crear scripts con cambios para muchas aplicaciones cuando se deben implementar actualizaciones en muchos equipos. De manera alternativa, puede utilizar Configuration Editor para modificar la configuracin mediante un asistente GUI. WMI le permite averiguar qu servicios est realizando escuchas en un equipo y los enlaces que se estn usando. WCF tambin proporciona varias herramientas de lnea de comandos y GUI para facilitar la creacin, implementacin y administracin de aplicaciones de WCF. Por ejemplo, puede utilizar Service Configuration Editor Tool para crear y modificar la configuracin de WCF mediante un asistente, en lugar de editar XML directamente. Tambin puede utilizar Service Trace Viewer Tool (SvcTraceViewer.exe) para ver, agrupar y filtrar mensajes de seguimiento de filtro para que pueda diagnosticar, reparar y comprobar los problemas de los servicios de WCF.

3.4. Servicios de Hospedaje


Para volverse activo, un servicio se debe hospedar dentro de un entorno de tiempo de ejecucin que lo cree y controle su contexto y duracin. Los servicios de Windows Communication Foundation (WCF) estn diseados para ejecutarse en cualquier proceso de Windows que admita cdigo administrado. WCF proporciona un modelo de programacin unificado para generar aplicaciones orientadas a servicios. Este modelo de programacin permanece coherente y es independiente del entorno de tiempo de ejecucin en el que se implementa el servicio. En la prctica, esto significa que el cdigo de sus servicios tiene prcticamente el mismo aspecto independientemente de la opcin de hospedaje. Estas opciones de hospedaje pueden desde ejecutarse dentro de una aplicacin de consola hasta entornos de servidor como un servicio de Windows que se ejecuta dentro de un proceso de trabajo administrado por Internet Information Server (IIS) o por Windows Process Activation Service (WAS). Los programadores eligen el entorno de hospedaje que satisface los requisitos de implementacin del servicio. Estos requisitos pueden derivarse de la plataforma en la que se implementa la aplicacin, del transporte en el que debe enviar y recibir los mensajes, o del tipo de proceso que recicla y otra administracin de procesos requerida para garantizar una disponibilidad adecuada, o de alguna otra administracin o requisitos de confiabilidad. La siguiente seccin proporciona informacin y orientacin sobre las opciones de hospedaje.

Opciones de hospedaje
Autohospedaje en una aplicacin administrada Los servicios de WCF se pueden hospedar en cualquier aplicacin administrada. sta es la opcin ms flexible puesto que es la que exige una menor infraestructura para implementar. Usted incrusta el cdigo del servicio

MCT: Luis Dueas

Pag 101 de 135

Manual de Windows Communication Foundation


dentro del cdigo de la aplicacin administrada y, a continuacin, crea y abre una instancia del ServiceHost para hacer que el servicio est disponible. Esta opcin habilita dos escenarios comunes: los servicios de WCF que se ejecutan dentro de aplicaciones de consola y las aplicaciones de cliente completas como las basadas en Windows Presentation Foundation (WPF) o Windows Forms (Winforms). Hospedar un servicio de WCF dentro de una aplicacin de consola es til, por lo general, durante la fase de desarrollo de la aplicacin. Esto hace que sean fciles de depurar, de obtener informacin de seguimiento para averiguar lo que est sucediendo dentro de la aplicacin y fciles de mover copindolas en nuevas ubicaciones. Esta opcin de hospedaje tambin facilita la comunicacin de aplicaciones de cliente completas, como WPF y aplicaciones de Winforms, con el mundo externo. Por ejemplo, un cliente de colaboracin punto a punto que utiliza WPF para su interfaz de usuario y tambin hospeda un servicio de WCF que permite a otros clientes conectar con l y compartir informacin. Servicios administrados de Windows Esta opcin de hospedaje consiste en el registro del dominio de la aplicacin (Appdomain) que hospeda un servicio de WCF como un servicio administrado de Windows (anteriormente conocido como servicio NT) para que el administrador de control de servicios (SCM) controle la duracin del proceso del servicio de los servicios de Windows. Al igual que la opcin de autohospedaje, este tipo de entorno de hospedaje requiere que se escriba algn cdigo de hospedaje como parte de la aplicacin. El servicio se implementa como un servicio de Windows y como un servicio de WCF provocando que herede de la clase ServiceBase, as como de una interfaz de contrato de servicios de WCF. ServiceHost se crea y se abre a continuacin dentro de un mtodo OnStart invalidado y cerrado dentro de un mtodo OnStop invalidado. Una clase de instalador que hereda de Installer tambin se debe implementar para permitir que la herramienta Installutl.exe instale el programa como un servicio de Windows. El escenario habilitado por la opcin de hospedaje del servicio administrado de Windows es el de un servicio de WCF de ejecucin prolongada hospedado fuera de IIS en un entorno seguro que no es activado por mensaje. En su lugar, el sistema operativo controla la duracin del servicio. Esta opcin de hospedaje est disponible en todas las versiones de Windows. Internet Information Services (IIS) La opcin de alojamiento de IIS se integra con ASP.NET y utiliza las caractersticas que ofrecen estas tecnologas, como el reciclaje de procesos, cierre por inactividad, supervisin de estado de procesos y activacin basada en mensajes. En los sistemas operativos Windows Server 2003 y Windows XP, sta es la solucin preferida para hospedar aplicaciones de servicios web que deben estar muy disponibles y ser muy escalables. IIS tambin proporciona una capacidad de administracin integrada que los clientes esperan de un producto de servidor de clase empresarial. Esta opcin de hospedaje requiere que IIS se configure correctamente, pero no requiere que se escriba ningn cdigo de hospedaje como parte de la aplicacin. Observe que los servicios hospedados por IIS slo pueden utilizar transporte HTTP. Su implementacin en IIS 5.1 ha introducido algunas limitaciones en Windows XP. La activacin basada en mensajes proporcionada para un servicio de WCF por parte de IIS 5.1 en Windows XP bloquea la posibilidad de que cualquier otro servicio de WCF autohospedado utilice el puerto 80 para comunicarse. Los servicios de WCF se pueden ejecutar en el mismo Appdomain/grupo de aplicaciones/proceso de trabajo que otras aplicaciones cuando se hospeda mediante IIS 6.0 en Windows Server 2003. Pero debido a que WCF e IIS 6.0 usan la pila HTTP de modo de kernel (HTTP.sys), IIS 6.0 puede compartir el puerto 80 con otros servicios de WCF autohospedados que se ejecuten en el mismo equipo, al contrario que IIS 5.1. Servicio de activacin de procesos de Windows (WAS) Windows Process Activacin Servicio (WAS) es el nuevo mecanismo de activacin de procesos del Windows Server 2008, que tambin est disponible en Windows Vista. Retiene las caractersticas familiares del modelo de procesamiento de IIS 6.0 (grupos de aplicaciones y activacin de procesos basada en mensajes) y de hospedaje (como proteccin rpida contra errores, supervisin de estado y reciclaje), pero elimina la dependencia de la arquitectura de activacin con respecto a HTTP. IIS 7.0 usa WAS para lograr la activacin

MCT: Luis Dueas

Pag 102 de 135

Manual de Windows Communication Foundation


mediante mensajes sobre HTTP. Los componentes de WCF adicionales tambin se aaden a WAS para proporcionar la activacin mediante mensajes sobre otros protocolos que WCF admite, como TCP, MSMQ y canalizaciones con nombre. Esto permite a las aplicaciones que utilizan protocolos de comunicacin utilizar las caractersticas de IIS, como el reciclaje de procesos, la proteccin rpida frente a errores y el sistema de configuracin comn que slo estaban disponibles para las aplicaciones basadas en HTTP. Esta opcin de hospedaje requiere que WAS se configure correctamente, pero no requiere que escriba ningn cdigo de hospedaje como parte de la aplicacin.

Eleccin de un entorno de hospedaje


La siguiente tabla resume algunos de las ventajas y escenarios clave asociados a cada una de las opciones de hospedaje. Entorno de hospedaje Aplicacin administrada ("autohospedada") Escenarios comunes Aplicaciones de consola utilizadas durante el desarrollo. WinForm enriquecidos y aplicaciones de cliente de WPF que obtienen acceso a servicios. Windows Services (conocidos anteriormente como servicios NT) Un servicio de WCF de ejecucin prolongada hospedado fuera de IIS. Duracin de proceso del servicio controlada por el sistema operativo, no activada por mensaje. Admitida por todas las versiones de Windows. Entorno seguro. IIS 5.1, IIS 6.0 Ejecucin de un servicio de WCF en paralelo con contenido ASP.NET en Internet utilizando el protocolo HTTP. Reciclaje de procesos. Cierre por inactividad. Supervisin de estado de procesos. Activacin por mensajes. Slo HTTP. Servicio de activacin de procesos de Windows (WAS) Ejecucin de un servicio de WCF sin instalar IIS en Internet utilizando varios protocolos de transporte. No se requiere IIS. Reciclaje de procesos. Cierre por inactividad. Supervisin de estado de procesos. Activacin por mensajes. Funciona con HTTP, TCP, canalizaciones con nombre y MSMQ. IIS 7.0 Ejecucin de un servicio de WCF con contenido ASP.NET. Ejecucin de un servicio de WCF en Internet utilizando varios Ventajas de WAS. Se integra con contenido de IIS y ASP.NET. Ventajas y limitaciones clave Flexible. Fcil de implementar. No es una solucin empresarial de servicios.

MCT: Luis Dueas

Pag 103 de 135

Manual de Windows Communication Foundation

protocolos de transporte. La opcin de un entorno de hospedaje depende de la versin de Windows en la que se implemente, los transportes que requiera para enviar mensajes y el tipo de proceso y reciclaje de dominio de aplicacin que requiera. La siguiente tabla resume los datos relacionados con estos requisitos. Disponibilidad de plataforma Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008 Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008 Windows XP Windows Server 2003 Windows Vista, Windows Server 2008 Transportes admitidos HTTP, net.tcp, net.pipe, net.msmq HTTP, net.tcp, net.pipe, net.msmq HTTP HTTP HTTP, net.tcp, net.pipe, net.msmq Reciclaje de procesos y Appdomai No

Entorno de hospedaje Aplicaciones administradas ("autohospedadas")

Windows Services (conocidos anteriormente como servicios NT)

No

IIS 5.1 IIS 6.0 Servicio de activacin de procesos de Windows (WAS)

S S S

Es importante tener en cuenta que ejecutar un servicio o cualquier extensin desde un host que no sea de confianza pone en peligro la seguridad. Asimismo, tenga en cuenta que al abrir un ServiceHost bajo suplantacin, una aplicacin debe garantizar que el usuario no ha cerrado sesin, por ejemplo mediante el almacenamiento en memoria cach de la WindowsIdentity del usuario.

3.4.1. Procedimiento para Hospedar un Servicio WCF en IIS


Este tema describe los pasos bsicos necesarios para crear un servicio de Windows Communication Foundation (WCF) que se hospeda en Internet Information Services (IIS). Un servicio de WCF que se ejecuta en el entorno de IIS se beneficia de las caractersticas de IIS, como el reciclaje de procesos, el cierre por inactividad, la supervisin de estado de procesos y la activacin basada en mensaje. Esta opcin de hospedaje requiere que se configure correctamente IIS, pero no requiere que se escriba ningn cdigo de hospedaje como parte de la aplicacin. Slo puede utilizar el hospedaje de IIS con un transporte HTTP.

Para crear un servicio hospedado por IIS


1. 2. Confirme que IIS est instalado y ejecutndose en su equipo. Cree una nueva carpeta para sus archivos de aplicacin, asegrese de que ASP.NET tiene acceso al contenido de la carpeta, y utilice la herramienta de administracin de IIS para crear una nueva aplicacin IIS que se ubique fsicamente en este directorio de la aplicacin. 3. Cree un nuevo archivo denominado service file con una extensin .svc en la aplicacin. Modifique este archivo agregando la informacin de directiva @ServiceHost adecuada para el servicio. Por ejemplo, el contenido del archivo de servicio para los ejemplos de CalculatorService contiene la siguiente informacin: <%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService"%> 4. 5. 6. 7. Cree un subdirectorio App_Code dentro del directorio de la aplicacin. Cree un archivo de cdigo en el subdirectorio App_Code. Defina el contrato de servicios para el tipo de servicio del archivo de cdigo. Implemente el contrato de servicios en una clase de servicio en el archivo de cdigo.

MCT: Luis Dueas

Pag 104 de 135

Manual de Windows Communication Foundation


8. Cree un archivo denominado Web.config en el directorio de la aplicacin. Para ejecutar el servicio, el archivo Web.config se debe encontrar en el mismo directorio que el archivo de servicio. 9. Agregue el cdigo de configuracin apropiado en el archivo. En tiempo de ejecucin, la infraestructura de WCF usa la informacin para construir un extremo con el que las aplicaciones cliente se pueden comunicar. En el siguiente ejemplo se muestra el cdigo de configuracin correspondiente al ejemplo de CalculatorService.

3.4.2. Procedimiento para Hospedar un Servicio WCF en WAS


Este tema describe los pasos bsicos requeridos para crear un servicio de Windows Communication Foundation (WCF) hospedado de Windows Process Activation Services (tambin conocido como WAS). WAS es el nuevo servicio de activacin de procesos que es una generalizacin de las caractersticas de Internet Information Services (IIS) que funcionan con protocolos de transporte que no son HTTP. WCF utiliza la interfaz de adaptador de agentes de escucha para comunicar solicitudes de activacin que se reciben a travs de protocolos que no son HTTP, admitidos por WCF, como, por ejemplo, TCP, canalizaciones con nombre y Message Queue Server. Esta opcin de hospedaje requiere que los componentes de activacin WAS se instalen y configuren correctamente, pero no requiere que se escriba ningn cdigo de hospedaje como parte de la aplicacin. Cuando un servicio de WCF se hospeda en WAS, los enlaces estndar se utilizan de la manera habitual. Sin embargo, al utilizar NetTcpBinding y NetNamedPipeBinding para configurar un servicio hospedado en WAS, se debe satisfacer una restriccin. Cuando extremos diferentes utilizan el mismo transporte, las configuraciones del enlace tienen que coincidir en las siete propiedades siguientes: ConnectionBufferSize ChannelInitializationTimeout MaxPendingConnections MaxOutputDelay MaxPendingAccepts ConnectionPoolSettings.IdleTimeout ConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint De lo contrario, el extremo que se inicializa primero siempre determina los valores de estas propiedades y los extremos agregados despus producen una ServiceActivationException si no coinciden con esos valores.

Creacin de un servicio bsico hospedado por WAS


1. 2. Defina un contrato de servicios para el tipo de servicio. Implemente el contrato de servicios en una clase de servicio. Observe que la informacin de enlace o direccin no se especifica en ninguna parte de la implementacin del servicio. Adems, el cdigo tiene que escribirse para recuperar esa informacin del archivo de configuracin. 3. Cree un archivo Web.config para configurar un extremo para CalculatorService que utiliza NetTcpBinding. 4. 5. Cree un archivo Service.svc que contenga la lnea: <%@ServiceHost language=c# Service="CalculatorService" %> Coloque el archivo Service.svc en su directorio virtual de IIS.

Creacin de un cliente para que utilice el servicio


1. Utilice la ServiceModel Metadata Utility Tool (Svcutil.exe) desde la lnea de comandos para generar cdigo a partir de los metadatos del servicio. Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address> 2. El cliente que se genera contiene la interfaz ICalculator que define el contrato de servicios que la implementacin del cliente debe cumplir.

MCT: Luis Dueas

Pag 105 de 135

Manual de Windows Communication Foundation


3. La aplicacin de cliente generada tambin contiene la implementacin de ClientCalculator. Observe que la informacin de enlace y direccin no se especifica en ninguna parte de la implementacin del servicio. Adems, el cdigo tiene que escribirse para recuperar esa informacin del archivo de configuracin. 4. Svcutil.exe tambin genera la configuracin del cliente que utiliza el NetTcpBinding. Este archivo se debera nombrar en el archivo App.config al utilizar Visual Studio. 5. Cree una instancia de ClientCalculator en una aplicacin y, a continuacin, llame a las operaciones del servicio. 6. Compile y ejecute el cliente.

3.4.3. Hospedaje de un Servicio WCF en un Servicio Administrado de Windows


Este tema describe los pasos bsicos necesarios para crear un servicio de Windows Communication Foundation (WCF) hospedado por un servicio de Windows. El escenario est habilitado por la opcin de hospedaje del servicio de Windows administrado que es un servicio de WCF de ejecucin prolongada hospedado fuera de Internet Information Services (IIS) en un entorno seguro que no es activado por mensaje. En su lugar, el sistema operativo controla la duracin del servicio. Esta opcin de hospedaje est disponible en todas las versiones de Windows. Los servicios de Windows se pueden administrar con Microsoft.ManagementConsole.SnapIn en Microsoft Management Console (MMC) y pueden configurarse automticamente para iniciar cuando el sistema arranca. Esta opcin de hospedaje consiste en el registro del dominio de la aplicacin (Appdomain) que hospeda un servicio de WCF como un servicio administrado por Windows, de modo que la vida del proceso est controlada por el administrador de control de servicios (SCM) de los servicios de Windows. El cdigo del servicio incluye una implementacin del contrato de servicios, una clase de Windows Service y una clase del instalador. La clase de implementacin de servicio, CalculatorService, es un servicio WCF. CalculatorWindowsService es un servicio de Windows. Para certificarse como servicio de Windows, la clase hereda de ServiceBase e implementa los mtodos OnStart y OnStop. En OnStart, se crea ServiceHost para el tipo CalculatorService y se abre. En OnStop, el servicio se detiene y se elimina. El host tambin es responsable de proporcionar una direccin base al host del servicio, que se ha configurado en los valores de la aplicacin. La clase del instalador, que hereda de Installer, permite instalar el programa como un servicio de Windows mediante la herramienta Installutil.exe.

Construya el servicio y proporcione el cdigo del hospedaje


1. Defina el contrato de servicios ICalculator utilizando una interfaz para el servicio de la calculadora del archivo Service.cs. 2. Implemente el contrato de servicios en una clase CalculatorService en el archivo Service.cs como un servicio de WCF, haciendo que herede de la interfaz WCF ICalculator. 3. Implemente el servicio de Windows haciendo que herede de la clase ServiceBase. Invalide el mtodo OnStart para crear y abrir una instancia del ServiceHost. Invalide el mtodo OnStop para cerrar la instancia de ServiceHost. Cree una instancia de la instancia CalculatorService y llmela "WCFWindowsServiceSample". Facilite un punto de entrada para la aplicacin. 4. Cree una ProjectInstaller clase que herede de Installer y se marque con el RunInstallerAttribute establecido en true, para que el Instalador de accin personalizada de Visual Studio o InstallUtil.exe se invoque cuando se instale el ensamblado. 5. Proporcione la direccin base para el servicio mediante configuracin.

Instale y ejecute el servicio.


1. 2. Compile el servicio para generar la aplicacin ejecutable Service.exe. Escriba installutil bin\service.exe en el smbolo del sistema para instalar el servicio de Windows . (La herramienta se encuentra en el directorio de instalacin de Microsoft.NET Framework si an no se ha

MCT: Luis Dueas

Pag 106 de 135

Manual de Windows Communication Foundation


establecido la ruta de acceso a l). Escriba services.msc en el smbolo del sistema para tener acceso al Administrador de control de servicios (SCM). El servicio de WINDOWS debera aparecer en Servicios como "WCFWindowsServiceSample". El servicio de WCF slo puede responder a los clientes si el servicio de WINDOWS se est ejecutando. Para iniciar el servicio, haga clic con el botn secundario en el SCM y seleccione "Iniciar" o escriba net startWCFWindowsServiceSample en el smbolo del sistema. 3. Si realiza cambios en el servicio, debe detenerlo primero y desinstalarlo. Para detener el servicio, haga clic con el botn secundario en el SCM y seleccione "Stop" o escriba net stop WCFWindowsServiceSample en el smbolo del sistema. Tenga en cuenta que si detiene el servicio de WINDOWS y, a continuacin, ejecuta el cliente, se produce una excepcin EndpointNotFoundException cuando un cliente intenta tener acceso al servicio. Para desinstalar el tipo de servicio de WINDOWS, escriba installutil /u bin\service.exe en el smbolo del sistema.

3.4.4. Hospedaje de un Servicio WCF en un Aplicacin Administrada


Para hospedar un servicio dentro de una aplicacin administrada, incruste el cdigo del servicio dentro del cdigo de la aplicacin administrada, defina un extremo para el servicio de manera imperativa mediante cdigo o de manera declarativa mediante configuracin y, a continuacin, cree una instancia de ServiceHost. Para comenzar a recibir mensajes, llame al mtodo Open en ServiceHost. Esto crea y abre el agente de escucha del servicio. Hospedar un servicio de esta manera se conoce a menudo como "autohospedaje", puesto que la aplicacin administrada est haciendo el propio trabajo de hospedaje. Para cerrar el servicio, llame al mtodo System.ServiceModel.Channels.CommunicationObject.Close en ServiceHost. Un servicio tambin se puede hospedar en un servicio de Windows administrado, en Internet Information Services (IIS), o en Windows Process Activation Service (WAS). Hospedar un servicio en una aplicacin administrada es la opcin ms flexible puesto que es la opcin que menos infraestructura requiere que se implemente. El siguiente procedimiento muestra cmo implementar un servicio autohospedado en una aplicacin de consola.

Creacin de un servicio autohospedado


1. 2. 3. Defina un extremo de servicio para el servicio mediante configuracin. Cree una interfaz para el servicio. Implemente la interfaz para crear el tipo de servicio. En el siguiente ejemplo se llama a la implementacin MathService. 4. 5. Cree un mtodo para iniciar el servicio. En este ejemplo, se usa el mtodo Main. Cree una instancia de la clase Uri con la direccin base del servicio. Este ejemplo utiliza la propiedad esttica AppSettings de la clase ConfigurationManager para seleccionar una direccin base. Asegrese de agregar una referencia a la System.Configuration.dll en su proyecto. A continuacin, se puede establecer la direccin base en el archivo de configuracin para la aplicacin host bajo el elemento <appSettings>. 6. Agregue un elemento <appSettings> en el archivo de configuracin de la aplicacin. A continuacin, use el elemento <add> con un atributo key adecuado. En este caso, el valor de key coincide con el parmetro que se pasa a la propiedad AppSettings en el paso anterior. 7. Cree una instancia de la clase ServiceHost, pasando un Type que representa el tipo de servicio y el Identificador uniforme de recursos (URI) de la direccin base al ServiceHost. 8. Llame al mtodo Open en el objeto ServiceHost.

Creacin de un extremo mediante configuracin


1. Agregue un archivo de configuracin al mismo directorio que el ensamblado del servicio.

MCT: Luis Dueas

Pag 107 de 135

Manual de Windows Communication Foundation

3.5. Generacin de Clientes


Los temas en esta seccin muestran cmo crear y utilizar un cliente de Windows Communication Foundation.

3.5.1. Introduccin a un Cliente WCF


En esta seccin se describe qu aplicaciones pueden configurar un cliente Windows Communication Foundation (WCF), cmo lo configuran, crean y utilizan, y cmo proteger las aplicaciones cliente.

Utilizacin de objetos cliente WCF


Una aplicacin cliente es una aplicacin administrada que utiliza un cliente WCF para comunicarse con otra aplicacin. Para crear la aplicacin cliente de un servicio WCF es necesario seguir los pasos siguientes: 1. 2. 3. 4. Obtenga la informacin del contrato de servicio, el enlace y la direccin del punto final del servicio. Cree un cliente WCF utilizando dicha informacin. Llame a las operaciones. Cierre el objeto de cliente WCF.

Las siguientes secciones explican estos pasos y proporcionan una breve introduccin a las siguientes cuestiones: Control de errores Configuracin y proteccin de los clientes. Creacin de objetos de devolucin de llamada para los servicios dplex. Llamada asincrnica a los servicios. Llamada a los servicios mediante los canales cliente.

Obtencin del contrato de servicios, los enlaces y las direcciones


En WCF, los servicios y clientes modelan los contratos utilizando los atributos, interfaces y mtodos administrados. Para conectar con un servicio en una aplicacin cliente, es necesario obtener la informacin del tipo de contrato de servicios. Normalmente, esto se consigue mediante ServiceModel Metadata Utility Tool (Svcutil.exe), que descarga los metadatos del servicio, los convierte en un archivo de cdigo fuente administrado con el lenguaje elegido, y crea un archivo de configuracin de aplicacin cliente que puede utilizarse para configurar el objeto de cliente WCF. Por ejemplo, si se crea un objeto de cliente WCF para invocar un MyCalculatorService, y se sabe que los metadatos de ese servicio estn publicados en http://computerName/MyCalculatorService/Service.svc?wsdl, el siguiente ejemplo de cdigo muestra cmo utilizar Svcutil.exe para obtener un archivo ClientCode.vb que contenga el contrato de servicios en cdigo administrado. svcutil /language:vb /out:ClientCode.vb /config:app.config http://computerName/MyCalculatorService/Service.svc?wsdl Puede compilar este cdigo de contrato en la aplicacin cliente, o en otro ensamblado que la aplicacin cliente puede utilizar para crear un objeto de cliente WCF. Puede utilizar el archivo de configuracin y configurar el objeto de cliente para conectarse correctamente con el servicio.

Creacin de un objeto de cliente de WCF


Un cliente WCF es un objeto local que representa un servicio WCF en un formulario que el cliente puede utilizar para la comunicacin con el servicio remoto. Los tipos de cliente WCF implementan el contrato de servicio de destino, de modo que al crear uno y configurarlo, puede utilizarse directamente el objeto de cliente para invocar las operaciones del servicio. El tiempo de ejecucin WCF convierte las llamadas al mtodo en mensajes, los enva al servicio, realiza escuchas para la respuesta, y devuelve esos valores al objeto de cliente WCF como valores devueltos, parmetros out o ref. Tambin pueden utilizarse los objetos de canal de cliente WCF para la conexin con los servicios y la utilizacin de los mismos. Creacin de un nuevo objeto WCF

MCT: Luis Dueas

Pag 108 de 135

Manual de Windows Communication Foundation


Para mostrar la utilizacin de una clase ClientBase, supongamos que el siguiente contrato de servicio simple se ha generado a partir de una aplicacin de servicio. Nota: Si se utiliza Visual Studio para crear el cliente WCF, cuando se agrega una referencia de servicio al proyecto, los objetos se cargan automticamente en el examinador de objetos. Si no utiliza Visual Studio, examine el cdigo de contrato generado para encontrar el tipo que extiende ClientBase, y el ISampleServicede la interfaz del contrato de servicio. En este caso, ese tipo es similar al cdigo siguiente: Esta clase puede crearse como un objeto local, mediante uno de los constructores, configurarse y, a continuacin, utilizarse para la conexin con un servicio del tipo ISampleService. Se recomienda crear primero el objeto de cliente WCF, y, a continuacin, utilizarlo y cerrarlo dentro de un nico bloque try/catch. No debe utilizarse la instruccin using (Using en Visual Basic) porque puede enmascarar excepciones en ciertos modos de error. Contratos, enlaces y direcciones Antes de poder crear un objeto de cliente WCF, ste debe configurarse. En concreto, debe disponer de un punto final de servicio que poder utilizar. Un punto final es la combinacin de un contrato de servicio, un enlace y una direccin. Normalmente, esta informacin se encuentra en el elemento <endpoint> de un archivo de configuracin de la aplicacin cliente, como el que genera la herramienta Svcutil.exe, y se carga automticamente al crear el objeto de cliente. Ambos tipos de cliente WCF tambin tienen sobrecargas que permiten especificar esta informacin mediante programacin. Por ejemplo, un archivo de configuracin generado para el ISampleService utilizado en los ejemplos anteriores, contiene la informacin de punto final siguiente. Este archivo de configuracin especifica un punto final de destino en el elemento <client>.

Llamadas a operaciones
Una vez creado y configurado un objeto de cliente, cree un bloque try/catch, llame a las operaciones del mismo modo a como lo hara si el objeto fuese local, y cierre el objeto de cliente WCF. Cuando la aplicacin cliente llama a la primera operacin, WCF abre automticamente el canal subyacente, que se cierra al reciclar el objeto. (De manera alternativa, tambin puede abrir y cerrar explcitamente el canal antes o despus de llamar a otras operaciones). Por ejemplo, si posee el siguiente contrato de servicio: Namespace Microsoft.ServiceModel.Samples Imports System Imports System.ServiceModel <ServiceContract(Namespace:= _ "http://Microsoft.ServiceModel.Samples")> _ Public Interface ICalculator <OperationContract> _ Function Add(n1 As Double, n2 As Double) As Double <OperationContract> _ Function Subtract(n1 As Double, n2 As Double) As Double <OperationContract> _ Function Multiply(n1 As Double, n2 As Double) As Double <OperationContract> _ Function Divide(n1 As Double, n2 As Double) As Double End Interface

MCT: Luis Dueas

Pag 109 de 135

Manual de Windows Communication Foundation


Puede llamar a las operaciones mediante la creacin de un objeto de cliente WCF y la llamada a sus mtodos, como muestra el ejemplo de cdigo siguiente. Tenga en cuenta que la apertura, llamada y cierre del objeto de cliente WCF tiene lugar en un bloque try/catch nico.

Control de errores
Las excepciones pueden producirse en una aplicacin cliente cuando se abre el canal de cliente subyacente (explcita o automticamente mediante la llamada a una operacin), se utiliza el cliente u objeto de canal para llamar a las operaciones, o se cierra el canal de cliente subyacente. Se recomienda como mnimo que las aplicaciones prevean administrar posibles System.TimeoutException de se cualquier elevan a objeto las y las excepciones System.ServiceModel.CommunicationException, SOAP especificados en el contrato de adems operacin System.ServiceModel. cliente como

FaultException iniciado como resultado de los errores de SOAP devueltos por las operaciones. Los errores de aplicaciones System.ServiceModel.FaultException, donde el parmetro de tipo es el tipo de detalle del error de SOAP.

Configuracin y proteccin de clientes.


La configuracin de un cliente se inicia con la carga de informacin de punto final de destino necesaria para el cliente u objeto de canal, normalmente desde un archivo de configuracin, aunque tambin puede cargarse esta informacin mediante programacin utilizando los constructores y propiedades de cliente. No obstante, son necesarios pasos de configuracin adicionales que habiliten cierto comportamiento del cliente y diferentes escenarios de seguridad. Por ejemplo, los requisitos de seguridad para los contratos de servicios se declaran en la interfaz del contrato de servicio; si Svcutil.exe cre un archivo de configuracin, ese archivo contiene, normalmente, un enlace capaz de admitir los requisitos de seguridad del servicio. En algunos casos, sin embargo, puede ser necesaria una mayor configuracin de seguridad, como la configuracin de credenciales de cliente. Adems, algunas modificaciones personalizadas pueden habilitarse en las aplicaciones cliente, por ejemplo, los comportamientos de tiempo de ejecucin personalizados.

Creacin de objetos de devolucin de llamada para servicios dplex.


Los servicios dplex especifican un contrato de devolucin de llamada que la aplicacin cliente debe implementar para proporcionar un objeto de devolucin de llamada, y que el servicio realice las llamadas segn los requisitos del contrato. Aunque los objetos de devolucin de llamada no son servicios completos (por ejemplo, no puede iniciar un canal con un objeto de devolucin de llamada), en lo que respecta la implementacin y la configuracin pueden concebirse como un tipo de servicio. Los clientes de servicios dplex deben: Implementar una clase de contrato de devolucin de llamada. Crear una instancia de la clase de implementacin de contrato de devolucin de llamada, y utilizarla para crear el objeto System.ServiceModel.InstanceContext que se pasa al constructor de cliente WCF. Invocar operaciones y controlar las devoluciones de llamada de la operacin. Los objetos de cliente WCF dplex funcionan como sus homlogos no dplex, salvo que exponen la funcionalidad necesaria para admitir las devoluciones de llamada, incluida la configuracin del servicio de devolucin de llamada. Por ejemplo, pueden controlarse distintos aspectos del comportamiento del tiempo de ejecucin del objeto de devolucin de llamada mediante las propiedades del atributo System.ServiceModel.CallbackBehaviorAttribute, en la clase de devolucin de llamada. Otro ejemplo es el uso de la clase System.ServiceModel.Description. CallbackDebugBehavior para habilitar el retorno de informacin de excepcin a los servicios que llaman al objeto de devolucin de llamada.

MCT: Luis Dueas

Pag 110 de 135

Manual de Windows Communication Foundation


En los equipos de Windows XP que ejecutan Internet Information Services (IIS) 5.1, los clientes dplex deben especificar una direccin base de cliente utilizando la clase System.ServiceModel.WSDualHttpBinding, o se iniciar una excepcin. En el ejemplo de cdigo siguiente se muestra cmo realizar esta especificacin en el cdigo. El cdigo siguiente muestra cmo realizar esta especificacin en un archivo de configuracin

Llamada a servicios de manera asincrnica.


La manera cmo se realizan las llamadas a las operaciones depende del desarrollador cliente. La razn es que los mensajes que constituyen una operacin pueden asignarse a mtodos sincrnicos o asincrnicos cuando se expresan en cdigo administrado. Por consiguiente, si desea generar un cliente que llama a las operaciones de manera asincrnica, puede utilizar Svcutil.exe para generar cdigo de cliente asincrnico mediante la opcin /async.

Llamada a los servicios mediante canales de cliente WCF.


Los tipos de cliente WCF extienden ClientBase, que, a su vez, deriva de la interfaz System.ServiceModel. IClientChannel para exponer el sistema del canal subyacente. Puede invocar los servicios utilizando el contrato de servicios de destino con la clase System.ServiceModel.ChannelFactory.

3.5.2. Acceso a los Servicios mediante un Cliente WCF


Despus de crear un servicio, el paso siguiente es crear un cliente WCF. Una aplicacin de cliente usa el cliente WCF para comunicarse con el servicio. Las aplicaciones de cliente suelen importar los metadatos de un servicio para generar el cdigo de cliente WCF que se puede usar para invocar el servicio. Los pasos bsicos para crear un cliente WCF son los siguientes: 1. 2. Compilar el cdigo del servicio. Usar ServiceModel Metadata Utility Tool (SvcUtil.exe) para crear el cliente WCF.

Herramienta de utilidad de metadatos ServiceModel


ServiceModel Metadata Utility Tool (Svcutil.exe) es una herramienta de lnea de comandos para generar cdigo a partir de metadatos. A continuacin se muestra un ejemplo del uso de un comando bsico Svcutil.exe. Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address> Alternativamente, puede usar Svcutil.exe con Web Services Description Language (WSDL) y archivos de lenguaje de definicin de esquemas XML (XSD) en el sistema de archivos. Svcutil.exe <list of WSDL and XSD files on file system> El resultado es un archivo de cdigo que contiene cdigo de cliente WCF que la aplicacin de cliente puede usar para invocar el servicio. Tambin puede usar la herramienta para generar archivos de configuracin. Svcutil.exe <file1 [,file2]> Si se proporciona slo uno nombre de archivo, se ser el nombre del archivo de salida. Si se proporcionan dos nombres de archivo, entonces el primer archivo es un archivo de configuracin de entrada cuyo contenido est combinado con la configuracin generada y que se escribe en el segundo archivo. Configuracin Nota: Las solicitudes de metadatos que no son seguras plantean ciertos riesgos, al igual que cualquier solicitud de una red no segura: si no est seguro de que el extremo con el que se est comunicando es el que dice ser, es posible que la informacin que recupere sean metadatos de un servicio malintencionado.

Ejemplo
El ejemplo de cdigo siguiente muestra un contrato de servicio creado para un servicio. ' Define a service contract. <ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")> _ Public Interface ICalculator <OperationContract()> _

MCT: Luis Dueas

Pag 111 de 135

Manual de Windows Communication Foundation


Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double ' Other methods are not shown here. End Interface La herramienta de utilidades de metadatos de ServiceModel genera la clase de cliente WCF siguiente. La clase adquiere de la clase ClientBase genrica e implementa la interfaz ICalculator. La herramienta tambin genera la interfaz (no se muestra aqu) ICalculator. Partial Public Class CalculatorClient Inherits System.ServiceModel.ClientBase(Of ICalculator) Implements ICalculator Public Sub New() MyBase.New End Sub Public Sub New(ByVal configurationName As String) MyBase.New(configurationName) End Sub Public Sub New(ByVal binding As System.ServiceModel.Binding) MyBase.New(binding) End Sub Public Sub New(ByVal address As _ System.ServiceModel.EndpointAddress, _ ByVal binding As System.ServiceModel.Binding) MyBase.New(address, binding) End Sub Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As _ Double Implements ICalculator.Add Return MyBase.InnerChannel.Add(n1, n2) End Function End Class

Uso del cliente WCF


Para usar el cliente WCF, cree una instancia del cliente WCF y, a continuacin, llame a sus mtodos, tal y como se muestra en el cdigo siguiente. ' Create a client object with the given client endpoint configuration. Dim calcClient As CalculatorClient = _ New CalculatorClient("CalculatorEndpoint") ' Call the Add service operation. Dim value1 As Double = 100.00D Dim value2 As Double = 15.99D Dim result As Double = calcClient.Add(value1, value2) Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result)

Depuracin de las excepciones iniciadas por un cliente


Muchas de las excepciones iniciadas por un cliente WCF tienen su origen en una excepcin del servicio. Estos son algunos ejemplos: SocketException: el host remoto forz el cierre de la conexin existente. CommunicationException: la conexin ha terminado de forma inesperada. CommunicationObjectAbortedException: se anul la conexin de socket. La causa puede ser un error en el procesamiento del mensaje, que se super el tiempo de espera de recepcin en el host remoto, o bien un problema de recursos de red subyacente. Cuando se producen estos tipos de excepciones, la mejor manera de resolver el problema es activar el seguimiento en el lado del servicio y determinar qu excepcin se produjo all.

3.5.2.1. Cmo: Obtener Acceso a los Servicios con un Contrato Dplex


Una caracterstica de Windows Communication Foundation (WCF) es la capacidad de crear un servicio que utilice un patrn de mensajera dplex. Este patrn permite a un servicio comunicarse con el cliente mediante una devolucin de llamada. En este tema se muestran los pasos para crear un cliente de WCF en una clase de cliente que implementa la interfaz de devolucin de llamada.

MCT: Luis Dueas

Pag 112 de 135

Manual de Windows Communication Foundation


Un enlace dual expone la direccin IP del cliente al servicio. El cliente debera utilizar la seguridad para asegurarse de que slo se conecta a servicios de confianza.

Obtencin de acceso a un servicio dplex


1. Cree un servicio que contenga dos interfaces. La primera interfaz es para el servicio, la segunda es para la devolucin de llamada. 2. 3. Ejecute el servicio. Utilice ServiceModel Metadata Utility Tool (Svcutil.exe) para generar contratos (interfaces) para el cliente. 4. Implemente la interfaz de devolucin de llamada en la clase de cliente, tal y como se muestra en el siguiente ejemplo. Public Class CallbackHandler Implements ICalculatorDuplexCallback Public Sub Result (ByVal result As Double) Console.WriteLine("Result ({0})", result) End Sub Public Sub Equation(ByVal equation As String) Console.Writeline("Equation({0})", equation) End Sub End Class 5. Cree una instancia de la clase InstanceContext. El constructor necesita una instancia de la clase cliente. Dim site As InstanceContext = New InstanceContext(new CallbackHandler()) 6. Cree una instancia de cliente de WCF mediante el constructor que requiere un objeto InstanceContext. El segundo parmetro del constructor es el nombre de un extremo encontrado en el archivo de configuracin. Dim wcfClient As New CalculatorDuplexClient(site, "default") 7. Llame a los mtodos de cliente de WCF segn sea necesario.

3.5.2.2. Cmo Llamar a Operaciones del Servicio WCF de forma Asincrnica


En este tema se explica cmo puede tener acceso un cliente a una operacin de servicio de forma asincrnica. El servicio en este tema implementa la interfaz ICalculator. El cliente puede llamar a las operaciones de esta interfaz de forma asincrnica mediante el modelo de llamada asincrnica orientado a eventos. Nota: El modelo de llamada asincrnica orientado a eventos no es compatible con la utilizacin de un ChannelFactory.

Procedimiento
Para llamar a operaciones de servicio WCF de forma asincrnica 1. Ejecute la herramienta ServiceModel Metadata Utility Tool (Svcutil.exe) con las opciones de comando /async y /tcv:Version35 a la vez, como muestra el comando siguiente. svcutil /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples http://localhost:8000/servicemodelsamples/service/mex /a /tcv:Version35 De este modo se genera, adems de las operaciones sincrnicas y las operaciones estndar asincrnicas basadas en delegado, una clase de cliente WCF que incluye: Dos operaciones <operationName>Async que se utilizan con el enfoque de llamada asincrnica basada en eventos. Por ejemplo: Eventos completados de operacin del formulario <operationName>Completed que se utilizan con el enfoque de llamada asincrnica basada en eventos. Por ejemplo: Tipos System.EventArgs para cada operacin (del formulario <operationName>

CompletedEventArgs) que se utilizan en el enfoque de llamada asincrnica basado en eventos. Por ejemplo:

MCT: Luis Dueas

Pag 113 de 135

Manual de Windows Communication Foundation


2. En la aplicacin de llamada, cree un mtodo de devolucin de llamada al que llamar cuando la operacin asincrnica finalice, tal y como se muestra en el siguiente cdigo de ejemplo. 3. Antes de llamar a la operacin, utilice un nuevo genrico System.EventHandler de tipo

<operationName>EventArgs para agregar el mtodo del controlador (creado en el paso anterior ) al evento <operationName>Completed. A continuacin, llame al mtodo <operationName>Async. Nota: Las directrices de diseo del modelo asincrnico basado en eventos afirman que si se devuelve ms de un valor, uno de los valores se devuelve como propiedad Result y los dems se devuelven como propiedades del objeto EventArgs. Una de las consecuencias de esto, es que el cliente importa metadatos utilizando las opciones de comando asincrnicas basadas en eventos y la operacin devuelve ms de una valor, el objeto predeterminado EventArgs devuelve un valor como propiedad Result, y el resto son propiedades del objeto EventArgs.Para recibir el objeto de mensaje como propiedad Result y que los valores devueltos sean propiedades de ese objeto, se utiliza la opcin de comando /messageContract. Esto genera una firma que devuelve el mensaje de respuesta como la propiedad Result del objeto EventArgs. Todos los valores de devolucin internos se convierten, pues, en propiedades del objeto de mensaje de respuesta.

3.5.2.3. Cmo: Obtener Acceso a los Servicios WCF con Contratos Unidireccionales y de Solicitud-Respuesta
Los procedimientos siguientes describen cmo tener acceso a un servicio Windows Communication Foundation (WCF) que define un contrato unidireccional y un contrato de solicitud-respuesta y no utiliza el modelo de comunicacin dplex.

Para definir el servicio


1. Declare el contrato de servicio. Las operaciones que son unidireccionales deben tener IsOneWay establecido en true dentro de OperationContractAttribute. El cdigo siguiente declara el contrato IOneWayCalculator que tiene operaciones unidireccionales para Add, Subtract, Multiply y Divide. Tambin define una operacin de respuesta de solicitud denominada SayHello. [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] public interface IOneWayCalculator { [OperationContract(IsOneWay = true)] void Add(double n1, double n2); [OperationContract(IsOneWay = true)] void Subtract(double n1, double n2); [OperationContract(IsOneWay = true)] void Multiply(double n1, double n2); [OperationContract(IsOneWay = true)] void Divide(double n1, double n2); [OperationContract] string SayHello(string name); } 2. Implemente el contrato de servicios. En el cdigo siguiente se implementa la interfaz IOnewayCalculator. [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)] public class CalculatorService : IOneWayCalculator { public void Add(double n1, double n2) { double result = n1 + n2; Console.WriteLine("Add({0},{1}) = {2} ", n1, n2, result); } public void Subtract(double n1, double n2) { double result = n1 - n2; Console.WriteLine("Subtract({0},{1}) = {2}", n1, n2, result);

MCT: Luis Dueas

Pag 114 de 135

Manual de Windows Communication Foundation


} public void Multiply(double n1, double n2) { double result = n1 * n2; Console.WriteLine("Multiply({0},{1}) = {2}", n1, n2, result); } public void Divide(double n1, double n2) { double result = n1 / n2; Console.WriteLine("Divide({0},{1}) = {2}", n1, n2, result); } public string SayHello(string name) { Console.WriteLine("SayHello({0})", name); return "Hello " + name; } } 3. Hospede el servicio en una aplicacin de consola. En el cdigo siguiente se muestra cmo hospedar el servicio. // Host the service within this EXE console application. public static void Main() { // Define the base address for the service. Uri baseAddress = new Uri("http://localhost:8000/servicemodelsamples/service"); // Create a ServiceHost for CalculatorService type and provide the base address. using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress)) { // Add an endpoint using the IOneWayCalculator contract and the WSHttpBinding serviceHost.AddServiceEndpoint(typeof(IOneWayCalculator), new WSHttpBinding(), ""); // Turn on the metadata behavior,this allows svcutil to get metadata for service ServiceMetadataBehavior smb = (ServiceMetadataBehavior) serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>(); if (smb == null) { smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; serviceHost.Description.Behaviors.Add(smb); } // Open the ServiceHostBase to create listeners and start listening for messages. serviceHost.Open(); // The service can now be accessed. Console.WriteLine("The service is ready."); Console.WriteLine("Press <ENTER> to terminate service."); Console.WriteLine(); Console.ReadLine(); } }

Para obtener acceso al servicio


1. Ejecute la ServiceModel Metadata Utility Tool (Svcutil.exe) utilizando la direccin de extremo de intercambio de metadatos, con el fin de crear la clase de cliente para el servicio, mediante la lnea de comandos siguiente: Svcutil http://localhost:8000/Service. La ServiceModel Metadata Utility Tool (Svcutil.exe) genera un conjunto de interfaces y clases, como se muestra en el cdigo de ejemplo siguiente. [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] [System.ServiceModel.ServiceContractAttribute(Namespace="http://Microsoft.ServiceModel .Samples", ConfigurationName="IOneWayCalculator")] public interface IOneWayCalculator {

MCT: Luis Dueas

Pag 115 de 135

Manual de Windows Communication Foundation


[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://Microsoft.ServiceModel.Samples/IOneWayCalculator/Add")] void Add(double n1, double n2); [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://Microsoft.ServiceModel.Samples/IOneWayCalculator/Subtract")] void Subtract(double n1, double n2); [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://Microsoft.ServiceModel.Samples/IOneWayCalculator/Multiply")] void Multiply(double n1, double n2); [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://Microsoft.ServiceModel.Samples/IOneWayCalculator/Divide")] void Divide(double n1, double n2); [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel. Samples/IOneWayCalculator/SayHello", ReplyAction="http://Microsoft.ServiceModel.Samples/IOneWayCalculator/SayHelloResponse" )] string SayHello(string name); } [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] public interface IOneWayCalculatorChannel : IOneWayCalculator, System.ServiceModel.IClientChannel { } [System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] public partial class OneWayCalculatorClient : System.ServiceModel.ClientBase<IOneWayCalculator>, IOneWayCalculator { public OneWayCalculatorClient() { } public OneWayCalculatorClient(string endpointConfigurationName) : base(endpointConfigurationName) { } public OneWayCalculatorClient(string endpointConfigurationName, string remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public OneWayCalculatorClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : base(endpointConfigurationName, remoteAddress) { } public OneWayCalculatorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : base(binding, remoteAddress) { } public void Add(double n1, double n2) { base.Channel.Add(n1, n2); } public void Subtract(double n1, double n2) { base.Channel.Subtract(n1, n2); } public void Multiply(double n1, double n2) { base.Channel.Multiply(n1, n2); }

MCT: Luis Dueas

Pag 116 de 135

Manual de Windows Communication Foundation


public void Divide(double n1, double n2) { base.Channel.Divide(n1, n2); } public string SayHello(string name) { return base.Channel.SayHello(name); } } Observe en la interfaz IOneWayCalculator que las operaciones de servicio unidireccionales tienen el atributo IsOneWay establecido en true y que la operacin de servicio de solicitud-respuesta tiene el atributo establecido en el valor predeterminado, false. Observe tambin la clase OneWayCalculatorClient. sta es la clase que se utilizar para llamar al servicio. 2. Cree el objeto de cliente. // Create a client WSHttpBinding binding = new WSHttpBinding(); EndpointAddress epAddress = new EndpointAddress("http://localhost:8000/servicemodelsamples/service"); OneWayCalculatorClient client = new OneWayCalculatorClient(binding, epAddress); Operaciones de servicio de llamada. // Call the Add service operation. double value1 = 100.00D; double value2 = 15.99D; client.Add(value1, value2); Console.WriteLine("Add({0},{1})", value1, value2); // Call the Subtract service operation. value1 = 145.00D; value2 = 76.54D; client.Subtract(value1, value2); Console.WriteLine("Subtract({0},{1})", value1, value2); // Call the Multiply service operation. value1 = 9.00D; value2 = 81.25D; client.Multiply(value1, value2); Console.WriteLine("Multiply({0},{1})", value1, value2); // Call the Divide service operation. value1 = 22.00D; value2 = 7.00D; client.Divide(value1, value2); Console.WriteLine("Divide({0},{1})", value1, value2); // Call the SayHello service operation string name = "World"; string response = client.SayHello(name); Console.WriteLine("SayHello([0])", name); Console.WriteLine("SayHello() returned: " + response); Cierre el cliente para cerrar las conexiones y limpiar los recursos. //Closing the client gracefully closes the connection and cleans up resources client.Close();

3.

4.

Ejemplo
A continuacin, se muestra la lista completa del cdigo que se emplea en este tema. // Service.cs using System; using System.Configuration; using System.ServiceModel; using System.ServiceModel.Description; namespace Microsoft.ServiceModel.Samples { // Define a service contract. [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] public interface IOneWayCalculator

MCT: Luis Dueas

Pag 117 de 135

Manual de Windows Communication Foundation


{ [OperationContract(IsOneWay = true)] void Add(double n1, double n2); [OperationContract(IsOneWay = true)] void Subtract(double n1, double n2); [OperationContract(IsOneWay = true)] void Multiply(double n1, double n2); [OperationContract(IsOneWay = true)] void Divide(double n1, double n2); [OperationContract] string SayHello(string name); } // Service class which implements the service contract. // Added code to write output to the console window [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)] public class CalculatorService : IOneWayCalculator { public void Add(double n1, double n2) { double result = n1 + n2; Console.WriteLine("Add({0},{1}) = {2} ", n1, n2, result); } public void Subtract(double n1, double n2) { double result = n1 - n2; Console.WriteLine("Subtract({0},{1}) = {2}", n1, n2, result); } public void Multiply(double n1, double n2) { double result = n1 * n2; Console.WriteLine("Multiply({0},{1}) = {2}", n1, n2, result); } public void Divide(double n1, double n2) { double result = n1 / n2; Console.WriteLine("Divide({0},{1}) = {2}", n1, n2, result); } public string SayHello(string name) { Console.WriteLine("SayHello({0})", name); return "Hello " + name; } // Host the service within this EXE console application. public static void Main() { // Define the base address for the service. Uri baseAddress = new Uri("http://localhost:8000/servicemodelsamples/service"); // Create a ServiceHost for the CalculatorService type and provide the base address. using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress)) { // Add an endpoint using the IOneWayCalculator contract and the WSHttpBinding serviceHost.AddServiceEndpoint(typeof(IOneWayCalculator), new WSHttpBinding(), ""); // Turn on the metadata behavior, this allows svcutil to get metadata for the service. ServiceMetadataBehavior smb = (ServiceMetadataBehavior) serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>(); if (smb == null) { smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true;

MCT: Luis Dueas

Pag 118 de 135

Manual de Windows Communication Foundation


serviceHost.Description.Behaviors.Add(smb); } // Open the ServiceHostBase to create listeners and start listening for messages. serviceHost.Open(); // The service can now be accessed. Console.WriteLine("The service is ready."); Console.WriteLine("Press <ENTER> to terminate service."); Console.WriteLine(); Console.ReadLine(); } } } } // client.cs using System; using System.ServiceModel; namespace Microsoft.ServiceModel.Samples { //The service contract is defined in generatedClient.cs, generated from the service by //the svcutil tool. //Client implementation code. class Client { static void Main() { // Create a client WSHttpBinding binding = new WSHttpBinding(); EndpointAddress epAddress = new EndpointAddress("http://localhost:8000/servicemodelsamples/service"); OneWayCalculatorClient client = new OneWayCalculatorClient(binding, epAddress); // Call the Add service operation. double value1 = 100.00D; double value2 = 15.99D; client.Add(value1, value2); Console.WriteLine("Add({0},{1})", value1, value2); // Call the Subtract service operation. value1 = 145.00D; value2 = 76.54D; client.Subtract(value1, value2); Console.WriteLine("Subtract({0},{1})", value1, value2); // Call the Multiply service operation. value1 = 9.00D; value2 = 81.25D; client.Multiply(value1, value2); Console.WriteLine("Multiply({0},{1})", value1, value2); // Call the Divide service operation. value1 = 22.00D; value2 = 7.00D; client.Divide(value1, value2); Console.WriteLine("Divide({0},{1})", value1, value2); // Call the SayHello service operation string name = "World"; string response = client.SayHello(name); Console.WriteLine("SayHello([0])", name); Console.WriteLine("SayHello() returned: " + response); //Closing the client gracefully closes the connection and cleans up resources client.Close(); } } }

MCT: Luis Dueas

Pag 119 de 135

Manual de Windows Communication Foundation

3.5.2.4. Cmo: Obtener Acceso al Servicio WSE 3.0 con un Cliente WCF
Los clientes de Windows Communication Foundation (WCF) son compatibles en cuanto a conexin con Web Service Enhancements (WSE) para los servicios de Microsoft .NET (3.0) cuando los clientes de WCF se configuran para utilizar la versin de agosto de 2004 de la especificacin WS-Addressing. Sin embargo, los servicios WSE 3.0 no admiten el protocolo de intercambio de metadatos (MEX), de modo que al utilizar Service Metadata Utility Tool (SvcUtil.exe) para crear una clase de cliente WCF, la configuracin de seguridad no se aplica al cliente WCF generado. Por consiguiente, debe especificar la configuracin de seguridad que el servicio del WSE 3.0 requiere una vez generado el cliente WCF. Puede aplicar esta configuracin de seguridad utilizando un enlace personalizado para tener en cuenta los requisitos de servicio de WSE 3.0 y los requisitos interoperables entre un servicio del WSE 3.0 y un cliente WCF. Estos requisitos de interoperabilidad incluyen el uso mencionado anteriormente de agosto de 2004 de la especificacin WS-Addressing y la proteccin predeterminada de mensajes de WSE 3.0 de SignBeforeEncrypt. La proteccin predeterminada de mensajes de WCF es SignBeforeEncryptAndEncryptSignature. En este tema se detalla cmo crear un enlace WCF que interopere con un servicio de WSE 3.0. WCF tambin proporciona un ejemplo que incorpora este enlace.

Obtener acceso al servicio Web WSE 3.0 con un cliente WCF


1. Ejecute Service Metadata Utility Tool (SvcUtil.exe) para crear un cliente WCF para el servicio Web de WSE 3.0. Para un servicio Web de WSE 3.0, se crea un cliente WCF. Dado que WSE 3.0 no admite el protocolo MEX, no se puede utilizar la herramienta para recuperar los requisitos de seguridad del Servicio Web. El desarrollador de aplicaciones debe agregar la configuracin de seguridad del cliente. 2. Cree una clase que represente un enlace que puede comunicarse con los servicios Web WSE 3.0. La clase siguiente forma parte del ejemplo Interoperating with WSE: a. Cree una clase que se derive de la clase Binding. En el siguiente ejemplo de cdigo se crea una clase denominada WseHttpBinding, que se deriva de la clase Binding. b. Agregue propiedades a la clase que especifiquen la asercin de llave en mano usada por el servicio WSE, si se requieren las claves derivadas, si se utilizan sesiones seguras, si se requieren confirmaciones de firmas, y la configuracin de proteccin de mensajes. En WSE 3.0, una asercin de llave en mano especifica los requisitos de seguridad para un cliente o servicio Web, similar al modo de autenticacin de un enlace en WCF. El ejemplo de cdigo siguiente define las propiedades SecurityAssertion, RequireDerivedKeys, EstablishSecurityContexty MessageProtectionOrder que especifican la asercin de llave en mano de WSE, si se requieren claves derivadas, si se utilizan sesiones seguras, si se requieren confirmaciones de firmas, y la configuracin de proteccin de mensajes, respectivamente. c. Anule el mtodo CreateBindingElements para definir las propiedades de enlace.

El ejemplo de cdigo siguiente especifica el transporte, codificacin de mensajes y configuracin de proteccin de mensajes obteniendo los valores de las propiedades SecurityAssertion y MessageProtectionOrder. 3. En el cdigo de la aplicacin cliente, agregue el cdigo para definir las propiedades de enlace. El ejemplo de cdigo siguiente especifica que el cliente WCF debe utilizar proteccin de mensajes y autenticacin tal y como define la asercin de seguridad de llave en mano AnonymousForCertificate de WSE 3.0. Adems, se requieren sesiones seguras y claves derivadas.

3.5.2.5. Comprender Cdigos de Cliente Generado

MCT: Luis Dueas

Pag 120 de 135

Manual de Windows Communication Foundation


ServiceModel Metadata Utility Tool (Svcutil.exe) genera cdigo de cliente y un archivo de configuracin de la aplicacin cliente para su uso en la generacin de aplicaciones cliente. En este tema se proporciona una descripcin de ejemplos de cdigo generados para los escenarios de contrato de servicios estndar.

Informacin general
Si utiliza Visual Studio para generar los tipos de cliente Windows Communication Foundation (WCF) para su proyecto, normalmente, no necesita examinar el cdigo de cliente generado. Si no usa un entorno de desarrollo que realice los mismos servicios automticamente, puede usar una herramienta como Svcutil.exe para generar el cdigo de cliente y, a continuacin, usar ese cdigo para desarrollar la aplicacin cliente. Dado que Svcutil.exe tiene varias opciones que modifican la informacin de tipo generada, este tema no discute todos los escenarios. Sin embargo, las tareas estndar siguientes implican la ubicacin del cdigo generado: Identificar las interfaces del contrato de servicio. Identificar la clase de cliente WCF. Identificar los tipos de datos. Identificar los contratos de devolucin de llamada para los servicios dplex. Identificar la interfaz de canal de contrato de servicio auxiliar. Buscar las interfaces del contrato de servicio Buscar las interfaces que modelan los servicios modelo, buscar las interfaces marcadas con el atributo System.ServiceModel.ServiceContractAttribute. A menudo este atributo puede ser difcil de buscar con una lectura rpida debido a la presencia de otros atributos y las propiedades explcitas establecidas en el propio atributo. Recuerde que la interfaz del contrato de servicio y la interfaz del contrato del cliente son dos tipos diferentes. El ejemplo de cdigo siguiente muestra el contrato de servicios original. Puede utilizar la interfaz del contrato de servicio generada junto con la clase System.ServiceModel.Channel Factory para crear un objeto de canal WCF con el que invocar las operaciones del servicio. Buscar las clases de cliente de WCF Para buscar la clase de cliente WCF que implementa el contrato de servicios que usted quiere utilizar, busque una extensin de System.ServiceModel.ClientBase, donde el parmetro de tipo es la interfaz del contrato de servicio que usted ha buscado previamente y que extiende esa interfaz. En el ejemplo de cdigo siguiente se muestra la clase ClientBase de tipo ISampleService. Puede utilizar esta clase de cliente WCF creando una nueva instancia de esta y llamando a los mtodos que implementa. Esos mtodos invocan la operacin del servicio con la que est diseado y est configurado para interactuar. Nota: Cuando SvcUtil.exe genera una clase de cliente WCF, agrega DebuggerStepThroughAttribute a la clase de cliente para evitar que los depuradores recorran la clase de cliente WCF. Buscar los tipos de datos Para encontrar los tipos de datos en el cdigo generado, el mecanismo ms bsico es identificar el nombre del tipo especificado en un contrato y buscar el cdigo para esa declaracin de tipo. Por ejemplo, el contrato siguiente especifica que SampleMethod puede devolver un error de SOAP de tipo microsoft.wcf.documentation.SampleFault. Al buscar SampleFault, se busca la declaracin de tipos siguiente.

MCT: Luis Dueas

Pag 121 de 135

Manual de Windows Communication Foundation


En este caso, el tipo de datos es el tipo de datos iniciado por una excepcin especfica en el cliente, FaultException donde el parmetro de tipo de datos es microsoft.wcf.documentation.SampleFault. Buscar los contratos de devolucin de llamada para los servicios dplex Si busca un contrato de servicios para el cual la interfaz de contrato especifica un valor para la propiedad System.ServiceModel.ServiceContractAttribute.CallbackContract, a continuacin, ese contrato especifica un contrato dplex. Los contratos dplex exigen a la aplicacin cliente que cree una clase de devolucin de llamada que implemente el contrato de devolucin de llamada y pase una instancia de esa clase a System.ServiceModel.DuplexClientBase comunicarse con el servicio. El contrato siguiente especifica un contrato de devolucin de llamada de tipo SampleDuplexHelloCallback. Buscar ese contrato de devolucin de llamada busca la interfaz siguiente que la aplicacin cliente debe implementar. Buscar interfaces de canal de contrato de servicios Al utilizar la clase ChannelFactory con una interfaz del contrato de servicios, debe convertirse a la interfaz System.ServiceModel.IClientChannel para abrir, cerrar, o anular el canal explcitamente. Para facilitar su funcionamiento, la herramienta Svcutil.exe tambin genera una interfaz auxiliar que implementa la interfaz del contrato de servicio y IClientChannel para permitir que usted interacte con la infraestructura del canal de cliente sin tener que convertirse. El cdigo siguiente muestra la definicin de un canal de cliente auxiliar que implementa el contrato de servicios anterior. o System.ServiceModel.DuplexChannelFactory utilizado para

3.5.2.6. Especificacin del Comportamiento de Tiempo de Ejecucin del Cliente


Los clientes Windows Communication Foundation (WCF), como los servicios Windows Communication Foundation (WCF), se pueden configurar para modificar el comportamiento de tiempo de ejecucin con el fin de satisfacer la aplicacin cliente. Tres atributos estn disponibles para especificar el comportamiento de tiempo de ejecucin del cliente. Los objetos de devolucin de llamada de cliente dplex pueden utilizar CallbackBehaviorAttribute y los atributos CallbackDebugBehavior para modificar su comportamiento de tiempo de ejecucin. El otro atributo, ClientViaBehavior, se puede utilizar para separar el destino lgico del destino de red inmediato. Adems, los tipos de devolucin de llamada de cliente dplex pueden utilizar algunos de los comportamientos de lado del servicio.

Utilizar CallbackBehaviorAttribute
Puede configurar o extender el comportamiento de ejecucin de una implementacin de contrato de devolucin de llamada en una aplicacin cliente utilizando la clase CallbackBehaviorAttribute. Este atributo realiza una funcin similar para la clase de devolucin de llamada como la clase ServiceBehaviorAttribute, con la excepcin de crear instancias del comportamiento y configuracin de la transaccin. La clase CallbackBehaviorAttribute se debe aplicar a la clase que implementa el contrato de devolucin de llamada. Si se aplica a una implementacin de contrato de no dplex, se produce una excepcin InvalidOperationException en tiempo de ejecucin. El ejemplo de cdigo siguiente muestra una clase CallbackBehaviorAttribute en un objeto de devolucin de llamada que usa el objeto SynchronizationContext para determinar el subproceso para calcular referencias, la propiedad ValidateMustUnderstand para exigir la validacin del mensaje y la propiedad IncludeExceptionDetailInFaults para devolver las excepciones como objetos FaultException al servicio para los propsitos de depuracin.

Utilizar CallbackDebugBehavior para habilitar el flujo de informacin de excepcin administrada

MCT: Luis Dueas

Pag 122 de 135

Manual de Windows Communication Foundation


Puede habilitar el flujo de informacin de excepcin administrada en un objeto de devolucin de llamada de cliente de nuevo al servicio para fines de depuracin estableciendo la propiedad IncludeExceptionDetailInFaults en true mediante programacin o desde un archivo de configuracin de la aplicacin. Devolver la informacin de excepcin administrada a los servicios puede suponer un riesgo para la seguridad porque los datos de la excepcin exponen informacin sobre la implementacin del cliente interna que los servicios desautorizados podran utilizar. Adems, aunque tambin se pueden establecer las propiedades CallbackDebugBehavior mediante programacin, puede ser fcil olvidarse de deshabilitar IncludeExceptionDetailInFaults en la implementacin. Debido a los problemas de seguridad implicados, se recomienda encarecidamente que: Utilice un archivo de configuracin de la aplicacin para establecer el valor de la propiedad IncludeExceptionDetailInFaults en true. lo haga solamente en escenarios de depuracin controlados. El ejemplo de cdigo siguiente muestra un archivo de configuracin del cliente que indica a WCF que devuelva la informacin de excepcin administrada de un objeto de devolucin de llamada de cliente en mensajes SOAP.

Utilizar el comportamiento de ClientViaBehavior


Puede utilizar el comportamiento ClientViaBehavior para especificar el Identificador uniforme de recursos para el cual se debera crear el canal de transporte. Utilice este comportamiento cuando el destino de la red inmediato no es el procesador de impresin previsto del mensaje. Esto habilita conversaciones de varios saltos cuando la aplicacin que realiza la llamada no conoce necesariamente el destino ltimo o cuando el encabezado de destino Via no es una direccin.

3.5.2.7. Configuracin de los Comportamientos del Cliente


Windows Communication Foundation (WCF) configura los comportamientos de dos maneras: haciendo referencia a las configuraciones de comportamiento (que se definen en la seccin <behavior> de un archivo de configuracin de la aplicacin cliente) o mediante programacin, en la aplicacin que realiza la llamada. En este tema se describen ambos mtodos. Al usar un archivo de configuracin, la configuracin del comportamiento es una coleccin con nombre de valores de configuracin. El nombre de cada configuracin de comportamiento debe ser nico. Esta cadena se usa en el atributo behaviorConfiguration de una configuracin de extremo para vincular el extremo al comportamiento.

Ejemplo
El cdigo de configuracin siguiente define un comportamiento llamado myBehavior. El extremo de cliente hace referencia a este comportamiento en el atributo behaviorConfiguration. <configuration> <system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="myBehavior"> <clientVia /> </behavior> </endpointBehaviors> </behaviors> <bindings> <basicHttpBinding> <binding name="myBinding" maxReceivedMessageSize="10000" /> </basicHttpBinding> </bindings> <client>

MCT: Luis Dueas

Pag 123 de 135

Manual de Windows Communication Foundation


<endpoint address="myAddress" binding="basicHttpBinding" bindingConfiguration="myBinding" behaviorConfiguration=myBehavior contract="myContract"/> </client> </system.serviceModel> </configuration>

Uso de comportamientos mediante programacin


Tambin puede configurar o insertar los comportamientos mediante programacin buscando la propiedad Behaviors adecuada en el objeto de cliente Windows Communication Foundation (WCF) o en el objeto de generador de canal de cliente antes de abrir el cliente.

3.5.3. Proteccin de Clientes


En Windows Communication Foundation (WCF), el servicio dicta los requisitos de seguridad para los clientes. Es decir, el servicio especifica qu modo de seguridad utilizar, y si el cliente debe proporcionar una credencial o no. El proceso de proteccin de un cliente, por consiguiente, es simple: utilice los metadatos obtenidos del servicio (si se publica) y genere un cliente. Los metadatos especifican cmo configurar el cliente. Si el servicio requiere que el cliente suministre una credencial, debe obtener una credencial que se ajuste al requisito. En este tema se discute el proceso en ms profundidad.

El servicio especifica la seguridad


De forma predeterminada, los enlaces WCF tienen caractersticas de seguridad habilitadas. (La excepcin es el BasicHttpBinding.) Por tanto, si el servicio se cre mediante WCF, hay una mayor probabilidad de que implementar la seguridad para asegurar la autenticacin, confidencialidad e integridad. En ese caso, los metadatos que proporciona el servicio indicarn lo que se requiere para establecer un canal de comunicacin seguro. Si los metadatos del servicio no incluyen ningn requisito de seguridad, no hay ninguna manera de imponer un esquema de seguridad, como Secure Sockets Layer (SSL) sobre HTTP, en un servicio. Si, sin embargo, el servicio requiere que el cliente proporcione una credencial, el desarrollador, implementador o administrador del cliente, debe proporcionar la credencial real que el cliente utilizar para autenticarse en el servicio.

Obtencin de los metadatos


Al crear un cliente, el primer paso es obtener los metadatos para el servicio con el que el cliente se comunicar. Esto se puede llevar a cabo de dos maneras. Primero, si el servicio publica un extremo de intercambio de metadatos (MEX) o pone sus metadatos a disposicin sobre HTTP o HTTPS, puede descargar los metadatos mediante ServiceModel Metadata Utility Tool (Svcutil.exe), que genera ambos archivos de cdigo para un cliente, as como un archivo de configuracin. Si el servicio no publica un extremo MEX y tampoco pone sus metadatos a disposicin sobre HTTP o HTTPS, debe ponerse en contacto con el creador del servicio para obtener la documentacin que describe los requisitos de seguridad y los metadatos. Nota: Se recomienda que los metadatos procedan de una fuente de confianza y que no se manipulen. Los metadatos recuperados utilizando el protocolo HTTP se envan en texto no cifrado y se pueden manipular. Si el servicio utiliza HttpsGetEnabled y las propiedades HttpsGetUrl, utilice la direccin URL que el creador del servicio proporcion para descargar los datos mediante el protocolo HTTPS.

Validacin de la seguridad
Las fuentes de metadatos pueden dividirse en dos amplias categoras: fuentes de confianza y fuentes que no son de confianza. Si confa en una fuente y se ha descargado el cdigo de cliente y otros metadatos desde ese extremo MEX seguro de la fuente, puede generar el cliente, proporcionarle las credenciales correctas y ejecutarlo sin ms preocupaciones. Sin embargo, si elige descargar un cliente y metadatos desde un origen del que sabe poco, asegrese de validar la las medidas de seguridad que utiliza el cdigo. Por ejemplo, no debe crear simplemente un cliente que enve su informacin personal o financiera a un servicio a menos que el servicio exija confidencialidad e

MCT: Luis Dueas

Pag 124 de 135

Manual de Windows Communication Foundation


integridad (como mnimo). Debera confiar en el propietario del servicio hasta el punto que est dispuesto a divulgar tal informacin porque l o ella podrn ver tal informacin. Como regla, por consiguiente, al utilizar cdigo y metadatos desde una fuente que no sea de confianza, compruebe el cdigo y los metadatos para asegurarse de que cumple el nivel de seguridad que requiere.

Establecimiento de una credencial de cliente


El establecimiento de una credencial de cliente en un cliente consta de dos pasos: 1. Determine el tipo de credencial de cliente que requiere el servicio. Esto se logra mediante uno de los dos mtodos de siguientes. Primero, si tiene documentacin del creador del servicio, debera especificar el tipo de credencial de cliente (si hubiese) que el servicio requiere. Segundo, si slo tiene un archivo de configuracin generado por la herramienta Svcutil.exe, puede examinar los enlaces individuales para determinar qu tipo de credencial se requiere. 2. Especifique una credencial de cliente real. La credencial de cliente real se denomina un valor de credencial de cliente para distinguirla del tipo. Por ejemplo, si el tipo de credencial de cliente especifica un certificado, debe proporcionar un certificado X.509 que emita una entidad de certificacin en la que el servicio confe. Determinacin del tipo de credencial de cliente Si tiene el archivo de configuracin que gener la herramienta Svcutil.exe, examine la seccin <bindings> para determinar qu tipo de credencial de cliente se requiere. Dentro de la seccin hay elementos de enlace que especifican los requisitos de seguridad. Especficamente, examine el elemento <security> de cada enlace. Ese elemento incluye el atributo mode, que puede establecer en uno de tres valores posibles (Message, Transporto TransportWithMessageCredential). El valor del atributo determina el modo y el modo determina cul de los elementos secundarios es significativo. El elemento <security> puede contener un elemento <transport> o <message> , o ambos. El elemento significativo es el que coincide con el modo de seguridad. Por ejemplo, el siguiente cdigo especifica que el modo de seguridad es "Message", y que el tipo de credencial de cliente para el elemento <message> es "Certificate". En este caso se puede ignorar el elemento <transport>. Sin embargo, el elemento <message> especifica que se debe proporcionar un certificado X.509. <wsHttpBinding> <binding name="WSHttpBinding_ICalculator"> <security mode="Message"> <transport clientCredentialType="Windows" realm="" /> <message clientCredentialType="Certificate" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true" /> </security> </binding> </wsHttpBinding> Tenga en cuenta que si el atributo clientCredentialType est establecido en "Windows", tal y como se muestra en el ejemplo siguiente, no es necesario proporcionar un valor de credencial real. Esto se debe a que la seguridad integrada de Windows proporciona la credencial real (un token de Kerberos) de la persona que est ejecutando el cliente. <security mode="Message"> <transport clientCredentialType="Windows " realm="" /> </security> Establecimiento del valor de credencial de cliente Si se determina que el cliente debe proporcionar una credencial, utilice el mtodo adecuado para configurar el cliente. Por ejemplo, para establecer un certificado de cliente, utilice el mtodo SetCertificate.

MCT: Luis Dueas

Pag 125 de 135

Manual de Windows Communication Foundation


Un formulario comn de credencial es el certificado X.509. Puede proporcionar la credencial de dos maneras: Programndolo en su cdigo de cliente (mediante el mtodo SetCertificate ). Agregando una seccin <behaviors> del archivo de configuracin para el cliente y utilizando el elemento clientCredentials (se muestra abajo). Estableciendo un valor <clientCredentials> en cdigo Para establecer un valor <clientCredentials> en cdigo, debe obtener acceso a la propiedad ClientCredentials de la clase ClientBase. La propiedad devuelve un objeto ClientCredentials que permite el acceso a varios tipos de credenciales, tal y como se muestra en la tabla siguiente. Propiedad ClientCredential ClientCertificate

Descripcin Devuelve una X509CertificateInitiatorClientCredential.

Notas Representa un certificado X.509 proporcionado por el cliente para autenticarse en el servicio. Representa una credencial de sintaxis de HTTP. La credencial es un hash del nombre de usuario y contrasea. Representa un token de seguridad personalizado emitido por un servicio de tokens de seguridad, utilizado normalmente en escenarios de federacin. Representa una credencial del mismo nivel para la participacin en una malla del mismo nivel en un dominio de Windows. Representa un certificado X.509 proporcionado por el servicio en una negociacin fuera de banda. Representa un par de nombre de usuario y contrasea. Representa una credencial de cliente de Windows (una credencial de Kerberos). Las propiedades de la clase son de slo lectura.

HttpDigest

Devuelve una HttpDigestClientCredential.

IssuedToken

Devuelve una IssuedTokenClientCredential.

Peer

Devuelve una PeerCredential

ServiceCertificate

Devuelve una X509CertificateRecipientClientCredential.

UserName

Devuelve una UserNamePasswordClientCredential Devuelve una WindowsClientCredential

Windows

Estableciendo un valor <clientCredentials> mediante configuracin Los valores de credencial se especifican utilizando un comportamiento de extremo como elementos secundarios del elemento <clientCredentials>. El elemento utilizado depende del tipo de credencial de cliente. Por ejemplo, el ejemplo siguiente muestra la configuracin para establecer un certificado X.509 mediante <clientCertificate> of <clientCredentials> Element. <configuration> <system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="myEndpointBehavior"> <clientCredentials> <clientCertificate findvalue="myMachineName" storeLocation="Current" X509FindType="FindBySubjectName" /> </clientCredentials> </behavior> </behaviors> </system.serviceModel>

MCT: Luis Dueas

Pag 126 de 135

Manual de Windows Communication Foundation


</configuration> Para establecer la credencial del cliente mediante configuracin, agregue un elemento <endpointBehaviors> al archivo de configuracin. Adems, el elemento de comportamiento agregado se debe vincular al extremo del servicio utilizando el atributo behaviorConfiguration del elemento <endpoint> tal y como se muestra en el ejemplo siguiente. El valor del atributo behaviorConfiguration debe coincidir con el valor del atributo name del comportamiento. <configuration> <system.serviceModel> <client> <endpoint address="http://localhost/servicemodelsamples/service.svc" binding="wsHttpBinding" bindingConfiguration="Binding1" behaviorConfiguration="myEndpointBehavior" contract="Microsoft.ServiceModel.Samples.ICalculator" /> </client> </system.serviceModel> </configuration> Nota: Algunos de los valores de credenciales de cliente no se pueden establecer utilizando los archivos de configuracin de la aplicacin, por ejemplo, el nombre de usuario y la contrasea, o los valores de usuario y contrasea de Windows. Tales valores de credenciales slo se pueden especificarse mediante cdigo. Nota: Se omite ClientCredentialType cuando SecurityMode est establecido en "TransportWithMessage Credential", tal y como se muestra en la configuracin del ejemplo siguiente. <wsHttpBinding> <binding name="PingBinding"> <security mode="TransportWithMessageCredential" > <message clientCredentialType="UserName" establishSecurityContext="false" negotiateServiceCredential="false" /> <transport clientCredentialType="Certificate" /> </security> </binding> </wsHttpBinding>

3.5.3.1. Cmo: Especificar los Valores de Credenciales de Cliente


Con Windows Communication Foundation (WCF), puede especificar cmo un cliente se autentica al servicio. Por ejemplo, puede estipular que el cliente se autentique al servicio con un certificado. Este ejemplo establece el modo de seguridad en transporte y establece el tipo de credencial de cliente en certificado. El proceso se desarrolla en tres partes: 1. 2. El programador del servicio especifica el tipo de credencial que el cliente debe proporcionar. El programador del cliente utiliza ServiceModel Metadata Utility Tool (Svcutil.exe) para consultar sus metadatos (cdigo de cliente del servicio y archivo de configuracin) en el servicio. 3. El programador del cliente crea la aplicacin cliente y proporciona un valor de credencial, en el cdigo o en la configuracin, que coincide con el tipo de credencial, como se estipula en los metadatos.

Cdigo del servicio


Para especificar el tipo de credencial de cliente en el servicio en cdigo 1. 2. 3. Agregue las referencias siguientes a su cdigo. Cree una instancia de un enlace. Este ejemplo utiliza NetTcpBinding. Establezca el modo de seguridad, segn corresponda. Este ejemplo establece el modo en Transport.

MCT: Luis Dueas

Pag 127 de 135

Manual de Windows Communication Foundation


4. Establezca ClientCredentialType en una credencial, segn corresponda. Este ejemplo establece el tipo en un certificado. 5. Cree una instancia de ServiceHost utilizando su tipo de servicio en el constructor. Por motivos de simplicidad, el cdigo para mostrar la interfaz de servicio y su implementacin no se muestra aqu. 6. Establezca el valor de credencial para el servicio. Este ejemplo utiliza el mtodo SetCertificate de la clase X509CertificateRecipientServiceCredential. Para especificar el tipo de credencial de cliente en el servicio en configuracin 1. 2. Agregue un enlace apropiado al elemento <bindings>. Este ejemplo utiliza <netTcpBinding Element>. Agregue <security> of <netTcpBinding> al enlace. Asegrese de establecer el atributo name necesario en un valor adecuado. 3. 4. Establezca el atributo mode en un valor adecuado. Este ejemplo utiliza el modo "Message". Agregue un transporte o elemento de mensaje, segn corresponda, al enlace de seguridad. Este ejemplo utiliza <message> element of <netTcpBinding>. 5. Establezca el atributo clientCredential en el tipo de credencial deseado. Este ejemplo utiliza Certificate. <bindings> <netTcpBinding> <binding name="TcpBindingWithCredential"> <security mode="Message"> <message clientCredentialType="Certificate" /> </security> </binding> </netTcpBinding> </bindings> Al crear el elemento de extremo, utilice el valor de atributo bindingConfiguration para especificar la configuracin de enlace, como se muestra en el cdigo siguiente. <endpoint address="myEndpointAddress" binding="netTcpBinding" bindingConfiguration="TcpBindingWithCredential" name="netTcpBinding_ICalculator" contract="Microsoft.ServiceModel.Samples.ICalculator" />

6.

Cdigo de cliente
Los procedimientos siguientes muestran cmo establecer el valor de credencial de cliente en el cliente en cdigo y configuracin. Esto presupone que ha utilizado ServiceModel Metadata Utility Tool (Svcutil.exe) para devolver los metadatos (cdigo y configuracin) del servicio. Para especificar el valor de credencial de cliente en el cliente en cdigo 1. Utilice ServiceModel Metadata Utility Tool (Svcutil.exe) para generar cdigo y configuracin del servicio. 2. 3. Cree una instancia del cliente WCF utilizando el cdigo generado. En la clase de cliente, establezca la propiedad ClientCredentials de la clase ClientBase en un valor adecuado. Este ejemplo establece la propiedad en un certificado X.509 utilizando el mtodo SetCertificate de la clase X509CertificateInitiatorClientCredential. Puede utilizar cualquiera de las enumeraciones de la clase X509FindType. El nombre de sujeto se utiliza aqu en caso de que se cambie el certificado (debido a una fecha de caducidad). Utilizar el nombre de sujeto permite a la infraestructura encontrar de nuevo el certificado. Para especificar el valor de credencial de cliente en el cliente en configuracin 1. 2. Agregue un elemento <behavior> of <endpointBehaviors> al elemento <behaviors>. Agregue un elemento <serviceCredentials> al elemento <behaviors>. Asegrese de establecer el atributo name necesario en un valor adecuado. 3. Agregue un elemento <clientCertificate> of <serviceCredentials> al elemento <clientCredentials>.

MCT: Luis Dueas

Pag 128 de 135

Manual de Windows Communication Foundation


4. Establezca los atributos siguientes en los valores adecuados: storeLocation, storeName,

x509FindTypey findValue, como se muestra en el cdigo siguiente. <behaviors> <endpointBehaviors> <behavior name="endpointCredential"> <clientCredentials> <clientCertificate findValue="Contoso.com" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName" /> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> 5. Al configurar el cliente, especifique el comportamiento estableciendo el atributo behaviorConfiguration del elemento <endpoint>, como se muestra en el cdigo siguiente. El elemento del extremo es un elemento secundario del elemento <client>. Especifique tambin el nombre de la configuracin de enlace estableciendo el atributo bindingConfiguration en el enlace para el cliente. Si est utilizando un archivo de configuracin generado, se genera automticamente el nombre del enlace. En este ejemplo, el nombre es "tcpBindingWithCredential". <client> <endpoint name ="" address="net.tcp://contoso.com:8036/aloha" binding="netTcpBinding" bindingConfiguration="tcpBindingWithCredential" behaviorConfiguration="credentialBehavior" /> </client>

3.6. Introduccin a la Extensibilidad


El modelo de aplicacin Windows Communication Foundation (WCF) est diseado para resolver la mayor parte de los requisitos de comunicacin de cualquier aplicacin distribuida. No obstante, siempre hay escenarios con los que el modelo de aplicacin predeterminado y las implementaciones proporcionadas por sistema no son compatibles. El modelo de extensibilidad WCF est diseado para admitir escenarios personalizados permitindole modificar el comportamiento del sistema en cada nivel, incluso hasta el punto de reemplazar todo el modelo de aplicacin. Este tema describe las distintas reas de extensin e indica dnde obtener ms informacin acerca de cada una de ellas.

reas que pueden extenderse


Puede extenderse: El tiempo de ejecucin de la aplicacin. De este modo se extiende la distribucin y el procesamiento de mensajes para la aplicacin. Esta rea tambin incluye la extensin del sistema de seguridad, el sistema de metadatos, el sistema de serializacin, y los enlaces y elementos de enlace que conectan la aplicacin con el sistema del canal subyacente. El canal y su tiempo de ejecucin. As se extiende el sistema que funciona en el nivel de mensaje, proporcionando compatibilidad con el protocolo, el transporte y la codificacin. El tiempo de ejecucin del host. Se extiende la relacin del dominio de aplicacin de hospedaje al tiempo de ejecucin del canal y de la aplicacin. Extender el tiempo de ejecucin de la aplicacin En aplicaciones WCF, existe una diferencia entre los mensajes destinados a un canal correspondiente y los mensajes destinados a la propia aplicacin. Los mensajes del canal admiten alguna funcionalidad relacionada con el canal, como establecer una conversacin segura o una sesin de confianza. Estos mensajes no estn disponibles para el tiempo de ejecucin de la aplicacin; se procesan antes de que se implique el nivel de la aplicacin.

MCT: Luis Dueas

Pag 129 de 135

Manual de Windows Communication Foundation


Los mensajes de la aplicacin contienen datos destinados a un cliente u operacin del servicio que usted o su cliente cre. Estos mensajes estn disponibles para el sistema de extensin del nivel de la aplicacin en forma de mensaje u objeto, dependiendo de sus necesidades. Todos los mensajes atraviesan el sistema del canal; slo los mensajes de la aplicacin se pasan desde el sistema del canal a la aplicacin. Para crear una nueva funcionalidad en el nivel del canal, debe extender el sistema del canal. Para crear una nueva funcionalidad en el nivel de la aplicacin, debe extender el tiempo de ejecucin del servicio o del cliente (los distribuidores y generadores de canales, respectivamente). Extensin de la seguridad Para generar mecanismos de seguridad personalizados, como tokens y credenciales, debe extender el sistema de seguridad. Extensin de metadatos Para exponer sus metadatos de manera diferente a la predeterminada, es necesario extender el sistema de metadatos. Extender la serializacin Para generar los codificadores personalizados, proporcionar suplentes de datos u otro trabajo que implique la personalizacin de datos transferidos, es necesario extender el sistema de serializacin. Extensin de enlaces Para asociar canales de transporte o de protocolo con el nivel de aplicacin, debe extender el sistema de enlace. Extender el sistema del canal Para crear canales compatibles con transportes personalizados o la funcionalidad de un protocolo. Extensin del servicio de hospedaje del sistema Para modificar el modelo de la aplicacin de todo el servicio, es necesario extender la clase System.Service Model.ServiceHostBase. Para modificar la relacin entre el dominio de aplicacin de hospedaje y el host del servicio, es necesario extender la clase System.ServiceModel.Activation.ServiceHostFactory.

3.7. Inicio Rpido de Solucin de Problemas de WCF


Este tema utiliza un formato pregunta y respuesta para describir algunos de los problemas ms comunes que se producen, qu puede hacer usted para resolverlos y dnde buscar ms informacin sobre el problema.

Preguntas
Pregunta: A veces recibo MessageSecurityException en la segunda solicitud si mi cliente est inactivo durante algn tiempo despus de la primera solicitud. Qu sucede? Se puede producir un error en la segunda solicitud principalmente por dos razones: (1) se ha agotado de tiempo de espera de la sesin o (2) se recicla el servidor web que est hospedando el servicio. En el primer caso, la sesin es vlida hasta que se agota el tiempo de espera del servicio. Cuando el servicio no recibe una solicitud del cliente dentro del perodo de tiempo especificado en el enlace del servicio (ReceiveTimeout), el servicio finaliza la sesin de seguridad. Los siguientes mensajes del cliente producen MessageSecurityException. El cliente debe restablecer una sesin segura con el servicio para enviar los futuros mensajes o utilizar un token de contexto de seguridad con estado. Los tokens de contexto de seguridad con estado tambin permiten que una sesin segura sobreviva a un servidor web que est siendo reciclado.

MCT: Luis Dueas

Pag 130 de 135

Manual de Windows Communication Foundation


Tambin puede deshabilitar las sesiones seguras. Al utilizar el enlace WsHttpBinding, puede establecer la propiedad establishSecurityContext en false para deshabilitar las sesiones seguras. Para deshabilitar las sesiones seguras para otros enlaces, debe crear un enlace personalizado. Antes de aplicar cualquiera de estas opciones, debe entender los requisitos de seguridad de su aplicacin. Pregunta: Mi servicio empieza a rechazar nuevos clientes despus de la interaccin de, aproximadamente, 10 clientes. Qu sucede? De forma predeterminada, los servicios pueden tener slo 10 sesiones simultneas. Por tanto, si los enlaces del servicio utilizan sesiones, el servicio acepta nuevas conexiones de cliente hasta que alcance ese numero, despus del cual rechaza nuevas conexiones de cliente hasta que finaliza una de las sesiones actuales. Puede admitir ms clientes de varias maneras. Si su servicio no requiere sesiones, no utilice un enlace con sesin. Otra opcin es aumentar el lmite de sesin cambiando el valor de la propiedad MaxConcurrentSessions al nmero apropiado a su circunstancia. Pregunta: Puedo cargar mi configuracin de servicio desde otra parte que no sea el archivo de configuracin de la aplicacin WCF? S, sin embargo, tambin tiene la que crear una de clase ServiceHost personalizada pero que invalida puede el mtodo ApplyConfiguration. Dentro de ese mtodo, puede llamar a la base para cargar primero la configuracin (si desea cargar informacin configuracin estndar), tambin reemplazar completamente el sistema de carga de configuracin. Tenga en cuenta que si desea cargar la configuracin desde un archivo de configuracin que es diferente del archivo de configuracin de la aplicacin, debe analizar usted mismo el archivo de configuracin y cargar la configuracin. El siguiente ejemplo de cdigo muestra cmo invalidar el mtodo ApplyConfiguration y configurar directamente un extremo. public class MyServiceHost : ServiceHost { public MyServiceHost(Type serviceType, params Uri[] baseAddresses) : base(serviceType, baseAddresses) { Console.WriteLine("MyServiceHost Constructor"); } protected override void ApplyConfiguration() { string straddress = GetAddress(); Uri address = new Uri(straddress); Binding binding = GetBinding(); base.AddServiceEndpoint(typeof(IData), binding, address); } string GetAddress() { return "http://MyMachine:7777/MyEndpointAddress/"; } Binding GetBinding() { WSHttpBinding binding = new WSHttpBinding(); binding.Security.Mode = SecurityMode.None; return binding; } } Pregunta: Mi servicio y cliente funcionan muy bien, pero no puedo conseguir que funcionen cuando el cliente est en otro PC. Qu sucede? Dependiendo de la excepcin, puede haber varios problemas: Puede que necesite cambiar las direcciones de extremo del cliente al nombre de host y no el "localhost". Puede que necesite abrir el puerto a la aplicacin. Si su cliente est utilizando las credenciales de Windows y la excepcin es SecurityNegotiation Exception, configure Kerberos tal y como se muestra a continuacin.

MCT: Luis Dueas

Pag 131 de 135

Manual de Windows Communication Foundation


1. Agregue las credenciales de identidad al elemento de extremo en el archivo del cliente App.config: <endpoint address="http://MyServer:8000/MyService/" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServiceExample" contract="IServiceExample" behaviorConfiguration="ClientCredBehavior" name="WSHttpBinding_IServiceExample"> <identity> <userPrincipalName value="name@corp.contoso.com"/> </identity> </endpoint> 2. Ejecute el servicio autohospedado bajo el Sistema o cuenta de NetworkService. Puede ejecutar este comando para crear una ventana de comandos bajo la cuenta del sistema: at 12:36 /interactive "cmd.exe" 3. Hospede el servicio bajo IIS (Servicios de Internet Information Services) (IIS) que, de forma predeterminada, utiliza la cuenta del nombre principal de servicio (SPN). 4. Registre un nuevo SPN con el dominio utilizando SetSPN. Tenga en cuenta que, para ello, necesitar ser un administrador de dominio. Pregunta: Cuando inicio una <Excepcin FaultException> donde el tipo es una excepcin, siempre recibo un tipo FaultException general en el cliente y no el tipo genrico. Qu sucede? Es muy recomendable que cree su propio tipo de datos de error personalizado y lo declare como el tipo de detalle en su contrato de error. La razn es que utilizando los tipos de excepcin proporcionados por el sistema: Crea una dependencia de tipo que quita uno de los puntos fuertes ms grandes de las aplicaciones orientadas al servicio. No puede depender de las excepciones que serializan de una manera estndar. Puede que algunas, como SecurityException no se puedan serializar en absoluto. Expone los datos de implementacin interna a los clientes. Si est depurando una aplicacin, sin embargo, puede serializar informacin de excepcin y devolverla al cliente utilizando la clase ServiceDebugBehavior. Pregunta: Parece que las operaciones unidireccionales y las operaciones solicitud-respuesta devuelven aproximadamente la misma velocidad cuando la respuesta no contiene datos. Qu sucede? Especificando que una operacin es unidireccional slo significa que el contrato de operacin acepta un mensaje de entrada y no devuelve un mensaje de salida. En WCF, todas las invocaciones del cliente vuelven cuando los datos salientes se han escrito en la conexin o se produce una excepcin. Las operaciones unidireccionales funcionan de la misma manera y se pueden iniciar si el servicio no se puede localizar o se pueden bloquear si el servicio no est preparado para aceptar los datos de la red. Normalmente en WCF, esto produce llamadas unidireccionales que vuelven al cliente ms rpidamente que la solicitud-respuesta; pero las condiciones que ralentizan el envo de los datos salientes a travs de la red ralentizan las operaciones unidireccionales, as como las operaciones solicitud-respuesta. Pregunta: Estoy utilizando un certificado X.509 con mi servicio y obtengo un System.Security.Cryptography.CryptographicException. Qu sucede? Esto se produce normalmente despus de cambiar la cuenta de usuario bajo la cual se ejecuta el proceso de trabajo de IIS. Por ejemplo, en Windows XP, si cambia la cuenta de usuario predeterminada que Aspnet_wp.exe ejecuta desde ASPNET a una cuenta de usuario personalizada, puede ver este error. Si utiliza una clave privada, el proceso que utiliza necesitar tener los permisos para tener acceso al archivo que almacena esa clave.

MCT: Luis Dueas

Pag 132 de 135

Manual de Windows Communication Foundation


Si ste es el caso, debe dar los privilegios de acceso de lectura a la cuenta del proceso para el archivo que contiene la clave privada. Por ejemplo, si el proceso de trabajo de IIS se est ejecutando bajo la cuenta Bob, entonces, necesitar proporcionar a Bob el acceso de lectura al archivo que contiene la clave privada. Pregunta: He cambiado el primer parmetro de una operacin de maysculas a minsculas; ahora mi cliente produce una excepcin. Qu sucede? El valor de los nombres de parmetro en la firma de la operacin forma parte del contrato y distingue entre maysculas y minsculas. Utilice el atributo System.ServiceModel.MessageParameterAttribute cuando necesite distinguir entre el nombre de parmetro local y los metadatos que describen la operacin para las aplicaciones del cliente. Pregunta: Estoy utilizando una de mis herramientas de seguimiento y obtengo EndpointNotFoundException. Qu sucede? Si est utilizando una herramienta de seguimiento que no es el mecanismo de seguimiento WCF proporcionado por el sistema y usted recibe EndpointNotFoundException que indica que haba una desigualdad de filtro de direccin, necesita utilizar la clase ClientViaBehavior para dirigir los mensajes a la utilidad de seguimiento y hacer que la utilidad redirija esos mensajes a la direccin de servicio. La clase ClientViaBehavior modifica Via que dirige el encabezado para especificar la siguiente direccin de red de forma independiente con respecto al receptor ltimo, indicado por To que dirige el encabezado. Cuando haga esto, sin embargo, no cambie la direccin del extremo, la cual se utiliza para establecer el valor To. El ejemplo de cdigo siguiente muestra un ejemplo de archivo de configuracin de cliente. <endpoint address=http://localhost:8000/MyServer/ binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMyContract" behaviorConfiguration="MyClient" contract="IMyContract" name="WSHttpBinding_IMyContract"> </endpoint> <behaviors> <endpointBehaviors> <behavior name="MyClient"> <clientVia viaUri="http://localhost:8001/MyServer/"/> </behavior> </endpointBehaviors> </behaviors> Pregunta: Cul es la direccin base? Cmo se relaciona con una direccin de extremo? Una direccin base es la direccin de raz para una clase ServiceHost. De forma predeterminada, si agrega una clase ServiceMetadataBehavior en su configuracin de servicio, el Lenguaje de descripcin de servicios web (WSDL) para todos los extremos que la host publica se recuperan de la direccin base de Http, ms cualquier direccin proporcionada relativa al comportamiento de los metadatos, ms"? wsdl." Si est familiarizado con ASP.NET e IIS, la direccin base es equivalente al directorio virtual. Pregunta: Cmo expongo varios extremos a un servicio? Puede hacerlo agregando los elementos <endpoint> al elemento <service> en un archivo de configuracin de aplicacin o llevando a cabo los pasos equivalentes mediante programacin. Pregunta: Necesito implementar mi servicio a un servidor HTTP si deseo utilizar Http como el transporte? No. Los enlaces proporcionados por el sistema incluyen varios que admiten transportes HTTP cuando se utilizan desde cualquier tipo de aplicacin host. Pregunta: Cul es el comportamiento predeterminado de un servicio que utiliza enlaces estndar? Depende del enlace estndar elegido. En general, el comportamiento predeterminado de los enlaces que utilizan sesiones es crear una nueva instancia de servicio para cada nuevo cliente y las llamadas posteriores de un cliente determinado se dirigen hacia la instancia del servicio asociada.

MCT: Luis Dueas

Pag 133 de 135

Manual de Windows Communication Foundation


Pregunta: Hay una manera fcil de ver la asignacin de caractersticas a los enlaces? Por ejemplo, cmo puedo indicar qu enlaces admiten transacciones, seguridad, etc.? S. Consulte System-Provided Bindings. Pregunta: Cmo paso los tipos de datos personalizados desde un servicio a un cliente? Los tipos de datos pasados entre dos extremos deben ser serializables y el mecanismo de serializacin ms fcil y ms interoperable para los servicios es utilizar DataContractAttribute y las clases DataMemberAttribute. Pregunta: Cundo debera configurar algo utilizando un archivo de configuracin y cundo debera configurarlo en cdigo? Dado que un archivo de configuracin de aplicacin permite al programador colocar las decisiones sobre configuracin en tiempo de ejecucin en manos del implementador, las decisiones que los implementadores nunca deberan tomar son buenas candidatas para la configuracin en el cdigo de producto. Los implementadores pueden ser individuos que instalan los programas en sus propios equipos o administradores de empresas que utilizan las directivas de grupo de la empresa para modificar los archivos de configuracin del equipo y bloquearlos contra la modificacin local. Pregunta: Por qu debera llamar al mtodo Close en el objeto de cliente de WCF? Llamar Close en el objeto de cliente WCF habilita el cliente y servicio a concluir correctamente la conversacin y reciclar los recursos asociados a l. Adems, si est utilizando sesiones, llamar Close puede ser la manera ms rpida de determinar si la sesin ha fallado desde la ltima llamada, un escenario que puede tener significado para su aplicacin cliente. Pregunta: Por qu mi servicio no se ejecuta como se espera incluso cundo parece haber ningn problema en el cdigo? Si su aplicacin de servicio se configura utilizando un archivo de configuracin de aplicacin, debera examinar ese archivo para determinar si algn elemento de configuracin o el atributo est modificando el comportamiento de ejecucin de forma inesperada. En particular, el comportamiento de tiempo de ejecucin depende bastante del enlace que implementa el contrato en un extremo. Confirme que el enlace en el archivo de configuracin admite las caractersticas que desea y en el modo que espera. Si parece que no hay ningn problema en el archivo de configuracin, puede continuar examinando el comportamiento de tiempo de ejecucin de su aplicacin utilizando caractersticas de diagnstico, como registro y seguimiento. Pregunta: Cul es la mejor manera de indicar a un cliente que algo ha fallado en el servicio? La mejor manera es agregar una clase FaultContractAttribute con un tipo de datos de error serializable personalizado a su operacin. A continuacin, cuando su operacin se encuentra con una condicin de error que puede detectar, inicia un nuevo FaultException donde el parmetro de tipo es el tipo de error serializable. Pregunta: Qu informacin es correcta para devolver al cliente? Devuelva slo la informacin que los clientes de su servicio necesitan saber. Como diseador del servicio, debera proporcionar slo esa cantidad de informacin y nada ms para minimizar la exposicin de datos de implementacin internos a clientes no autorizados. sta es la razn por la cual se recomienda encarecidamente que no devuelva los objetos Exception en sus errores de SOAP. Pregunta: Cmo detecta mi aplicacin cliente que se ha cerrado una conexin a un servicio? Puede administrar los eventos de cambio de estado de canal de cliente CommunicationObject; sin embargo, que se le notifique del cierre o fallo de un canal depende de la implementacin del canal. Por ejemplo, una clase NetTcpBinding le notifica bastante rpidamente que el canal est cerrado o ha fallado porque la duracin de su sesin est asociada a la duracin del socket subyacente. Sin embargo, mientras intenta restablecer la sesin, puede que no se le notifique durante algn tiempo un enlace con sesin diseado para proteger la aplicacin contra pequeas perturbaciones de la red, como la

MCT: Luis Dueas

Pag 134 de 135

Manual de Windows Communication Foundation


sesin proporcionada por la clase ReliableSessionBindingElement. Dado que ste es el caso, se recomienda que no intente detectar directamente la desconexin. En su lugar, trate la sesin como una conversacin. Si abre el canal, realiza varias llamadas de operacin y cierra correctamente el canal, puede suponer que el canal no se cerr inesperadamente. Pregunta: Cmo agrego una direccin de extremo que tiene informacin adicional? Cuando quiere asociar mediante programacin las direcciones del extremo complejas (por ejemplo, si necesita especificar mediante programacin una clase EndpointAddress que contiene un encabezado concreto o identidad), debe hacer lo siguiente, donde relativeOrAbsoluteAddress es un Identificador uniforme de recursos relativo (URI) o absoluto: // Do this: ServiceEndpoint e = myServiceHost.AddServiceEndpoint(c,b,"relativeOrAbsoluteAddress"); e.Address = new EndpointAddress(e.Address.Uri, /*other info like headers */); Pregunta: Estoy intentado generar un ejemplo hospedado en Web y la generacin falla debido a un error del comando crear directorio, copiar o eliminar. Por qu este sucediendo esto? Como parte del proceso de generacin, algunos ejemplos hospedados en Web intentan copiar binarios del servicio WCF compilado a la carpeta %SystemDrive%\inetpub\wwwroot\ServiceModelSamples. Este mtodo implementa de manera eficaz el servicio en IIS. Si la cuenta bajo la que se ejecuta el smbolo de comando SDK o Visual Studio no tiene permiso para modificar la carpeta, la generacin se interrumpir. Para corregirlo, realice una de las acciones siguientes Otorgue el permiso de modificacin para %SystemDrive%\inetpub\wwwroot a la cuenta bajo la que est generando el ejemplo. O bien Ejecute el smbolo de comando SDK o Visual Studio como un administrador.

MCT: Luis Dueas

Pag 135 de 135

S-ar putea să vă placă și