Novedades de Windows Communication Foundation 4.5

Este tema describe las características nuevas de Windows Communication Foundation (WCF) versión 4.5.

gRPC como alternativa a WCF

gRPC es un marco RPC moderno que es una alternativa popular a WCF. gRPC se basa en HTTP/2, que proporciona una serie de ventajas sobre WCF, entre las que se incluyen:

  • Rendimiento: gRPC es mucho más eficaz que WCF, especialmente para las conexiones de larga duración.
  • Escalabilidad: gRPC está diseñado para escalar a un gran número de clientes y servidores.
  • Seguridad: gRPC admite una variedad de mecanismos de seguridad, como TLS y autenticación.
  • Multiplataforma: gRPC es independiente de la plataforma y se puede usar con una variedad de lenguajes de programación.

Para obtener más información sobre el desarrollo o la migración de aplicaciones WCF a gRPC, consulte:

Características de simplificación de WCF

Se ha hecho un gran esfuerzo para simplificar el desarrollo y el mantenimiento de las aplicaciones de WCF 4.5. Para obtener más información, consulte Características de simplificación de WCF.

Compatibilidad asincrónica basada en tareas

De forma predeterminada, la característica Agregar referencia de servicio genera métodos de operación de servicio asincrónicos de devolución de tarea. Se realiza tanto para los métodos sincrónicos como para los asincrónicos. De este modo, puede llamar a las operaciones de servicio asincrónicamente mediante el nuevo modelo de programación asincrónico basado en tareas. Cuando llama al método proxy generado, WCF crea un objeto de tarea para representar la operación asincrónica y devuelve dicha tarea. La tarea se completa cuando finaliza la operación. Al implementar una operación asincrónica se puede implementar como una operación asincrónica basada en tareas. Para obtener más información, consulta Operaciones sincrónicas y asincrónicas.

Archivos de configuración generados simplificados

Al agregar una referencia de servicio en Visual Studio o al usar la herramienta SvcUtil.exe, se genera un archivo de configuración de cliente. En versiones anteriores de WCF, estos archivos de configuración contenían el valor de cada propiedad de enlace incluso si el valor era el predeterminado. En WCF 4.5, los archivos de configuración generados solo contienen las propiedades de enlace que se establecen en un valor no predeterminado.

Para obtener más información, consulta Características de simplificación de WCF.

Desarrollo de contrato primero

WCF admite ahora el desarrollo de contrato primero. Svcutl.exe tiene un modificador /serviceContract que permite generar contratos de servicio y datos a partir de un documento WSDL.

Agregar referencia de servicio desde un proyecto de subconjuntos portátiles

Los proyectos de subconjuntos portátiles permiten a los programadores de ensamblados .NET mantener un único árbol de origen y un sistema de compilación a la vez que se admiten varias plataformas .NET (escritorio, Silverlight, Windows Phone y Xbox). Los proyectos del subconjunto portátil sólo hacen referencia a las bibliotecas portátiles de .NET, que son ensamblados que pueden utilizarse en cualquier plataforma .NET. La experiencia del desarrollador es igual que agregar una referencia de servicio en cualquier otra aplicación cliente de WCF. Para más información, consulte Agregar referencia de servicio en un proyecto de subconjuntos portátiles.

Valor predeterminado del modo de compatibilidad de ASP.NET cambiado

WCF proporciona el modo de compatibilidad de ASP.NET para conceder a los desarrolladores acceso total a las características en la canalización HTTP de ASP.NET al escribir servicios WCF. Para usar este modo, debes establecer el aspNetCompatibilityEnabled atributo en true en la <sección serviceHostingEnvironment> de web.config. Además, cualquier servicio de este appDomain debe tener la RequirementsMode propiedad en su AspNetCompatibilityRequirementsAttribute establecido Allowed en o Required. De manera predeterminada, AspNetCompatibilityRequirementsAttribute se establece ahora en Allowed. Para obtener más información, consulta Servicios de WCF y ASP.NET.

Nuevos valores de transporte predeterminados

Para simplificar la configuración, han cambiado varios valores de propiedad de transporte predeterminados. Para obtener más información, consulta Características de simplificación de WCF.

XmlDictionaryReaderQuotas

XmlDictionaryReaderQuotas contiene valores de cuota configurables para los lectores de diccionario de XML que restringen la cantidad de memoria usada por un codificador mientras se crea un mensaje. Aunque estas cuotas son configurables, los valores predeterminados han cambiado para reducir la posibilidad de que un desarrollador tenga que establecerlas explícitamente. Para obtener más información, consulta Características de simplificación de WCF.

