Está en la página 1de 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,

una

implementacin

de

un

protocolo

del

nivel

de

infraestructura

(como

WS-

ReliableMessaging), o cualquier otro componente de la pila de comunicaciones.


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

de

servicios

slo

afectan

los

aspectos

relacionados

con

servicios,

los

comportamientos de extremos slo afectan a las propiedades relacionadas con los extremos y los
comportamientos

de

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

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

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.

Cambie el espacio de nombres Service predeterminado a Microsoft.ServiceModel.Samples.

4.

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.

Habilitar el intercambio de metadatos

Abrir el host del servicio.

Crear un host del servicio para el 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

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.

Inicie el servicio creado en los pasos anteriores.

5.

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

6.

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.

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.

Configure el servicio especificando informacin de extremo y otra informacin de comportamiento.

4.

Hospede el servicio en una aplicacin.

5.

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.

Que el contrato de la orden compra consistiese en las operaciones CreateOrder y GetOrderStatus.

2.

Que las operaciones han especificado mensajes de entrada y de salida.

3.

Los datos que estos mensajes pueden llevar.

4.

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.

Cree la interfaz que crea el lado del servidor del contrato dplex.

2.

Aplique la clase ServiceContractAttribute a la interfaz.

3.

Declare las firmas de los mtodos en la interfaz.

4.

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

manualmente

uno

de

estos

estilos.

Puede

hacer

esto

aplicando

el

atributo

DataContractFormatAttribute y estableciendo la propiedad Style (cuando se est usando DataContract


Serializer),

estableciendo

el

Style

en

el

atributo

XmlSerializerFormatAttribute

