Documente Academic
Documente Profesional
Documente Cultură
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: Unificacin de las tecnologas de comunicacin .NET Framework existentes. Compatibilidad para interoperabilidad entre proveedores, incluyendo confiabilidad, seguridad y transacciones. Orientacin explcita al servicio. La unificacin de las tecnologas informticas distribuidas de Microsoft En ausencia de WCF, el equipo de desarrollo que implementa la aplicacin de alquiler de coches necesitara elegir la tecnologa distribuida adecuada entre las mltiples opciones proporcionadas por .NET Framework. Aunque se den los diversos requisitos de esta aplicacin, ninguna tecnologa nica se ajustara a ellos. En su lugar, es probable que la aplicacin utilizarse varias tecnologas .NET Framework existentes, como: ASP.NETServicios Web (ASMX). Una opcin para comunicarse con la aplicacin de reservas existente basada en J2EE y con las aplicaciones de los socios a travs de Internet. Dado que los servicios Web bsicos son suministrados hoy en da en la mayora de las plataformas, esta fue la manera ms directa de lograr la interoperabilidad entre proveedores antes del lanzamiento de WCF. .NET Framework remoto. Una opcin para la comunicacin con la aplicacin del centro de llamadas, porque ambos se generan en .NET Framework. La comunicacin remota est diseada expresamente para la comunicacin de .NET a .NET estrechamente acoplada, por lo que proporciona una experiencia de desarrollo sencilla y sin problemas para las aplicaciones en la red local. Enterprise Services. Utilizado por la aplicacin de reserva de coches de alquiler para administrar periodos de duracin de objeto y definir las transacciones distribuidas. Estas funciones podran ser tiles para comunicarlas e integrarlas con cualquiera de las otras aplicaciones de este escenario, pero Enterprise Services admite nicamente un conjunto limitado de opciones de comunicacin. WSE. Se podra utilizar junto con ASMX para comunicarse con la aplicacin de reserva basada en J2EE y con las aplicaciones de los socios. Dado que implementa ms recientemente los acuerdos de los servicios Web definidos, conocidos colectivamente como las especificacionesWS-*, WSE permite una seguridad ms flexible en los servicios Web, con tal de que todas las aplicaciones implicadas sean compatibles con las versiones de estas nuevas especificaciones. Message Queuing de Microsoft (MSMQ). Se utiliza para comunicarse con aplicaciones de socios basadas en Windows que requieren la entrega de los datos garantizada, as como el desacoplamiento de cargas de trabajo y periodos de duracin de la aplicacin. La mensajera duradera que Message Queuing proporciona suele ser la mejor solucin para las aplicaciones conectadas de manera intermitente. Generada en .NET Framework, la aplicacin de reserva de coches de alquiler debe utilizar ms de una de estas tecnologas de comunicacin para cumplir con sus requisitos. Aunque esto es tcnicamente posible, la aplicacin resultante sera compleja de implementar y su mantenimiento sera todo un desafo. Con WCF, la solucin es mucho ms fcil de implementar. Como muestra la figura, WCF se puede utilizar para todas las situaciones descritas previamente. Por lo tanto, la aplicacin de reserva de coches de alquiler puede
Pag 5 de 135
Pag 6 de 135
Pag 7 de 135
Fundamentos de WCF
Pag 8 de 135
Trminos de WCF
Entre otros conceptos y trminos usados en la documentacin de WCF se incluyen los siguientes. mensaje
Pag 9 de 135
Pag 10 de 135
Pag 11 de 135
Pag 12 de 135
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
Pag 16 de 135
Pag 17 de 135
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
Agregue una referencia a System.ServiceModel.dll para el proyecto: a. Haga clic con el botn secundario en la carpeta Referencias del proyecto Cliente en el Explorador de soluciones y seleccione Agregar referencia. b. Seleccione la ficha Reciente, elija System.ServiceModel.dll en el cuadro de lista y haga clic en Aceptar. Dado que ya agreg una referencia a este ensamblado en el primer paso de este tutorial, ahora aparece en la ficha Reciente. Si no lo ve en la ficha Reciente, seleccione la ficha Examinar, navegue hasta C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation y seleccione el ensamblado desde all. Nota: Al utilizar un compilador de lnea de comandos (como, por ejemplo, Csc.exe o Vbc.exe), tambin debe proporcionar la ruta de acceso a los ensamblados. De forma predeterminada, en un equipo que ejecuta, por ejemplo, Windows Vista, la ruta de acceso es Windows\Microsoft.NET\ Framework\v3.0\Windows Communication Foundation.
3.
Agregue una instruccin using (Imports en Visual Basic) para el espacio de nombres System. ServiceModel en el archivo Program.cs o Program.vb generado. Imports System.ServiceModel
4. 5.
Inicie el servicio creado en los pasos anteriores. Ejecute la Service Model Metadata Utility Tool (SvcUtil.exe) con los modificadores adecuados para crear el cdigo de cliente y un archivo de configuracin realizando los siguientes pasos: a. Inicie una sesin de consola SDK de Windows seleccionando CMD Shell bajo la entrada Microsoft Windows SDK en el men Inicio. b. Explore hasta el directorio donde desea colocar el cdigo de cliente. Si cre el proyecto de cliente con la configuracin predeterminada, el directorio es C:\Users\<nombre de usuario>\Documents\Visual Studio 2005\Projects\Service\Client. Utilice la herramienta de lnea de comandos Service Model Metadata Utility Tool (SvcUtil.exe) con los modificadores adecuados para crear el cdigo de cliente. El siguiente ejemplo genera un archivo de cdigo y un archivo de configuracin para el servicio. svcutil.exe /language:vb /out:generatedProxy.vb /config:app.config http://localhost:8000/ServiceModelSamples/service De forma predeterminada, el cdigo de proxy de cliente se genera en un archivo con nombre despus del servicio (en este caso, por ejemplo, CalculatorService.cs o CalculatorService.vb) con una extensin adecuada al lenguaje de programacin: .vb para Visual Basic o .cs para C#). El modificador /out cambia el nombre del archivo proxy de cliente a generatedProxy.cs. El modificador /config cambia el nombre predeterminado del archivo de configuracin de cliente, output.config, por app.config. Observe que los dos archivos se generan en el
Pag 19 de 135
6.
Pag 20 de 135
Pag 21 de 135
Pag 22 de 135
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.
Informacin general
En este tema se proporciona un nivel alto de orientacin conceptual para disear e implementar los servicios de WCF. Los subtemas proporcionan ms informacin detallada sobre las caractersticas de diseo e implementacin. Antes de disear e implementar su aplicacin WCF, se recomienda lo siguiente: Entender lo que es un contrato de servicio, cmo funciona, y cmo crear uno. Comprender que los contratos especifican requisitos mnimos que la configuracin en tiempo de ejecucin o el entorno de alojamiento pueden no admitir.
Contratos de servicio
Un contrato de servicio es una instruccin que es capaz de lo siguiente: La agrupacin de operaciones en un servicio. La firma de las operaciones en trminos de mensajes intercambiados. Los tipos de datos de estos mensajes. La ubicacin de las operaciones. Los protocolos concretos y formatos de serializacin que se utilizan para admitir la comunicacin correcta con el servicio. Por ejemplo, un contrato del orden de compra podra tener una operacin CreateOrder que aceptase una entrada de tipos de informacin de orden y devolviese informacin sobre accin completada o de error, adems de un identificador de orden. Tambin podra tener una operacin GetOrderStatus que aceptase un identificador de orden y devolviese informacin de estado de la orden. Un contrato de servicio de este tipo especificara lo siguiente: 1. 2. 3. 4. Que el contrato de la orden compra consistiese en las operaciones CreateOrder y GetOrderStatus. Que las operaciones han especificado mensajes de entrada y de salida. Los datos que estos mensajes pueden llevar. Instrucciones de categoras sobre la infraestructura de la comunicacin necesaria para procesar correctamente los mensajes. Por ejemplo, estos detalles incluyen qu formularios de seguridad son necesarios para establecer una comunicacin correcta.
Pag 23 de 135
Pag 24 de 135
Clases o interfaces
Tanto las clases como las interfaces representan una agrupacin de funcionalidad y, por consiguiente, ambas se pueden utilizar para definir un contrato de servicios WCF. Sin embargo, se recomienda que utilice las interfaces porque modelan directamente los contratos de servicios. Sin una implementacin, las interfaces no hacen ms que definir una agrupacin de mtodos con ciertas firmas. Igualmente, un contrato de servicios sin una implementacin define una agrupacin de operaciones con ciertas firmas. Implemente una interfaz de contrato de servicio y habr implementado un servicio WCF. Todas las ventajas de las interfaces administradas se aplican a las interfaces de contrato de servicio: Las interfaces del contrato de servicio pueden extender cualquier nmero de otras interfaces del contrato de servicio. Una nica clase puede implementar cualquier nmero de contratos de servicios implementando esas interfaces del contrato de servicio. Puede modificar la implementacin de un contrato de servicios cambiando la implementacin de la interfaz, mientras el contrato de servicios sigue siendo el mismo.
Pag 25 de 135
Pag 26 de 135
Pag 27 de 135
Pag 28 de 135
Pag 29 de 135
Pag 30 de 135
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
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.
Pag 32 de 135
Pag 33 de 135
Pag 34 de 135
Pag 35 de 135
Pag 36 de 135
ExtensionDataObject, y las propiedades DataContractSurrogate que puede utilizar para personalizar el proceso de serializacin. Las primeras dos propiedades tienen el mismo significado que se mencion en la seccin anterior. Puede utilizar la propiedad DataContractSurrogate para habilitar suplentes del contrato de datos, que son un mecanismo eficaz para personalizar y extender el proceso de serializacin. Puede utilizar el DataContractSerializerOperationBehavior para personalizar la serializacin de cliente y servidor. El ejemplo siguiente muestra cmo aumentar la cuota MaxItemsInObjectGraph en el cliente. ChannelFactory<IDataService> factory = new ChannelFactory<IDataService>(binding, address); foreach (OperationDescription op in factory.Endpoint.Contract.Operations) { DataContractSerializerOperationBehavior dataContractBehavior = op.Behaviors.Find<DataContractSerializerOperationBehavior>() as DataContractSerializerOperationBehavior; if (dataContractBehavior != null) { dataContractBehavior.MaxItemsInObjectGraph = 100000;
Pag 37 de 135
Pag 38 de 135
(NetDataContractSerializer, DataContractSerializer con preserveObjectReferences establecido en true o su propio XmlObjectSerializer personalizado). 3. Antes de abrir el host de servicio o crear un canal de cliente, elimine el comportamiento DataContractSerializerOperationBehavior existente y conecte la clase derivada personalizada que cree en los pasos anteriores.
Pag 39 de 135
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
Pag 41 de 135
BasicHttpBinding
NetTcpBinding y NetNamedPipeBinding. La propiedad TransferMode se puede establecer tambin en el elemento de enlace del transporte y utilizarse en un enlace personalizado. Los siguientes ejemplos muestran cmo establecer TransferMode mediante cdigo y cambiando el archivo de configuracin. Ambos ejemplos tambin establecen la propiedad maxReceivedMessageSize en 64 MB, que coloca un lmite en el tamao mximo permitido de mensajes que se reciben. El maxReceivedMessageSize predeterminado es de 64 KB, que normalmente es demasiado pequeo para los escenarios de transmisin por secuencias. Establezca este valor de cuota que depende, segn corresponda, del tamao mximo de mensajes que su aplicacin espera recibir. Tambin tenga en cuenta que maxBufferSize controla el tamao mximo que se almacena en bfer y lo establece de manera apropiada. e. El siguiente fragmento de cdigo de configuracin del ejemplo muestra cmo establecer la propiedad TransferMode en la transmisin por secuencias en basicHttpBinding y un enlace HTTP personalizado. f. El siguiente fragmento de cdigo muestra cmo establecer la propiedad TransferMode para la transmisin por secuencias en basicHttpBinding y un enlace HTTP personalizado. g. El siguiente fragmento de cdigo muestra cmo establecer la propiedad TransferMode para la transmisin por secuencias en un enlace HTTP personalizado. 3. Las operaciones GetStream, UploadStream y EchoStream tratan con el envo de datos directamente desde un archivo o guardando los datos recibidos directamente en un archivo. El siguiente cdigo se aplica a GetStream.
Pag 42 de 135
3.2.1.4.3. Cmo: Crear un Contrato de Datos Bsicos para una Clase o Estructura
En este tema se muestran los pasos bsicos para crear un contrato de datos mediante una clase o estructura.
Pag 43 de 135
Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults en true para que permita a los clientes de WCF obtener informacin sobre las excepciones de operaciones de servicio internas. El envo de errores individuales y el establecimiento de las propiedades de comportamiento de depuracin se describen en Envo y recepcin de errores. Nota: Dado que las excepciones administradas pueden exponer informacin interna de la aplicacin, establecer System.ServiceModel.ServiceBehaviorAttribute.IncludeExceptionDetailInFaults o System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults en true puede permitir que los clientes WCF obtengan informacin sobre las excepciones de operaciones de servicio internas, incluida la informacin de identificacin personal u otro tipo de informacin confidencial. Por consiguiente, establecer System.ServiceModel.ServiceBehaviorAttribute. IncludeExceptionDetailInFaults o System.ServiceModel.Description.ServiceDebugBehavior. IncludeExceptionDetailInFaults en true slo se recomienda como una manera de depurar temporalmente una aplicacin de servicio. Adems, el WSDL de un mtodo que devuelve excepciones administradas no controladas de esta manera no contiene el contrato para la FaultException de tipo ExceptionDetail. Los clientes deben contar con la posibilidad de que se produzca un error SOAP desconocido
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. 3. Defina las condiciones que un cliente de su servicio debera saber. Defina el contenido personalizado de los errores de SOAP para esas condiciones de error. Marque sus operaciones para que los errores de SOAP especficos que inician se expongan a los clientes en WSDL. Definir Condiciones de error que los clientes deberan saber Los errores de SOAP son mensajes descritos pblicamente que llevan informacin de error para una operacin determinada. Dado que se describen junto con otros mensajes de la operacin en WSDL, los clientes saben y, por consiguiente, esperan controlar dichos errores al invocar una operacin. Sin embargo, dado que los servicios WCF se escriben en cdigo administrado, decidir qu condiciones de error en cdigo administrado se convertirn en errores y se devolvern al cliente le proporciona la oportunidad de separar las condiciones de error y errores en su servicio de la conversacin del error formal que usted tiene con un cliente. Por ejemplo, el ejemplo de cdigo siguiente muestra una operacin que toma dos enteros y devuelve otro entero. Aqu, se pueden producir varias excepciones, por lo que al disear el contrato del error, debe determinar qu condiciones de error son importantes para su cliente. En este caso, el servicio debera detectar la excepcin System.DivideByZeroException. <ServiceContract> _ Public Class CalculatorService <OperationContract]> _ Public Function Divide(ByVal a As Integer, ByVal b As Integer) _ As Integer If (b==0) Then Throw New Exception("Division by zero!") Return a/b End Function End Class En el ejemplo anterior, la operacin puede devolver un error de SOAP personalizado, especfico de dividir por cero, un error personalizado especfico a las operaciones de matemtica, pero con informacin especfica a dividir por cero, varios errores para varias situaciones de error diferentes, o ningn error de SOAP en absoluto. Definir el contenido de condiciones de error
Pag 45 de 135
Pag 46 de 135
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 DetailInFaults establecida en true. Las excepciones FaultException se producen en el cliente cuando se recibe un error de SOAP especificado en el contrato de la operacin en respuesta a una operacin bidireccional (es decir, un mtodo con un atributo OperationContractAttribute con IsOneWay establecido en false).
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, y FaultException deriva de CommunicationException, es importante detectar estas excepciones en el orden apropiado. Por ejemplo, si tiene un bloque de intento/deteccin en el que primero detecta CommunicationException, todos los errores SOAP especificados y no especificados se administran ah; los bloques de deteccin posteriores para administrar una excepcin FaultException personalizada nunca se invocan. Recuerde que una operacin puede devolver un nmero indefinido de errores especificados. Cada error es de un tipo nico y se ha de administrar separadamente. Administre las excepciones al cerrar el canal La mayor parte de la discusin anterior tiene que ver con los errores enviados en el curso del procesamiento de mensajes de aplicaciones, es decir, mensajes enviados explcitamente por el cliente cuando la aplicacin de cliente llama a las operaciones en el objeto de cliente de WCF. Incluso con la disposicin de objetos locales, el objeto puede elevar o enmascara excepciones que tienen lugar durante el proceso de reciclaje. Algo similar puede producirse al utilizar objetos de cliente de WCF. Al llamar a operaciones, est enviando mensajes a travs de una conexin establecida. Cerrar el canal puede producir excepciones si la conexin no se puede cerrar limpiamente o ya est cerrada, aun cuando todas las operaciones hayan devuelto correctamente. Normalmente, los canales de objeto de cliente se cierran de una de las siguientes maneras: Cuando se recicla el objeto de cliente de WCF. Cuando la aplicacin de cliente llama System.ServiceModel.ClientBase.Close. Cuando la aplicacin de cliente llama System.ServiceModel.ICommunicationObject.Close. Cuando la aplicacin de cliente llama a una operacin que es una operacin de finalizacin para una sesin. En todos los casos, cerrar el canal indica al canal que comience a cerrar todos los canales subyacentes que puedan estar enviando mensajes para admitir una funcionalidad compleja en el nivel de la aplicacin. Por ejemplo, cuando un contrato requiere sesiones, un enlace intenta establecer una sesin mediante el intercambio de mensajes con el canal del servicio hasta que se establezca una sesin. Cuando se cierre el canal, el canal de la sesin subyacente notifica al servicio que la sesin se ha terminado. En este caso, si el canal ya se ha anulado, cerrado o es inutilizable (por ejemplo, cuando se desconecta un cable de red), el canal de cliente no puede informar al canal del servicio que se finaliza la sesin y es posible que se produzca una excepcin.
Pag 49 de 135
Pag 50 de 135
especificacin de WS-ReliableMessaging, proporciona la compatibilidad para las sesiones confiables en las que los mensajes se pueden configurar para que se entreguen en orden y slo una vez, posibilitando el establecimiento de relaciones de confianza incluso cuando los mensajes viajen por varios nodos durante la conversacin. El enlace System.ServiceModel.NetMsmqBinding proporciona sesiones de datagrama de MSMQ. Establecer la propiedad SessionMode no especifica el tipo de sesin que el contrato requiere, slo que requiere uno.
Pag 51 de 135
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 a System.ServiceModel.ChannelFactory.CreateChannel. System.ServiceModel.ClientBase.Open en el objeto de cliente de WCF generado por la ServiceModel Metadata Utility Tool (Svcutil.exe). Una operacin de inicio en cualquier tipo de objeto de cliente de WCF (de forma predeterminada, todas las operaciones son de inicio). Cuando se llama a la primera operacin, el objeto de cliente de WCF abre automticamente el canal e inicia una sesin. Por lo general, un cliente finaliza una sesin con un extremo de servicio llamando a uno de los siguientes mtodos: System.ServiceModel.ICommunicationObject.Close en el canal devuelto por una llamada a System.ServiceModel.ChannelFactory.CreateChannel. System.ServiceModel.ClientBase.Close en el objeto de cliente de WCF generado por Svcutil.exe. Una operacin de finalizacin en cualquier tipo de objeto de cliente de WCF (de forma predeterminada, ninguna operacin es de finalizacin; el contrato debe especificar explcitamente una operacin de finalizacin). Cuando se llama a la primera operacin, el objeto de cliente de WCF abre automticamente el canal e inicia una sesin.
Pag 53 de 135
Pag 54 de 135
Pag 55 de 135
Pag 56 de 135
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
ServiceBehaviorAttribute
estableciendo
TransactionIsolationLevel
TransactionScopeRequired para las operaciones del servicio que requieren las transacciones del cliente. El parmetro TransactionAutoComplete especifica si la transaccin en la que el mtodo se ejecuta se completa automticamente si no se produce ninguna excepcin no controlada. El trabajo que se realiza en las operaciones del servicio y que es administrado por un administrador de recursos, como registrar las actualizaciones de base de datos, forma parte de la transaccin del cliente. El ejemplo siguiente muestra el uso de los atributos ServiceBehaviorAttribute y OperationBehaviorAttribute para controlar el comportamiento de la transaccin del lado del servicio. [ServiceBehavior(TransactionIsolationLevel = System.Transactions.IsolationLevel.Serializable)] public class CalculatorService: ICalculatorLog { [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] public double Add(double n1, double n2) {
Pag 58 de 135
Pag 59 de 135
Pag 60 de 135
Informacin general
El contrato define las entradas, las salidas, los tipos de datos y las funciones de un servicio de ese tipo. Al implementar un contrato de servicios, se crea una clase que, cuando se configura con un enlace en una direccin, cumple el contrato que implementa. El cliente conoce la informacin contractual, de enlace y direccin; sin esa informacin, el cliente no puede utilizar el servicio. Sin embargo, las caractersticas de la operacin, como los problemas de los subprocesos o la administracin de instancias, son opacas para los clientes. Cuando haya implementado su contrato de servicios, puede configurar un gran nmero de caractersticas de operaciones utilizando los comportamientos. Los comportamientos son objetos que modifican el tiempo de ejecucin de Windows Communication Foundation (WCF) estableciendo una propiedad en tiempo de ejecucin o insertando un tipo de personalizacin en el tiempo de ejecucin. Los atributos System.ServiceModel.ServiceBehaviorAttribute y System.ServiceModel.OperationBehaviorAttribute son los comportamientos ms tiles y exponen las funciones de operaciones ms solicitadas. Puesto que son atributos, se han de aplicar a la implementacin de la operacin o el servicio. Otros comportamientos, como System.ServiceModel.Description.ServiceMetadataBehavior utilizarlos mediante programacin. Este tema ofrece informacin general sobre los atributos ServiceBehaviorAttribute y OperationBehavior Attribute, describe los diversos mbitos en los que pueden funcionar los comportamientos y proporciona una descripcin rpida de muchos de los comportamientos proporcionados por el sistema en los diversos mbitos que pueden ser de inters para los programadores de WCF. o System.ServiceModel.Description.ServiceDebug Behavior, se aplican, normalmente, mediante un archivo de configuracin de la aplicacin, aunque puede
ServiceBehaviorAttribute y OperationBehaviorAttribute
Los comportamientos ms importantes son los atributos ServiceBehaviorAttribute y OperationBehavior Attribute, que puede utilizar para controlar: La duracin de las instancias La compatibilidad con respecto a la concurrencia y la sincronizacin Comportamiento de configuracin
Pag 61 de 135
ServiceInstanceOnTransactionComplete controlan cuando se libera el objeto de servicios. Sin embargo, tambin puede crear un objeto de servicio y crear el host de servicio mediante ese objeto. Para hacerlo, debe establecer tambin la propiedad System.ServiceModel.ServiceBehaviorAttribute. InstanceContextMode en Single o se producir una excepcin al abrir el host del servicio. Utilice el constructor System.ServiceModel.ServiceHost.#ctor(System.Object,System.Uri[]) para crear este tipo de servicio. Ofrece una alternativa para implementar un System.ServiceModel.Dispatcher.IInstanceContext Initializer personalizado cuando desee proporcionar una instancia de objeto concreta para su uso con el servicio de singleton. Puede utilizar esta sobrecarga cuando su tipo de implementacin de servicio sea difcil de construir (por ejemplo, si no implementa un constructor pblico predeterminado que no tiene parmetros). Tenga en cuenta que cuando se proporciona un objeto a este constructor, algunas caractersticas relacionadas con el comportamiento de creacin de instancias de Windows Communication Foundation (WCF) funcionan de manera diferente. Por ejemplo, llamar a System.ServiceModel.InstanceContext.ReleaseServiceInstance, no tiene ningn efecto cuando se proporciona una instancia de objeto conocida. De igual forma, se omite cualquier otro mecanismo de lanzamiento de instancia. La clase ServiceHost siempre se comporta como si la propiedad System.ServiceModel.OperationBehaviorAttribute.ReleaseInstanceMode System.ServiceModel.ReleaseInstanceMode.None para todas las operaciones. se hubiese establecido en
Pag 62 de 135
Pag 63 de 135
Pag 64 de 135
Pag 65 de 135
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
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
Enlace BasicHttpBinding
Descripcin Un enlace que es til para la comunicacin con servicios web conformes con WS-Basic Profile, como, por ejemplo, servicios basados en servicios web de ASP.NET (ASMX). Este enlace utiliza HTTP como el transporte, y texto/XML como la codificacin de mensajes predeterminada. Un enlace seguro e interoperable, adecuado para contratos de servicio que no son dplex. Un enlace seguro e interoperable adecuado para contratos de servicios dplex o para la comunicacin a travs de intermediarios de SOAP. Un enlace seguro e interoperable que admite
WSHttpBinding
<wsHttpBinding>
WSDualHttpBinding
<wsDualHttpBinding>
WSFederationHttpBinding
<wsFederationHttpBinding>
Pag 69 de 135
el protocolo WS-Federation que permite a las organizaciones que estn en una federacin autenticar y autorizar eficazmente a los usuarios. NetTcpBinding <netTcpBinding> Un enlace seguro y optimizado adecuado para la comunicacin entre equipos entre aplicaciones de WCF. Un enlace seguro, confiable y optimizado que es adecuado para la comunicacin en equipos entre aplicaciones de WCF. Un enlace en cola adecuado para la comunicacin entre equipos entre aplicaciones de WCF. Un enlace que permite una comunicacin segura entre mltiples equipos. Un enlace adecuado para la comunicacin entre equipos entre una aplicacin de WCF y aplicaciones de Message Queue Server existentes. Un enlace adecuado para la comunicacin con los servicios web compatibles con el perfil WS-Basic que permite el uso de cookies HTTP para intercambiar el contexto. Un enlace seguro y optimizado adecuado para la comunicacin entre aplicaciones WCF en distintos equipos que permite utilizar encabezados SOAP para intercambiar el contexto. Un enlace que se utiliza para configurar los extremos de los servicios web de WCF que se exponen mediante solicitudes HTTP en lugar de mensajes SOAP. Un enlace seguro e interoperable que es adecuado para los contratos de servicios no dplex que permite utilizar encabezados SOAP para intercambiar el contexto.
NetNamedPipeBinding
<netNamedPipeBinding>
NetMsmqBinding
<netMsmqBinding>
NetPeerTcpBinding
<netPeerTcpBinding>
MsmqIntegrationBinding
<msmqIntegrationBinding>
BasicHttpContextBinding
<basicHttpContextBinding>
NetTcpContextBinding
<netTcpContextBinding>
WebHttpBinding
<webHttpBinding>
WSHttpContextBinding
<wsHttpContextBinding>
La siguiente tabla muestra las caractersticas de cada uno de los enlaces proporcionados por el sistema. Los enlaces se encuentran en las columnas de la tabla; las caractersticas se enumeran en las filas y se describen en una segunda tabla. La siguiente tabla proporciona una clave para las abreviaturas de enlaces utilizadas. Para seleccionar un enlace, determine qu columna satisface todas las caractersticas de fila que necesite. Codificacin (valor predet) Texto, (MTOM) Transmisin por secuencias (predet.). S (almacenado en bfer)
Seguridad (valor predet..) (Ninguno), transporte, mensaje, mixto Transporte, (mensaje), mixto
Dplex n/a
WSHttp Binding
WS
(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), sesin confiable, sesin de seguridad (Transporte), sesin confiable, sesin de seguridad Ninguno, (transporte) (Ninguno), S S (Texto), MTOM No
WSFederation HttpBinding
WSFedera tion
(Ninguno), S
No
(Texto), MTOM
No
NetTcp Binding
.NET
(Ninguno), S
Binario
S (almacenado en bfer)
NetNamedPipe Binding
.NET
(Transporte), ninguno
(Ninguno), S
Binario
S (almacenado en bfer) No
NetMsmq Binding
.NET
(Ninguno), transporte
Ninguno, (S)
No
Binario
NetPeerTcp Binding
(Ninguno)
(Ninguno)
No
(Transporte)
(Ninguno)
Ninguno, (S)
n/a
n/a
No
(Ninguno)
(Ninguno)
n/a
Texto, (MTOM)
S (almacenado en bfer)
.NET
(Transporte), sesin confiable, sesin de seguridad (Ninguno), sesin confiable, sesin de seguridad
(Ninguno), S
Binario
S (almacenado en bfer)
WS
(Ninguno), S
n/a
Texto, (MTOM)
No
La siguiente tabla explica las caractersticas enumeradas en la tabla anterior. Caracterstica Tipo de interoperabilidad Seguridad Descripcin Nombra el protocolo o tecnologa con la que el enlace asegura la interoperacin.
Especifica cmo se protege el canal: Ninguno: el mensaje SOAP no se protege y no se autentica el cliente. Transporte: los requisitos de seguridad se satisfacen en el nivel de transporte.
Pag 71 de 135
Mensaje: los requisitos de seguridad se satisfacen en la capa del mensaje. Mixto: las demandas se llevan en el mensaje; el nivel de transporte cumple los requisitos de integridad y confidencialidad. Sesin Transacciones Dplex Especifica si este enlace admite contratos de sesin. Especifica si las transacciones estn habilitadas. Especifica si se admiten los contratos dplex. Observe que esta caracterstica requiere que el enlace admita sesiones. Especifica el formato de conexin del mensaje. Entre los valores permitidos se incluyen: Texto: por ejemplo, UTF-8. Binario Mecanismo de optimizacin de transmisin del mensaje (MTOM): mtodo para codificar de forma eficaz elementos XML binarios dentro del contexto de un sobre SOAP. Transmisin por secuencias Especifica si se admite la transmisin por secuencias para mensajes de entrada y de salida. Utilice la propiedad TransferMode del enlace para establecer el valor. Entre los valores permitidos se incluyen: Buffered: los mensajes de respuesta y solicitud se almacenan en bfer. Streamed: los mensajes de solicitud y respuesta se transmiten por secuencias. StreamedRequest: el mensaje de solicitud se transmite por secuencias y el mensaje de respuesta se almacena en bfer. StreamedResponse: el mensaje de solicitud se almacena en bfer y el mensaje de respuesta se transmite por secuencias.
Codificacin
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
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.
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
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" %>
Pag 74 de 135
Pag 75 de 135
(SvcConfigEditor.exe).
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
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.
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
Pag 84 de 135
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".
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 y PrimaryIdentity de la clase ServiceSecurityContext. Por el contrario, en el cliente, la identidad se utiliza para validar el servicio. Durante el diseo, un programador del cliente puede establecer el elemento <identity> en un valor obtenido del servicio. Durante la ejecucin, el cliente contrasta el valor del elemento con la identidad real del servicio. Si se produce un error en la comprobacin, el cliente finaliza la comunicacin. El valor puede ser un nombre principal del usuario (UPN), si el servicio se ejecuta bajo la identidad de un usuario determinado, o un nombre principal de servicio (SPN) si el servicio se ejecuta bajo una cuenta de equipo. La credencial tambin puede ser un certificado, o un campo de un certificado que identifica a ste ltimo.
Niveles de proteccin
La propiedad ProtectionLevel se encuentra en varias clases de atributo (como las clases ServiceContract Attribute y OperationContractAttribute ). El nivel de proteccin es un valor que especifica si los mensajes (o partes del mensaje) compatibles con un servicio se firman, se firman y cifran, o bien se envan sin firmas ni cifrado.
Mediante cdigo
El primer procedimiento le gua en la creacin y configuracin de una clase WSHttpBinding en el cdigo. El enlace usa el transporte HTTP. El mismo enlace se usa en el cliente. Para crear un WSHttpBinding que utiliza credenciales de Windows y seguridad de mensaje 1. El cdigo de este procedimiento se encuentra insertado al principio del mtodo Run de la clase Test en el cdigo del servicio, en la seccin Ejemplo. 2. Cree una instancia de la clase WSHttpBinding.
Pag 90 de 135
Utilizar el enlace en un servicio ste es el segundo procedimiento, que muestra cmo usar el enlace en un servicio autohospedado. Utilizar un enlace en un servicio 1. 2. Inserte el cdigo de este procedimiento despus del cdigo del procedimiento anterior. Cree una variable TypecontractType con nombre y asgnele el tipo de la interfaz (ICalculator). Cuando utilice Visual Basic, utilice al operador GetType; cuando utilice C#, utilice la palabra clave typeof. 3. Cree una segunda variable TypeserviceType con nombre y asgnele el tipo del contrato implementado (Calculator). 4. Cree una instancia de la clase Uri denominada baseAddress con la direccin base del servicio. La direccin base debe tener un esquema que coincida con el transporte. En este caso, el esquema de transporte es HTTP y la direccin incluye el identificador uniforme de recursos (URI) especial "localhost" y un nmero de puerto (8036) as como una direccin de extremo base ("serviceModelSamples/): http://localhost:8036/serviceModelSamples/. 5. 6. Cree una instancia de la clase ServiceHost con serviceType y variables baseAddress. Agregue un extremo al servicio incluyendo contractType, el enlace y el nombre del extremo ("secureCalculator"). Un cliente debe concatenar la direccin base y el nombre de extremo al iniciar una llamada al servicio. 7. Llame al mtodo Open para iniciar el servicio. El cdigo de este procedimiento se muestra aqu:
Utilizar el enlace en un cliente Este procedimiento muestra cmo generar un proxy que se comunica con el servicio. El proxy se genera con la ServiceModel Metadata Utility Tool (Svcutil.exe), que usa los metadatos del servicio para crear el proxy. En este procedimiento tambin se crea una instancia de la clase WSHttpBinding para comunicarse con el servicio y, a continuacin, se llama al servicio. Este ejemplo slo utiliza cdigo para crear el cliente. Como alternativa, puede utilizar un archivo de configuracin, que se muestra en la seccin que sigue a este procedimiento. Para usar un enlace en un cliente con el cdigo 1. Use la herramienta SvcUtil.exe para generar el cdigo del proxy a partir de los metadatos del servicio. El cdigo de proxy generado hereda de la clase ClientBase, lo cual garantiza que cada cliente tenga los constructores, mtodos y propiedades necesarios para comunicarse con un servicio WCF. En este ejemplo, el cdigo generado incluye la clase CalculatorClient, que implementa la interfaz ICalculator, habilitando la compatibilidad con el cdigo del servicio. 2. El cdigo de este procedimiento se encuentra insertado al principio del mtodo Main del programa cliente. 3. Cree una instancia de la clase WSHttpBinding y establezca su modo de seguridad en Message y su tipo de credencial de cliente en Windows. El ejemplo denomina el clientBindingvariable. 4. Cree una instancia de la clase EndpointAddress denominada serviceAddress. Inicialice la instancia con la direccin base concatenada con el nombre de extremo. 5. 6. 7. Cree una instancia de la clase de cliente generada con serviceAddress y las variables clientBinding. Llame el mtodo Open, como se indica el siguiente cdigo. Llame al servicio y muestre los resultados.
Pag 91 de 135
Habilitar la seguridad de la transferencia en un servicio en un dominio de Windows utilizando la configuracin 1. Agregue un elemento <wsHttpBinding> a la seccin del elemento <bindings> del archivo de configuracin. 2. Agregue un elemento <binding> al elemento <WSHttpBinding> y establezca el atributo configurationName en un valor apropiado a su aplicacin. 3. 4. 5. Agregue un elemento <security> y establezca el atributo mode en Message. Agregue un elemento <message> y establezca el atributo clientCredentialType en Windows. En el archivo de configuracin del servicio, reemplace la seccin <bindings> con el cdigo siguiente. <bindings> <wsHttpBinding> <binding name = "wsHttpBinding_Calculator"> <security mode="Message"> <message clientCredentialType="Windows"/> </security> </binding> </wsHttpBinding> </bindings>
Utilizar el enlace en un cliente En este procedimiento se muestra cmo generar dos archivos: un proxy que se comunica con el servicio y un archivo de configuracin. Tambin se describen los cambios en el programa cliente, que es el tercer archivo utilizado en el cliente. Para usar un enlace en un cliente mediante configuracin 1. Use la herramienta SvcUtil.exe para generar el cdigo proxy y el archivo de configuracin a partir de los metadatos del servicio. 2. Reemplace la seccin <Bindings> del archivo de configuracin generado con el cdigo de configuracin de la seccin anterior. 3. 4. El cdigo de procedimiento se encuentra insertado al principio del mtodo Main del programa cliente. Cree una instancia de la clase de cliente generada, pasando el nombre del enlace en el archivo de configuracin como parmetro de entrada. 5. 6. Llame al mtodo Open, como se muestra en el siguiente cdigo. Llame al servicio y muestre los resultados.
Pag 92 de 135
Pag 93 de 135
Pag 94 de 135
Pag 95 de 135
Para habilitar la suplantacin de un cliente desde un token de Windows almacenado en memoria cach en un servicio
1. 2. Cree el servicio. Utilice un enlace que use autenticacin de Windows y cree una sesin, como NetTcpBinding o WSHttpBinding. 3. Al crear la implementacin de la interfaz del servicio, aplique la clase OperationBehaviorAttribute al mtodo que requiere la suplantacin del cliente. Establezca la propiedad Impersonation en Required.
Pag 96 de 135
Fundamentos
Para entender la caracterstica de nivel de proteccin, se aplican las instrucciones bsicas siguientes: Existen tres niveles bsicos de proteccin para cualquier parte de un mensaje. La propiedad (dondequiera que se produzca) est establecida como uno de los valores de enumeracin de ProtectionLevel. En orden ascendente de proteccin, incluyen: None. Sign. La parte protegida est firmada digitalmente. De esta manera se garantiza la deteccin de cualquier modificacin en la parte protegida del mensaje. EncryptAndSign. La parte del mensaje se cifra para garantizar la confidencialidad antes de firmarse. Slo puede establecer los requisitos de proteccin para los datos de la aplicacin con esta caracterstica. Por ejemplo, los encabezados de WS-Addressing son los datos de la infraestructura y, por consiguiente, no se vern afectados por ProtectionLevel. Cuando el modo de seguridad est establecido como Transport, el mecanismo de transporte protege el mensaje completo. Por consiguiente, establecer un nivel de proteccin independiente para las distintas partes de un mensaje no tendr ningn efecto. ProtectionLevel es una manera para que el programador establezca el nivel mnimo que un enlace debe cumplir. Cuando se implementa un servicio, el enlace real especificado en la configuracin puede admitir o no el nivel mnimo. Por ejemplo, de forma predeterminada, la clase BasicHttpBinding no proporciona seguridad (aunque puede estar habilitada). Por consiguiente, utilizarlo con un contrato que tiene un valor distinto de None producir una excepcin. Si el servicio requiere que el valor mnimo de ProtectionLevel para todos los mensajes sea Sign, un cliente (quizs creado por una tecnologa que no sea de WCF ) puede cifrar y firmar todos los mensajes (que es ms que el mnimo requerido). En este caso, WCF no producir una excepcin porque el cliente ha hecho ms que el mnimo. Tenga en cuenta, sin embargo, que las aplicaciones WCF (servicios o clientes) no sobreprotegern una parte del mensaje si es posible, sino que cumplirn con el nivel mnimo. Adems, tenga en cuenta que al utilizar Transport como modo de seguridad, el transporte puede sobreproteger la secuencia de mensajes porque no puede proteger en un nivel ms especfico. Si establece ProtectionLevel como Sign o EncryptAndSign, deber usar un enlace con la seguridad habilitada o se producir una excepcin. Si selecciona un enlace que habilita la seguridad y no establece la propiedad ProtectionLevel en cualquier parte del contrato, se cifrarn y firmarn todos los datos de la aplicacin.
Pag 97 de 135
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 una interfaz para el servicio y aplique el atributo ServiceContractAttribute a la interfaz. Agregue una declaracin de mtodo a la interfaz. Aplique el atributo OperationContractAttribute al mtodo, y establezca la propiedad ProtectionLevel en Sign, como se muestra en el siguiente cdigo.
Pag 99 de 135
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
protocolos de transporte. La opcin de un entorno de hospedaje depende de la versin de Windows en la que se implemente, los transportes que requiera para enviar mensajes y el tipo de proceso y reciclaje de dominio de aplicacin que requiera. La siguiente tabla resume los datos relacionados con estos requisitos. Disponibilidad de plataforma Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008 Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008 Windows XP Windows Server 2003 Windows Vista, Windows Server 2008 Transportes admitidos HTTP, net.tcp, net.pipe, net.msmq HTTP, net.tcp, net.pipe, net.msmq HTTP HTTP HTTP, net.tcp, net.pipe, net.msmq Reciclaje de procesos y Appdomai No
No
S S S
Es importante tener en cuenta que ejecutar un servicio o cualquier extensin desde un host que no sea de confianza pone en peligro la seguridad. Asimismo, tenga en cuenta que al abrir un ServiceHost bajo suplantacin, una aplicacin debe garantizar que el usuario no ha cerrado sesin, por ejemplo mediante el almacenamiento en memoria cach de la WindowsIdentity del usuario.
Las siguientes secciones explican estos pasos y proporcionan una breve introduccin a las siguientes cuestiones: Control de errores Configuracin y proteccin de los clientes. Creacin de objetos de devolucin de llamada para los servicios dplex. Llamada asincrnica a los servicios. Llamada a los servicios mediante los canales cliente.
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.TimeoutException de se cualquier elevan a objeto las y las excepciones System.ServiceModel.CommunicationException, SOAP especificados en el contrato de adems operacin System.ServiceModel. cliente como
FaultException iniciado como resultado de los errores de SOAP devueltos por las operaciones. Los errores de aplicaciones System.ServiceModel.FaultException, donde el parmetro de tipo es el tipo de detalle del error de SOAP.
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()> _
Procedimiento
Para llamar a operaciones de servicio WCF de forma asincrnica 1. Ejecute la herramienta ServiceModel Metadata Utility Tool (Svcutil.exe) con las opciones de comando /async y /tcv:Version35 a la vez, como muestra el comando siguiente. svcutil /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples http://localhost:8000/servicemodelsamples/service/mex /a /tcv:Version35 De este modo se genera, adems de las operaciones sincrnicas y las operaciones estndar asincrnicas basadas en delegado, una clase de cliente WCF que incluye: Dos operaciones <operationName>Async que se utilizan con el enfoque de llamada asincrnica basada en eventos. Por ejemplo: Eventos completados de operacin del formulario <operationName>Completed que se utilizan con el enfoque de llamada asincrnica basada en eventos. Por ejemplo: Tipos System.EventArgs para cada operacin (del formulario <operationName>
CompletedEventArgs) que se utilizan en el enfoque de llamada asincrnica basado en eventos. Por ejemplo:
<operationName>EventArgs para agregar el mtodo del controlador (creado en el paso anterior ) al evento <operationName>Completed. A continuacin, llame al mtodo <operationName>Async. Nota: Las directrices de diseo del modelo asincrnico basado en eventos afirman que si se devuelve ms de un valor, uno de los valores se devuelve como propiedad Result y los dems se devuelven como propiedades del objeto EventArgs. Una de las consecuencias de esto, es que el cliente importa metadatos utilizando las opciones de comando asincrnicas basadas en eventos y la operacin devuelve ms de una valor, el objeto predeterminado EventArgs devuelve un valor como propiedad Result, y el resto son propiedades del objeto EventArgs.Para recibir el objeto de mensaje como propiedad Result y que los valores devueltos sean propiedades de ese objeto, se utiliza la opcin de comando /messageContract. Esto genera una firma que devuelve el mensaje de respuesta como la propiedad Result del objeto EventArgs. Todos los valores de devolucin internos se convierten, pues, en propiedades del objeto de mensaje de respuesta.
3.5.2.3. Cmo: Obtener Acceso a los Servicios WCF con Contratos Unidireccionales y de Solicitud-Respuesta
Los procedimientos siguientes describen cmo tener acceso a un servicio Windows Communication Foundation (WCF) que define un contrato unidireccional y un contrato de solicitud-respuesta y no utiliza el modelo de comunicacin dplex.
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.
El ejemplo de cdigo siguiente especifica el transporte, codificacin de mensajes y configuracin de proteccin de mensajes obteniendo los valores de las propiedades SecurityAssertion y MessageProtectionOrder. 3. En el cdigo de la aplicacin cliente, agregue el cdigo para definir las propiedades de enlace. El ejemplo de cdigo siguiente especifica que el cliente WCF debe utilizar proteccin de mensajes y autenticacin tal y como define la asercin de seguridad de llave en mano AnonymousForCertificate de WSE 3.0. Adems, se requieren sesiones seguras y claves derivadas.
Informacin general
Si utiliza Visual Studio para generar los tipos de cliente Windows Communication Foundation (WCF) para su proyecto, normalmente, no necesita examinar el cdigo de cliente generado. Si no usa un entorno de desarrollo que realice los mismos servicios automticamente, puede usar una herramienta como Svcutil.exe para generar el cdigo de cliente y, a continuacin, usar ese cdigo para desarrollar la aplicacin cliente. Dado que Svcutil.exe tiene varias opciones que modifican la informacin de tipo generada, este tema no discute todos los escenarios. Sin embargo, las tareas estndar siguientes implican la ubicacin del cdigo generado: Identificar las interfaces del contrato de servicio. Identificar la clase de cliente WCF. Identificar los tipos de datos. Identificar los contratos de devolucin de llamada para los servicios dplex. Identificar la interfaz de canal de contrato de servicio auxiliar. Buscar las interfaces del contrato de servicio Buscar las interfaces que modelan los servicios modelo, buscar las interfaces marcadas con el atributo System.ServiceModel.ServiceContractAttribute. A menudo este atributo puede ser difcil de buscar con una lectura rpida debido a la presencia de otros atributos y las propiedades explcitas establecidas en el propio atributo. Recuerde que la interfaz del contrato de servicio y la interfaz del contrato del cliente son dos tipos diferentes. El ejemplo de cdigo siguiente muestra el contrato de servicios original. Puede utilizar la interfaz del contrato de servicio generada junto con la clase System.ServiceModel.Channel Factory para crear un objeto de canal WCF con el que invocar las operaciones del servicio. Buscar las clases de cliente de WCF Para buscar la clase de cliente WCF que implementa el contrato de servicios que usted quiere utilizar, busque una extensin de System.ServiceModel.ClientBase, donde el parmetro de tipo es la interfaz del contrato de servicio que usted ha buscado previamente y que extiende esa interfaz. En el ejemplo de cdigo siguiente se muestra la clase ClientBase de tipo ISampleService. Puede utilizar esta clase de cliente WCF creando una nueva instancia de esta y llamando a los mtodos que implementa. Esos mtodos invocan la operacin del servicio con la que est diseado y est configurado para interactuar. Nota: Cuando SvcUtil.exe genera una clase de cliente WCF, agrega DebuggerStepThroughAttribute a la clase de cliente para evitar que los depuradores recorran la clase de cliente WCF. Buscar los tipos de datos Para encontrar los tipos de datos en el cdigo generado, el mecanismo ms bsico es identificar el nombre del tipo especificado en un contrato y buscar el cdigo para esa declaracin de tipo. Por ejemplo, el contrato siguiente especifica que SampleMethod puede devolver un error de SOAP de tipo microsoft.wcf.documentation.SampleFault. Al buscar SampleFault, se busca la declaracin de tipos siguiente.
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.
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
Notas Representa un certificado X.509 proporcionado por el cliente para autenticarse en el servicio. Representa una credencial de sintaxis de HTTP. La credencial es un hash del nombre de usuario y contrasea. Representa un token de seguridad personalizado emitido por un servicio de tokens de seguridad, utilizado normalmente en escenarios de federacin. Representa una credencial del mismo nivel para la participacin en una malla del mismo nivel en un dominio de Windows. Representa un certificado X.509 proporcionado por el servicio en una negociacin fuera de banda. Representa un par de nombre de usuario y contrasea. Representa una credencial de cliente de Windows (una credencial de Kerberos). Las propiedades de la clase son de slo lectura.
HttpDigest
IssuedToken
Peer
ServiceCertificate
UserName
Windows
Estableciendo un valor <clientCredentials> mediante configuracin Los valores de credencial se especifican utilizando un comportamiento de extremo como elementos secundarios del elemento <clientCredentials>. El elemento utilizado depende del tipo de credencial de cliente. Por ejemplo, el ejemplo siguiente muestra la configuracin para establecer un certificado X.509 mediante <clientCertificate> of <clientCredentials> Element. <configuration> <system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="myEndpointBehavior"> <clientCredentials> <clientCertificate findvalue="myMachineName" storeLocation="Current" X509FindType="FindBySubjectName" /> </clientCredentials> </behavior> </behaviors> </system.serviceModel>
6.
Cdigo de cliente
Los procedimientos siguientes muestran cmo establecer el valor de credencial de cliente en el cliente en cdigo y configuracin. Esto presupone que ha utilizado ServiceModel Metadata Utility Tool (Svcutil.exe) para devolver los metadatos (cdigo y configuracin) del servicio. Para especificar el valor de credencial de cliente en el cliente en cdigo 1. Utilice ServiceModel Metadata Utility Tool (Svcutil.exe) para generar cdigo y configuracin del servicio. 2. 3. Cree una instancia del cliente WCF utilizando el cdigo generado. En la clase de cliente, establezca la propiedad ClientCredentials de la clase ClientBase en un valor adecuado. Este ejemplo establece la propiedad en un certificado X.509 utilizando el mtodo SetCertificate de la clase X509CertificateInitiatorClientCredential. Puede utilizar cualquiera de las enumeraciones de la clase X509FindType. El nombre de sujeto se utiliza aqu en caso de que se cambie el certificado (debido a una fecha de caducidad). Utilizar el nombre de sujeto permite a la infraestructura encontrar de nuevo el certificado. Para especificar el valor de credencial de cliente en el cliente en configuracin 1. 2. Agregue un elemento <behavior> of <endpointBehaviors> al elemento <behaviors>. Agregue un elemento <serviceCredentials> al elemento <behaviors>. Asegrese de establecer el atributo name necesario en un valor adecuado. 3. Agregue un elemento <clientCertificate> of <serviceCredentials> al elemento <clientCredentials>.
x509FindTypey findValue, como se muestra en el cdigo siguiente. <behaviors> <endpointBehaviors> <behavior name="endpointCredential"> <clientCredentials> <clientCertificate findValue="Contoso.com" storeLocation="LocalMachine" storeName="TrustedPeople" x509FindType="FindBySubjectName" /> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> 5. Al configurar el cliente, especifique el comportamiento estableciendo el atributo behaviorConfiguration del elemento <endpoint>, como se muestra en el cdigo siguiente. El elemento del extremo es un elemento secundario del elemento <client>. Especifique tambin el nombre de la configuracin de enlace estableciendo el atributo bindingConfiguration en el enlace para el cliente. Si est utilizando un archivo de configuracin generado, se genera automticamente el nombre del enlace. En este ejemplo, el nombre es "tcpBindingWithCredential". <client> <endpoint name ="" address="net.tcp://contoso.com:8036/aloha" binding="netTcpBinding" bindingConfiguration="tcpBindingWithCredential" behaviorConfiguration="credentialBehavior" /> </client>
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.