Validación de la configuración de WCF

Como parte del proceso de compilación en Visual Studio, los archivos de configuración de WCF se validan ahora para los atributos definidos en el proyecto. Se muestra una lista de errores de validación o advertencias en Visual Studio si se produce un error en la validación.

Información sobre herramientas del editor XML

Para ayudar a los desarrolladores de servicios WCF nuevos y existentes a configurar sus servicios, el Editor XML de Visual Studio proporciona ahora información sobre herramientas para cada elemento de configuración que forma parte del archivo de configuración del servicio y sus propiedades.

Mejoras en streaming

Se agregó compatibilidad con el verdadero streaming asincrónico donde el lado de envío ahora no bloquea los subprocesos si el lado de recepción no está leyendo o lee despacio, lo que aumenta la escalabilidad. Se quitó la limitación de almacenamiento en búfer de mensaje cuando un cliente envía un mensaje transmitido por secuencias a un servicio WCF hospedado en IIS. Para obtener más información, consulta Características de simplificación de WCF.

Simplificar la exposición de un punto de conexión sobre HTTPS con IIS

Se ha agregado una asignación de protocolo HTTPS para simplificar la exposición de un extremo sobre HTTPS. Para habilitar un punto de conexión HTTPS, asegúrese de que el sitio web tenga un enlace HTTPS y un certificado SSL configurado y, a continuación, habilite simplemente HTTPS para el directorio virtual que hospeda el servicio. Si los metadatos están habilitados para el servicio, también se expondrán mediante HTTPS.

Generar un único documento WSDL

Algunas pilas de procesamiento WSDL de terceros no pueden procesar los documentos WSDL que tienen dependencias de otros documentos mediante xsd:import. WCF permite especificar ahora que toda la información del WSDL se devuelva en un único documento. Para solicitar un solo documento WSDL, anexe «?singleWSDL» al URI cuando solicite metadatos del servicio.

Compatibilidad de WebSocket

WebSockets es una tecnología que proporciona comunicación bidireccional verdadera por los puertos 80 y 443 con características de rendimiento similares a TCP. Se han agregado dos nuevos enlaces para admitir la comunicación mediante un transporte WebSocket. NetHttpBinding y NetHttpsBinding. Para más información, consulte Enlaces estructurados.

Nuevos valores de transporte predeterminados

En la tabla siguiente se describen los valores que han cambiado y dónde encontrar información adicional.

Propiedad Activado Nuevo valor predeterminado Para obtener más información, vea
channelInitializationTimeout NetTcpBinding 30 segundos ChannelInitializationTimeout
listenBacklog NetTcpBinding 12 * número de procesadores ListenBacklog
maxPendingAccepts ConnectionOrientedTransportBindingElement

SMSvcHost.exe
2 * número de procesadores para transporte

4 * número de procesadores para SMSvcHost.exe
MaxPendingAcceptsConfiguración del servicio de uso compartido de puertos Net.TCP
maxPendingConnections ConnectionOrientedTransportBindingElement 12 * número de procesadores MaxPendingConnections
receiveTimeout SMSvcHost.exe 30 segundos Configuración del servicio de uso compartido de puertos Net.TCP

Configurar servicios WCF en el código

El uso de Windows Communication Foundation (WCF) permite que los desarrolladores configuren servicios mediante el uso de archivos de configuración o código. Los archivos de configuración son útiles cuando un servicio se debe configurar después de implementarse. Cuando se usan archivos de configuración, un profesional de TI solo debe actualizar el archivo de configuración; no es necesario que realice ninguna recompilación. Los archivos de configuración, sin embargo, pueden ser complejos y difíciles de mantener. No se admite la depuración de archivos de configuración y se hace referencia a los elementos de configuración por nombre, con lo que la creación de archivos de configuración resulta propensa a errores y difícil. El uso de WCF también permite que se configuren servicios mediante código. En versiones anteriores de WCF (4.0 y anteriores), la configuración de servicios mediante código era sencilla en los escenarios de servicios autohospedados; los puntos de conexión y los comportamientos podían configurarse en la clase ServiceHost antes de que se llamara a ServiceHost.Open. En escenarios hospedados en web, sin embargo, no tiene acceso a la clase ServiceHost. Para configurar un servicio hospedado en web era necesario crear un System.ServiceModel.ServiceHostFactory que creó el ServiceHostFactory y realizar cualquier configuración necesaria. A partir de la versión 4.5 de .NET, en WCF se incluye una manera más sencilla de configurar los servicios autohospedados y los servicios hospedados en web mediante código. Para obtener más información, vea Configuración de servicios WCF en código.