(al

usar

el

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

de

serializacin

en

el

servicio

aplicando

el

atributo

ServiceBehaviorAttribute

al

servicio.

Especficamente, puede utilizar la propiedad MaxItemsInObjectGraph para establecer la cuota que limita el
nmero

mximo

de

objetos

que

DataContractSerializer

deserializa.

Puede

utilizar

la

propiedad

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

IgnoreExtensionDataObject

se

pueden

controlar

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.

Escriba su propio comportamiento que deriva del DataContractSerializerOperationBehavior.

2.

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

sobrescribir estos

ensamblados

de

serializacin con cdigo

malintecionado.

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.

Buffered,

b.

Streamed, que habilita la comunicacin mediante transmisin por secuencias en ambas


direcciones.

c.

StreamedRequest, que slo habilita la solicitud de transmisin.

d.

StreamedResponse, que slo habilita la transmisin por secuencias de la respuesta.

BasicHttpBinding

expone

la

propiedad

TransferMode

en

el

enlace,

tal

como

hace,

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

que

todos

los

tipos

pblicos,

incluidos

aqullos

sin

atributos,

son

serializables.

DataContractSerializer deduce un contrato de datos si el atributo DataContractAttribute est


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.

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

System.ServiceModel.ServiceBehaviorAttribute.IncludeExceptionDetailInFaults

establecer
o

la

propiedad

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.

Defina las condiciones que un cliente de su servicio debera saber.

2.

Defina el contenido personalizado de los errores de SOAP para esas condiciones de error.

3.

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.

Crear un contrato de servicio que contiene al menos una operacin.

2.

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,

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

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

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.

Crear un contrato de servicio que contenga al menos una operacin.

2.

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

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

ServiceBehaviorAttribute

de

la

estableciendo

transaccin
su

en

el

contrato

de

TransactionIsolationLevel

servicios
y

las

especificando
propiedades

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

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.

Aplique la clase ServiceContractAttribute a la clase.

3.

Cree los mtodos en la clase.

4.

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.

Aplique la clase ServiceContractAttribute a la interfaz.

3.

Defina los mtodos en la interfaz.

4.

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

System.ServiceModel.Description.ServiceDebug

Behavior, se aplican, normalmente, mediante un archivo de configuracin de la aplicacin, aunque puede


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.

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,

OperationBehaviorAttribute.ReleaseInstanceMode

las

propiedades

System.ServiceModel.

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

se

hubiese

establecido

en

System.ServiceModel.ReleaseInstanceMode.None para todas las operaciones.

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.

Aplique ServiceBehaviorAttribute a la clase de servicio.

2.

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.

Enlace

Elemento de
configuracin

BasicHttpBinding

<basicHttpBinding>

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.

WSHttpBinding

<wsHttpBinding>

Un enlace seguro e interoperable, adecuado


para contratos de servicio que no son dplex.

WSDualHttpBinding

<wsDualHttpBinding>

Un enlace seguro e interoperable adecuado


para contratos de servicios dplex o para la
comunicacin a travs de intermediarios de
SOAP.

WSFederationHttpBinding

<wsFederationHttpBinding>

Un enlace seguro e interoperable que admite

MCT: Luis Dueas

Descripcin

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.

NetNamedPipeBinding

<netNamedPipeBinding>

Un enlace seguro, confiable y optimizado que


es adecuado para la comunicacin en equipos
entre aplicaciones de WCF.

NetMsmqBinding

<netMsmqBinding>

Un enlace en cola adecuado para la


comunicacin entre equipos entre aplicaciones
de WCF.

NetPeerTcpBinding

<netPeerTcpBinding>

Un enlace que permite una comunicacin


segura entre mltiples equipos.

MsmqIntegrationBinding

<msmqIntegrationBinding>

Un enlace adecuado para la comunicacin


entre equipos entre una aplicacin de WCF y
aplicaciones de Message Queue Server
existentes.

BasicHttpContextBinding

<basicHttpContextBinding>

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.

NetTcpContextBinding

<netTcpContextBinding>

Un enlace seguro y optimizado adecuado para


la comunicacin entre aplicaciones WCF en
distintos
equipos
que
permite
utilizar
encabezados SOAP para intercambiar el
contexto.

WebHttpBinding

<webHttpBinding>

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.

WSHttpContextBinding

<wsHttpContextBinding>

Un enlace seguro e interoperable que es


adecuado para los contratos de servicios no
dplex que permite utilizar encabezados SOAP
para intercambiar el contexto.

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.

Enlace

Interop

BasicHttp
Binding

Basic
Profile
1.1

WSHttp
Binding

WS

MCT: Luis Dueas

Seguridad
(valor
predet..)

Codificacin
(valor
predet)

Transmisin por
secuencias
(predet.).

Sesin
(Predet).

Transac
ciones

Dplex

(Ninguno),
transporte,
mensaje,
mixto

(Ninguno)

(Ninguno)

n/a

Texto,
(MTOM)

S
(almacenado
en bfer)

Transporte,
(mensaje),
mixto

(Ninguno),
sesin
confiable,

(Ninguno),
S

n/a

(Texto),
MTOM

No

Pag 70 de 135

Manual de Windows Communication Foundation

sesin de
seguridad
WSDualHttp
Binding

WS

(Mensaje),
ninguno

(Sesin
confiable),
sesin de
seguridad

(Ninguno),
S

(Texto),
MTOM

No

WSFederation
HttpBinding

WSFedera
tion

(Mensaje),
mixto,
ninguno

(Ninguno),
sesin
confiable,
sesin de
seguridad

(Ninguno),
S

No

(Texto),
MTOM

No

NetTcp
Binding

.NET

(Transporte),
mensaje,
ninguno,
mixto

(Transporte),
sesin
confiable,
sesin de
seguridad

(Ninguno),
S

Binario

S
(almacenado
en bfer)

NetNamedPipe
Binding

.NET

(Transporte),
ninguno

Ninguno,
(transporte)

(Ninguno),
S

Binario

S
(almacenado
en bfer)

NetMsmq
Binding

.NET

Mensaje,
(Transporte),
Ninguno

(Ninguno),
transporte

Ninguno,
(S)

No

Binario

No

NetPeerTcp
Binding

Del
mismo
nivel

(Transporte)

(Ninguno)

(Ninguno)

Msmq
Integration
Binding

MSMQ

(Transporte)

(Ninguno)

Ninguno,
(S)

n/a

n/a

No

Basic
HttpContext
Binding

Basic
Profile
1.1

(Ninguno),
transporte,
mensaje,
mixto

(Ninguno)

(Ninguno)

n/a

Texto,
(MTOM)

S
(almacenado
en bfer)

NetTcp
Context
Binding

.NET

(Transporte),
mensaje,
ninguno,
mixto

(Transporte),
sesin
confiable,
sesin de
seguridad

(Ninguno),
S

Binario

S
(almacenado
en bfer)

WSHttp
Context
Binding

WS

Transporte,
(mensaje),
mixto

(Ninguno),
sesin
confiable,
sesin de
seguridad

(Ninguno),
S

n/a

Texto,
(MTOM)

No

No

La siguiente tabla explica las caractersticas enumeradas en la tabla anterior.


Caracterstica

Descripcin

Tipo de
interoperabilidad

Nombra el protocolo o tecnologa con la que el enlace asegura la interoperacin.

Seguridad

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

Especifica si este enlace admite contratos de sesin.

Transacciones

Especifica si las transacciones estn habilitadas.

Dplex

Especifica si se admiten los contratos dplex. Observe que esta caracterstica


requiere que el enlace admita sesiones.

Codificacin

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.

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.

Defina un contrato de servicios para el tipo de servicio.

2.

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.

Defina un contrato de servicios para el tipo de servicio.

2.

Implemente el contrato de servicios en una clase de servicio.

3.

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.

El cliente generado tambin contiene la implementacin de ClientCalculator.

4.

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.

Cree la interfaz que define el contrato de servicios.

2.

Implemente el contrato de servicios definido en el paso 1.

3.

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

8.

mexHttpsBinding para la publicacin HTTPS.

mexNamedPipeBinding para la publicacin de la canalizacin con nombre.

mexTcpBinding para la publicacin TCP.

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.

9.

Una direccin relativa si la aplicacin host tiene una direccin base.

Una direccin absoluta

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.

Establezca la propiedad HttpGetEnabled en true..

5.

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.

Agregue el extremo de intercambio de metadatos al host del servicio.

8.

Agregue un extremo de aplicacin al host del servicio.

9.

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

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.

Establezca la propiedad Mode de la clase WsHttpSecurity en Message.

4.

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"

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.

Cree una instancia de la clase de cliente generada con serviceAddress y las variables clientBinding.

6.

Llame el mtodo Open, como se indica el siguiente cdigo.

7.

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.

Agregue un elemento <security> y establezca el atributo mode en Message.

4.

Agregue un elemento <message> y establezca el atributo clientCredentialType en Windows.

5.

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.

Llame al mtodo Open, como se muestra en el siguiente cdigo.

6.

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.

Cree una instancia del enlace.

2.

Establezca la propiedad Mode en Transport.

3.

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.

Cree una instancia del enlace.

2.

Establezca la propiedad Mode en Message.

3.

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.

Agregue un elemento <binding> y defina su atributo name en un valor adecuado.

3.

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.

Agregue un elemento <system.ServiceModel> al archivo de configuracin.

2.

Como elemento secundario, aada un elemento <bindings>.

3.

Agregue un enlace adecuado. En el ejemplo siguiente se utiliza el elemento <wsHttpBinding>.

4.

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.

Abra la consola Administracin del equipo.

2.

En el panel izquierdo, haga clic en Usuarios y grupos locales.

3.

Haga clic con el botn secundario en Gruposy haga clic en Nuevo grupo.

4.

En la casilla Nombre de grupo, escriba un nombre para el nuevo grupo.

5.

En la casilla Descripcin, escriba una descripcin del nuevo grupo.

6.

Para agregar nuevos miembros al grupo, haga clic en Agregar.

7.

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.

Aplique la clase PrincipalPermissionAttribute al mtodo al que desea restringir el acceso.

2.

Establezca la accin del atributo en System.Security.Permissions.SecurityAction.Demand.

3.

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.

Cree el cdigo de cliente del servicio utilizando ServiceModel Metadata Utility Tool (Svcutil.exe).

2.

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.

Cree una interfaz para el servicio y aplique el atributo ServiceContractAttribute a la interfaz.

2.

Agregue una declaracin de mtodo a la interfaz.

3.

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

Escenarios comunes

Ventajas y limitaciones clave

Aplicacin administrada
("autohospedada")

Flexible.

Fcil de implementar.

No es una solucin

Aplicaciones de consola
utilizadas durante el desarrollo.

WinForm enriquecidos y
aplicaciones de cliente de WPF

empresarial de servicios.

que obtienen acceso a servicios.


Windows Services
(conocidos anteriormente
como servicios NT)

Un servicio de WCF de

Duracin de proceso del

ejecucin prolongada hospedado

servicio controlada por el

fuera de IIS.

sistema operativo, no activada


por mensaje.

Admitida por todas las


versiones de Windows.

IIS 5.1, IIS 6.0

Entorno seguro.

Reciclaje de procesos.

WCF en paralelo con contenido

Cierre por inactividad.

ASP.NET en Internet utilizando el

Ejecucin de un servicio de

protocolo HTTP.

Servicio de activacin de
procesos de Windows
(WAS)

Supervisin de estado de
procesos.

Activacin por mensajes.

Slo HTTP.

Ejecucin de un servicio de

No se requiere IIS.

WCF sin instalar IIS en Internet

Reciclaje de procesos.

utilizando varios protocolos de

Cierre por inactividad.

Supervisin de estado de

transporte.

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

Ventajas de WAS.
Se integra con contenido
de IIS y ASP.NET.

WCF en Internet utilizando varios

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.
Reciclaje de
procesos y
Appdomai

Disponibilidad de
plataforma

Transportes
admitidos

Aplicaciones administradas
("autohospedadas")

Windows XP, Windows


Server 2003, Windows
Vista,
Windows Server 2008

HTTP,
net.tcp,
net.pipe,
net.msmq

No

Windows Services (conocidos


anteriormente como servicios NT)

Windows XP, Windows


Server 2003, Windows
Vista,
Windows Server 2008

HTTP,
net.tcp,
net.pipe,
net.msmq

No

IIS 5.1

Windows XP

HTTP

IIS 6.0

Windows Server 2003

HTTP

Servicio de activacin de procesos


de Windows (WAS)

Windows Vista, Windows


Server 2008

HTTP,
net.tcp,
net.pipe,
net.msmq

Entorno de hospedaje

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.

Cree un subdirectorio App_Code dentro del directorio de la aplicacin.

5.

Cree un archivo de cdigo en el subdirectorio App_Code.

6.

Defina el contrato de servicios para el tipo de servicio del archivo de cdigo.

7.

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.

Defina un contrato de servicios para el tipo de servicio.

2.

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.

Cree un archivo Service.svc que contenga la lnea:


<%@ServiceHost language=c# Service="CalculatorService" %>

5.

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.

Compile el servicio para generar la aplicacin ejecutable Service.exe.

2.

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

seleccione

"Stop"

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.

Defina un extremo de servicio para el servicio mediante configuracin.

2.

Cree una interfaz para el servicio.

3.

Implemente la interfaz para crear el tipo de servicio. En el siguiente ejemplo se llama a la


implementacin MathService.

4.

Cree un mtodo para iniciar el servicio. En este ejemplo, se usa el mtodo Main.

5.

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.

Obtenga la informacin del contrato de servicio, el enlace y la direccin del punto final del servicio.

2.

Cree un cliente WCF utilizando dicha informacin.

3.

Llame a las operaciones.

4.

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.ServiceModel.CommunicationException,

System.TimeoutException

adems

de

cualquier

objeto

las

excepciones

System.ServiceModel.

FaultException iniciado como resultado de los errores de SOAP devueltos por las operaciones. Los errores de
SOAP

especificados

en

el

contrato

de

operacin

se

elevan

las

aplicaciones

cliente

como

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.

Compilar el cdigo del servicio.

2.

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.

Ejecute el servicio.

3.

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

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);

