Documentos de Académico
Documentos de Profesional
Documentos de Cultura
10 Manual de Windows Communication Foundation PDF
10 Manual de Windows Communication Foundation PDF
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
Pag 1 de 135
Pag 2 de 135
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.
Pag 3 de 135
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
Pag 4 de 135
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:
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
Pag 5 de 135
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.
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.
Las aplicaciones basadas en WCF que se ejecutan en un proceso diferente en el mismo equipo de
Windows.
Pag 6 de 135
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.
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.
Pag 7 de 135
Fundamentos de WCF
Pag 8 de 135
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
Pag 9 de 135
una
implementacin
de
un
protocolo
del
nivel
de
infraestructura
(como
WS-
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
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
Pag 10 de 135
Pag 11 de 135
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
Pag 12 de 135
de
los
servicios
Web:
seguridad
de
mensajes
SOAP
(disponible
en
Arquitectura de WCF
Pag 13 de 135
Pag 14 de 135
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
Pag 15 de 135
tener
OperationContractAttribute
aplicado.
Si
un
mtodo
de
una
interfaz
que
tiene
Abra Visual Studio 2008 como administrador haciendo clic con el botn secundario en el programa en
el men Inicio y seleccionando Ejecutar como administrador.
2.
Cree un nuevo proyecto de aplicacin de consola. En el cuadro de dilogo Nuevo proyecto, seleccione
Visual Basic o Visual C#y elija la plantilla Aplicacin de consola y denomnela Servicio. Utilice la
ubicacin predeterminada.
3.
4.
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.
Pag 16 de 135
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.
Cree una nueva clase denominada CalculatorService en el mismo archivo donde defini la interfaz
ICalculator. CalculatorService implementa la interfaz ICalculator.
2.
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.
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
Pag 17 de 135
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.
6.
Abra el ServiceHost y espere a los mensajes entrantes. Cuando el usuario presione la tecla Entrar,
cierre el ServiceHost.
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.
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.
Pag 18 de 135
Siga estos pasos para crear en la solucin actual un nuevo proyecto para el cliente en :
a.
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 con el botn secundario en la carpeta Referencias del proyecto Cliente en el
Explorador de soluciones y seleccione Agregar referencia.
b.
Examinar,
navegue
hasta
C:\Windows\Microsoft.NET\Framework\v3.0\Windows
Agregue una instruccin using (Imports en Visual Basic) para el espacio de nombres System.
ServiceModel en el archivo Program.cs o Program.vb generado.
Imports System.ServiceModel
4.
5.
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
Pag 19 de 135
6.
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
Pag 20 de 135
Cree una instancia EndpointAddress para la direccin base del servicio que va llamar y, a continuacin,
cree un objeto Client de WCF.
2.
3.
Pag 21 de 135
Pag 22 de 135
Definir el contrato de servicios. Un contrato de servicios especifica la firma de un servicio, los datos
que intercambia y otros datos necesarios contractualmente.
2.
Implemente el contrato. Para implementar un contrato de servicios, cree la clase que implementa el
contrato y especifique comportamientos personalizados que debera tener el tiempo de ejecucin.
3.
4.
5.
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.
mensajes bsicos
(MEP), como
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:
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:
Los protocolos concretos y formatos de serializacin que se utilizan para admitir la comunicacin
correcta con el servicio.
Por ejemplo, un contrato del orden de compra podra tener una operacin CreateOrder que aceptase una
entrada de tipos de informacin de orden y devolviese informacin sobre accin completada o de error, adems
de un identificador de orden. Tambin podra tener una operacin GetOrderStatus que aceptase un identificador
de orden y devolviese informacin de estado de la orden. Un contrato de servicio de este tipo especificara lo
siguiente:
1.
2.
3.
4.
Pag 23 de 135
Pag 24 de 135
Si puede hacer que los requisitos de seguridad explcitos sean parte del contrato.
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.
Pag 25 de 135
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.
Pag 26 de 135
Pag 27 de 135
Pag 28 de 135
Pag 29 de 135
WSHttpBinding
predeterminado
(el
System.ServiceModel.SecurityModepredeterminado,
que
es
Los mensajes de operacin GetInt se envan como texto sin cifrar ni firmar (es decir, texto sin
formato).
auxiliares,
como
ServiceContractAttribute,
OperationContractAttribute,
Pag 30 de 135
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.
Pag 31 de 135
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.
Cree la interfaz que crea el lado del servidor del contrato dplex.
2.
3.
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.
8.
En la implementacin del servicio del contrato principal, declare una variable para la interfaz de
devolucin de llamadas.
2.
3.
Pag 32 de 135
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;
Pag 33 de 135
Pag 34 de 135
tambin
se
puede
usar
con
contratos
de
mensaje.
Para
ello,
aplique
el
atributo
Pag 35 de 135
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
Pag 36 de 135
manualmente
uno
de
estos
estilos.
Puede
hacer
esto
aplicando
el
atributo
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.
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
embargo,
DataContractSerializerOperationBehavior
tiene
MaxItemsInObjectGraph,
Ignore
Pag 37 de 135
MaxItemsInObjectGraph
IgnoreExtensionDataObject
se
pueden
controlar
travs
de
la
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
Pag 38 de 135
2.
Invalide
los
dos
mtodos
CreateSerializer
para
devolver
su
propio
serializador
Tipos primitivos (por ejemplo, enteros, cadenas y matrices de bytes), as como algunos tipos
especiales, como XmlElement y DateTime, que se tratan como primitivos.
Los tipos marcados con el atributo SerializableAttribute, incluidos los tipos que implementan la interfaz
ISerializable.
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.
Pag 39 de 135
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.
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
Pag 40 de 135
sobrescribir estos
ensamblados
de
malintecionado.
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.
Pag 41 de 135
La transmisin por secuencias debe habilitarse en el enlace. Defina una propiedad TransferMode, que
puede adoptar uno de los siguientes valores:
a.
Buffered,
b.
c.
d.
BasicHttpBinding
expone
la
propiedad
TransferMode
en
el
enlace,
tal
como
hace,
f.
g.
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.
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.
Pag 42 de 135
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.
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.
Pag 43 de 135
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.
de
vuelta
al
cliente
para
la
depuracin.
Adems,
puede
System.ServiceModel.ServiceBehaviorAttribute.IncludeExceptionDetailInFaults
establecer
o
la
propiedad
System.ServiceModel.
Pag 44 de 135
System.ServiceModel.FaultException)
para
obtener
Informacin general
Los errores de SOAP declarados son aqullos en los que una operacin tiene System.ServiceModel.
FaultContractAttribute que especifica un tipo de error de SOAP personalizado. Los errores de SOAP no
declarados son aqullos que no se especifican en el contrato para una operacin. Este tema le ayuda a
identificar esas condiciones de error y crear un contrato de error para su servicio, que los clientes pueden
utilizar para administrar correctamente esas condiciones de error cuando sean notificadas por errores de SOAP
personalizados. Las tareas bsicas son, en orden:
1.
2.
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.
Pag 45 de 135
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.
Pag 46 de 135
2.
Seleccione una operacin capaz de especificar una condicin de error sobre la que los clientes esperan
ser informados.
3.
4.
Repita los pasos 2 y 3 en todas las operaciones del contrato que comunican las condiciones de error a
los clientes.
de
WCF,
experimenta
esto
como
una
excepcin
administrada
donde
el
tipo
es
Pag 47 de 135
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
Pag 48 de 135
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
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.
Pag 49 de 135
Los mensajes entregados durante una sesin se procesan en el orden en el que se recibieron.
Las sesiones ASP.NET proporcionan un mecanismo del almacenamiento de datos general para todas
las solicitudes.
Pag 50 de 135
Los tipos de caractersticas que ofrecen los enlaces WCF basados en sesin proporcionados por el
sistema.
El mismo objeto de servicio definido por el usuario administra todas las llamadas entre un objeto de
cliente de WCF.
2.
El
elemento
System.ServiceModel.Channels.ReliableSessionBindingElement,
que
implementa
la
Establecer la propiedad SessionMode no especifica el tipo de sesin que el contrato requiere, slo que
requiere uno.
Pag 51 de 135
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.
la habilitacin de
al
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.
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
Pag 52 de 135
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.
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.
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.
Pag 53 de 135
2.
3.
Configure su extremo de servicio para que use un enlace que admita sesiones.
Pag 54 de 135
Los intercambios de mensajes pueden ser unidireccionales, sin tener en cuenta la implementacin del
cliente o servicio.
Use un enfoque asincrnico en una aplicacin de cliente o que realiza la llamada en los casos
siguientes:
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.
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
Pag 55 de 135
Pag 56 de 135
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
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.
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.
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
Pag 57 de 135
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)
{
Pag 58 de 135
Pag 59 de 135
alternativa,
descrita
aqu,
es
crear
una
clase
despus
aplicar
directamente
la
clase
Cree una nueva clase mediante Visual Basic, C# o cualquier otro lenguaje de Common Language
Runtime.
2.
3.
4.
Aplique la clase OperationContractAttribute a cada mtodo que debe exponerse como parte del
contrato pblico de WCF.
Pag 60 de 135
Cree una nueva interfaz mediante Visual Basic, C# o cualquier otro lenguaje de Common Language
Runtime.
2.
3.
4.
Aplique la clase OperationContractAttribute a cada mtodo que debe exponerse como parte del
contrato pblico de WCF.
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
ServiceBehaviorAttribute y OperationBehaviorAttribute
Los comportamientos ms importantes son los atributos ServiceBehaviorAttribute y OperationBehavior
Attribute, que puede utilizar para controlar:
Comportamiento de configuracin
Pag 61 de 135
Comportamiento de transaccin
Comportamiento de serializacin
Transformacin de metadatos
Duracin de sesin
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
debe
establecer
tambin
la
propiedad
System.ServiceModel.ServiceBehaviorAttribute.
se
hubiese
establecido
en
Pag 62 de 135
ServiceCredentials. Configura una credencial de servicio. Utilice esta clase para especificar la
credencial del servicio, como un certificado X.509.
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.
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
Pag 63 de 135
2.
Pag 64 de 135
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.
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).
El elemento <endpoint>
Pag 65 de 135
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.
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.
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.
Pag 66 de 135
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
Pag 67 de 135
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.
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.
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
Pag 68 de 135
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.
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.
Enlace
Elemento de
configuracin
BasicHttpBinding
<basicHttpBinding>
WSHttpBinding
<wsHttpBinding>
WSDualHttpBinding
<wsDualHttpBinding>
WSFederationHttpBinding
<wsFederationHttpBinding>
Descripcin
Pag 69 de 135
<netTcpBinding>
NetNamedPipeBinding
<netNamedPipeBinding>
NetMsmqBinding
<netMsmqBinding>
NetPeerTcpBinding
<netPeerTcpBinding>
MsmqIntegrationBinding
<msmqIntegrationBinding>
BasicHttpContextBinding
<basicHttpContextBinding>
NetTcpContextBinding
<netTcpContextBinding>
WebHttpBinding
<webHttpBinding>
WSHttpContextBinding
<wsHttpContextBinding>
La siguiente tabla muestra las caractersticas de cada uno de los enlaces proporcionados por el sistema. Los
enlaces se encuentran en las columnas de la tabla; las caractersticas se enumeran en las filas y se describen
en una segunda tabla. La siguiente tabla proporciona una clave para las abreviaturas de enlaces utilizadas. Para
seleccionar un enlace, determine qu columna satisface todas las caractersticas de fila que necesite.
Enlace
Interop
BasicHttp
Binding
Basic
Profile
1.1
WSHttp
Binding
WS
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
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
Descripcin
Tipo de
interoperabilidad
Seguridad
Pag 71 de 135
Sesin
Transacciones
Dplex
Codificacin
Binario
Transmisin por
secuencias
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
Pag 72 de 135
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.
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.
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.
Pag 73 de 135
2.
3.
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 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
Pag 74 de 135
2.
3.
En la aplicacin de alojamiento, cree la direccin base que han de utilizar el servicio y el enlace con el
servicio.
4.
Pag 75 de 135
realizar
todos
los
pasos
de
configuracin
siguientes
utilizando
Configuration
Editor
Tool
(SvcConfigEditor.exe).
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.
5.
Cree una instancia de ClientCalculator en una aplicacin y, a continuacin, llame a las operaciones
del servicio.
6.
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.
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.
Pag 76 de 135
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
Pag 77 de 135
Pag 78 de 135
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
Pag 79 de 135
Defina un contrato para un tipo de servicio IEcho que acepta el nombre de alguien y responde con un
mensaje de eco "Hola <nombre>! ".
Pag 80 de 135
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.
Esquema: http:
Equipo: www.fabrikam.com
Pag 81 de 135
Pag 82 de 135
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.
Pag 83 de 135
2.
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.
Dentro del archivo App.config, despus del elemento </services> de cierre, cree un elemento
<behaviors>.
2.
3.
4.
5.
6.
7.
Para los extremos de metadatos agregados en el paso 6, establezca el atributo binding en uno de los
siguientes valores:
Pag 84 de 135
8.
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.
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".
Dentro del mtodo principal de una aplicacin de consola, cree instancias de un objeto ServiceHost
pasando el tipo de servicio y la direccin base.
2.
Cree un bloque try justo debajo del cdigo del paso 1, esto detecta cualquier excepcin que se
produzca mientras se est ejecutando el servicio.
3.
Compruebe si el host del servicio ya contiene un ServiceMetadataBehavior, si no, cree una nueva
instancia de ServiceMetadataBehavior.
4.
5.
6.
7.
8.
9.
Abra el host del servicio y espere las llamadas entrantes. Cuando el usuario presione Entrar, cierre el
host del servicio.
Pag 85 de 135
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.
Pag 86 de 135
Pag 87 de 135
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
Pag 88 de 135
Pag 89 de 135
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.
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.
Pag 90 de 135
4.
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.
7.
Llame al mtodo Open para iniciar el servicio. El cdigo de este procedimiento se muestra aqu:
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.
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.
7.
Pag 91 de 135
Este cdigo de configuracin se usa tanto en el archivo de configuracin del servicio como del cliente.
2.
3.
4.
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>
Use la herramienta SvcUtil.exe para generar el cdigo proxy y el archivo de configuracin a partir de
los metadatos del servicio.
2.
Reemplace la seccin <Bindings> del archivo de configuracin generado con el cdigo de configuracin
de la seccin anterior.
3.
4.
El cdigo de procedimiento se encuentra insertado al principio del mtodo Main del programa cliente.
Cree una instancia de la clase de cliente generada, pasando el nombre del enlace en el archivo de
configuracin como parmetro de entrada.
5.
6.
Pag 92 de 135
Cree una instancia de la clase del enlace que est utilizando. En el siguiente ejemplo se crea una
instancia de la clase WSHttpBinding.
2.
3.
Tambin puede establecer el modo en el constructor del enlace, como se muestra en el cdigo
siguiente.
2.
3.
2.
3.
2.
3.
4.
Pag 93 de 135
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).
2.
3.
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.
Pag 94 de 135
2.
3.
Haga clic con el botn secundario en Gruposy haga clic en Nuevo grupo.
4.
5.
6.
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.
Abra el archivo de cdigo de Windows Communication Foundation (WCF) que contiene el cdigo del
contrato de servicio implementado.
2.
se
iniciar
una
2.
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.
Pag 95 de 135
Cree el servicio.
Utilice un enlace que use autenticacin de Windows y cree una sesin, como NetTcpBinding o
WSHttpBinding.
3.
Cree el cdigo de cliente del servicio utilizando ServiceModel Metadata Utility Tool (Svcutil.exe).
2.
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.
Pag 96 de 135
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.
propiedad
ProtectionLevel
se
encuentra
en
muchas
clases
diferentes,
como
las
clases
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.
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.
Pag 97 de 135
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.
Pag 98 de 135
Para firmar todas las partes del mensaje para una operacin
1.
2.
3.
Cree un tipo que represente el mensaje de error. El ejemplo siguiente crea una clase denominada
MathFault con dos campos.
2.
3.
4.
Pag 99 de 135
Cree un tipo que representa al mensaje. El siguiente ejemplo crea una clase Company con dos
campos, CompanyName y CompanyID.
2.
3.
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.
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:
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.
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.
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.
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
Escenarios comunes
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.
Un servicio de WCF de
fuera de IIS.
Entorno seguro.
Reciclaje de procesos.
Ejecucin de un servicio de
protocolo HTTP.
Servicio de activacin de
procesos de Windows
(WAS)
Supervisin de estado de
procesos.
Slo HTTP.
Ejecucin de un servicio de
No se requiere IIS.
Reciclaje de procesos.
Supervisin de estado de
transporte.
procesos.
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.
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")
HTTP,
net.tcp,
net.pipe,
net.msmq
No
HTTP,
net.tcp,
net.pipe,
net.msmq
No
IIS 5.1
Windows XP
HTTP
IIS 6.0
HTTP
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.
Cree un nuevo archivo denominado service file con una extensin .svc en la aplicacin. Modifique
este archivo agregando la informacin de directiva @ServiceHost adecuada para el servicio. Por
ejemplo, el contenido del archivo de servicio para los ejemplos de CalculatorService contiene la
siguiente informacin:
<%@ServiceHost language=c# Debug="true"
Service="Microsoft.ServiceModel.Samples.CalculatorService"%>
4.
5.
6.
7.
9.
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.
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.
5.
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.
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.
Defina el contrato de servicios ICalculator utilizando una interfaz para el servicio de la calculadora del
archivo Service.cs.
2.
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.
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
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
2.
3.
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.
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.
Obtenga la informacin del contrato de servicio, el enlace y la direccin del punto final del servicio.
2.
3.
4.
Las siguientes secciones explican estos pasos y proporcionan una breve introduccin a las siguientes
cuestiones:
Control de errores
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
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
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.
2.
Usar ServiceModel Metadata Utility Tool (SvcUtil.exe) para crear el cliente WCF.
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()> _
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.
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.
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
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:
Tipos
System.EventArgs
para
cada
operacin
(del
formulario
<operationName>
3.
Antes
de
llamar
la
operacin,
utilice
un
nuevo
genrico
System.EventHandler
de
tipo
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);
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();
}
}
establecido
en
el
valor
predeterminado,
false.
Observe
tambin
la
clase
3.
4.
Ejemplo
A continuacin, se muestra la lista completa del cdigo que se emplea en este tema.
// Service.cs
using System;
using System.Configuration;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace Microsoft.ServiceModel.Samples
{
// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
public interface IOneWayCalculator
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.
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.
Anule
el
mtodo
CreateBindingElements
para
definir
las
propiedades
de
enlace.
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.
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:
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.
System.ServiceModel.DuplexChannelFactory
utilizado
para
del
cliente.
Los
objetos
de
devolucin
de
llamada
de
cliente
dplex
pueden
utilizar
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.
mediante
programacin,
puede
ser
fcil
olvidarse
de
deshabilitar
IncludeExceptionDetailInFaults en la implementacin.
Debido a los problemas de seguridad implicados, se recomienda encarecidamente que:
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.
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>
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
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.
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.
HttpDigest
Representa
una
credencial
de
sintaxis de HTTP. La credencial es un
hash del nombre de usuario y
contrasea.
IssuedToken
Devuelve una
IssuedTokenClientCredential.
Peer
ServiceCertificate
Devuelve una
X509CertificateRecipientClientCredential.
UserName
Devuelve una
UserNamePasswordClientCredential
Windows
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.
2.
3.
Establezca el modo de seguridad, segn corresponda. Este ejemplo establece el modo en Transport.
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.
Agregue un enlace apropiado al elemento <bindings>. Este ejemplo utiliza <netTcpBinding Element>.
2.
3.
Establezca el atributo mode en un valor adecuado. Este ejemplo utiliza el modo "Message".
4.
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.
Cdigo de cliente
Los procedimientos siguientes muestran cmo establecer el valor de credencial de cliente en el cliente en
cdigo y configuracin. Esto presupone que ha utilizado ServiceModel Metadata Utility Tool (Svcutil.exe) para
devolver los metadatos (cdigo y configuracin) del servicio.
Para especificar el valor de credencial de cliente en el cliente en cdigo
1.
Utilice ServiceModel Metadata Utility Tool (Svcutil.exe) para generar cdigo y configuracin del
servicio.
2.
3.
2.
3.
Establezca
los
atributos
siguientes
en
los
valores
adecuados:
storeLocation,
storeName,
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.
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.
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".
2.
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.
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.