Almacenamiento en caché de ChannelFactory

Las aplicaciones cliente de WCF usan la clase ChannelFactory<TChannel> para crear un canal de comunicación con un servicio WCF. La crear de instancias de ChannelFactory<TChannel> genera sobrecarga porque implica las siguientes operaciones:

  1. Construir el árbol ContractDescription

  2. Reflejar todos los tipos de CLR necesarios

  3. Construir la pila del canal

  4. Desechar recursos

Para ayudar a reducir esta sobrecarga, WCF puede almacenar en caché los generadores de canal cuando se usa un proxy de cliente de WCF. Para obtener más información, consulte Generador de canales y almacenamiento en caché.

Compresión y el codificador binario

A partir de WCF 4.5, el codificador binario de WCF agrega compatibilidad con la compresión. El tipo de compresión se configura con la propiedad CompressionFormat. Tanto el cliente como el servicio deben configurar la propiedad CompressionFormat. La compresión funcionará para los protocolos HTTP, HTTPS y TCP. Si un cliente especifica usar compresión pero el servicio no la admite, se produce una excepción de protocolo que indica que no coinciden los protocolos. Para obtener más información, consulta Elección de un codificador de mensajes.

UDP

Se ha agregado compatibilidad para un transporte UDP que permite a los desarrolladores escribir servicios que usan mensajería «lanza y olvida». Un cliente envía un mensaje a un servicio y no espera ninguna respuesta de él.

Compatibilidad con autenticación múltiple

Se ha agregado compatibilidad para admitir varios modos de autenticación, como compatibles con IIS, en un solo extremo de WCF cuando se usa el transporte HTTP y la seguridad de transporte. IIS permite habilitar varios modos de autenticación en un directorio virtual; esta característica permite que un solo punto de conexión WCF admita los distintos modos de autenticación habilitados para el directorio virtual donde se hospeda el servicio WCF.

Compatibilidad con IDN

Se ha agregado compatibilidad para permitir servicios WCF con nombres de dominio internacionalizados. Para obtener más información, consulta WCF y Nombres de dominio internacionalizados.

HttpClient

Se ha agregado una nueva clase denominada HttpClient para simplificar el trabajo con solicitudes HTTP. Para más información, consulte HttpClient y Directrices para usar HttpClient.

IntelliSense de configuración

Los valores de atributo de los archivos de configuración para los atributos personalizados definidos en el proyecto ahora admiten IntelliSense para facilitar el trabajo con configuraciones de forma rápida y precisa.

Información sobre herramientas de configuración

Los elementos y atributos WCF de ahora tienen información sobre herramientas en el Editor XML, para identificar con mayor facilidad y exactitud el propósito del elemento o atributo.

Pegar datos como clases

En un proyecto de WCF, los tipos de datos definidos en XML (como los expuestos en un servicio) se pueden pegar directamente en una página de códigos. El tipo XML se pegará como un tipo de CLR. Consulta Generar clases de tipo de datos a partir de XML para obtener más detalles.

WebServiceHost y los puntos de conexión predeterminados

En Visual Studio 2010, WebServiceHost creaba automáticamente un extremo predeterminado sin importar si se había especificado explícitamente un extremo o no. En Visual Studio 2012 y posteriores, WebServiceHost solo crea un punto de conexión predeterminado si no se agrega ningún punto de conexión explícitamente. Si el cliente espera el punto de conexión predeterminado, se puede agregar explícitamente un punto de conexión y dirigir el cliente a él. Como alternativa, puede pedirle a WCF que vuelva al comportamiento anterior; para ello, agregue la siguiente configuración al archivo de configuración de aplicaciones

<appSettings>
    <add key="wcf:webservicehost:enableautomaticendpointscompatability" value="true"/>
  </appSettings>

IHttpCookieContainerManager

Esta interfaz, expuesta por IChannelFactory<TChannel>, facilita considerablemente el trabajo con cookies en el lado cliente. Cuando AllowCookies se establece en true en el enlace, puede obtener acceso a las cookies con el siguiente código:

IHttpCookieContainerManager cookieManager = factory.GetProperty<IHttpCookieContainerManager>();
System.Net.CookieContainer container = cookieManager.CookieContainer;

A continuación, puede establecer o recuperar las cookies desde CookieContainer. Cuando AllowCookies se establece en false, puede recuperar manualmente las cookies mediante OperationContext y enviarlo en otras solicitudes con otro OperationContext o inspector de mensaje. La interfaz de IHttpCookieContainerManager permite autenticar un usuario con un servicio y usar la cookie de autenticación devuelta por dicho servicio para autenticar con otros servicios.