3.

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);

4.

Cierre el cliente para cerrar las conexiones y limpiar los recursos.


//Closing the client gracefully closes the connection and cleans up resources
client.Close();

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

System.ServiceModel.DuplexChannelFactory

utilizado

para

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.

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

Descripcin

Notas

ClientCertificate

Devuelve una
X509CertificateInitiatorClientCredential.

Representa un certificado X.509


proporcionado por el cliente para
autenticarse en el servicio.

HttpDigest

Devuelve una HttpDigestClientCredential.

Representa
una
credencial
de
sintaxis de HTTP. La credencial es un
hash del nombre de usuario y
contrasea.

IssuedToken

Devuelve una
IssuedTokenClientCredential.

Representa un token de seguridad


personalizado emitido por un servicio
de tokens de seguridad, utilizado
normalmente en escenarios de
federacin.

Peer

Devuelve una PeerCredential

Representa una credencial del mismo


nivel para la participacin en una
malla del mismo nivel en un dominio
de Windows.

ServiceCertificate

Devuelve una
X509CertificateRecipientClientCredential.

Representa un certificado X.509


proporcionado por el servicio en una
negociacin fuera de banda.

UserName

Devuelve una
UserNamePasswordClientCredential

Representa un par de nombre de


usuario y contrasea.

Windows

Devuelve una WindowsClientCredential

Representa una credencial de cliente


de Windows (una credencial de
Kerberos). Las propiedades de la
clase son de slo lectura.

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.

El programador del servicio especifica el tipo de credencial que el cliente debe proporcionar.

2.

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.

Agregue las referencias siguientes a su cdigo.

2.

Cree una instancia de un enlace. Este ejemplo utiliza NetTcpBinding.

3.

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.

Agregue un enlace apropiado al elemento <bindings>. Este ejemplo utiliza <netTcpBinding Element>.

2.

Agregue <security> of <netTcpBinding> al enlace. Asegrese de establecer el atributo name necesario


en un valor adecuado.

3.

Establezca el atributo mode en un valor adecuado. Este ejemplo utiliza el modo "Message".

4.

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>

6.

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" />

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.

Cree una instancia del cliente WCF utilizando el cdigo generado.

3.

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.

Agregue un elemento <behavior> of <endpointBehaviors> al elemento <behaviors>.

2.

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,

tiene

que

crear

una

clase

ServiceHost

personalizada

que

invalida

el

mtodo

ApplyConfiguration. Dentro de ese mtodo, puede llamar a la base para cargar primero la configuracin (si
desea

tambin

cargar

la

informacin

de

configuracin

estndar),

pero

tambin

puede

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

También podría gustarte