Características de simplificación de WCF
En este tema se describen las características nuevas que simplifican la escritura de aplicaciones WCF.
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:
- ¿Por qué se recomienda gRPC para los desarrolladores de WCF?
- Comparación de WCF con gRPC
- Introducción a gRPC para desarrolladores de WCF
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.
El siguiente es un ejemplo de un archivo de configuración generado por WCF 3.0.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard" maxBufferSize="65536"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192"
maxArrayLength="16384" maxBytesPerRead="4096"
maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
El siguiente es un ejemplo del mismo archivo de configuración generado por WCF 4.5.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IService1" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:36906/Service1.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>
Desarrollo de contrato primero
WCF admite ahora el desarrollo de contrato primero. La herramienta svcutil.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 programadores de ensamblados de .NET pueden usar proyectos de subconjuntos portátiles para mantener un único árbol de origen y un único sistema de compilación mientras que se mantiene la compatibilidad con varias implementaciones de .NET (escritorio, Silverlight, Windows Phone y Xbox). En los proyectos de subconjuntos portátiles, solo se hace referencia a las bibliotecas de .NET que constituyen ensamblados que pueden usarse en cualquier otra implementación de .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, debe establecer el aspNetCompatibilityEnabled
atributo en true en la sección <serviceHostingEnvironment> de web.config. Además, cualquier servicio de este dominio de aplicación debe tener la propiedad RequirementsMode
en su atributo AspNetCompatibilityRequirementsAttribute establecido en Allowed o Required. De manera predeterminada, AspNetCompatibilityRequirementsAttribute ahora se establece en Allowed y la plantilla de aplicación de servicio WCF predeterminada establece el atributo aspNetCompatibilityEnabled
en true
. Para más información, consulte Novedades de Windows Communication Foundation 4.5 y Servicios WCF y ASP.NET.
Mejoras en streaming
Se ha agregado a WCF una nueva compatibilidad para streaming asincrónico. Para habilitar el streaming asincrónico, agregue el comportamiento de punto de conexión DispatcherSynchronizationBehavior al host de servicio y establezca la propiedad AsynchronousSendEnabled en
true
. Esto puede beneficiar a la escalabilidad cuando un servicio envía mensajes de secuencias a varios clientes que leen despacio. WCF ya no bloquea un subproceso por cliente y liberará el subproceso para atender a otro cliente.Se han quitado las limitaciones sobre el almacenamiento en búfer de mensajes cuando un servicio está hospedado en IIS. En versiones anteriores de WCF, al recibir un mensaje para un servicio hospedado por IIS que usaba transferencia de mensajes de streaming, ASP.NET almacenaba en búfer todo el mensaje antes de enviarlo a WCF. Esto provocaba que el consumo de memoria fuera grande. Este almacenamiento en búfer se ha quitado en .NET Framework 4.5 y ahora los servicios WCF hospedados en IIS pueden empezar a procesar el flujo de entrada antes de que se haya recibido el mensaje completo, lo que permite streaming auténtico. Esto permite que WCF responda inmediatamente a los mensajes y permite mejorar el rendimiento. Además, ya no es necesario especificar un valor para
maxRequestLength
, el límite de tamaño de ASP.NET en las solicitudes entrantes. Si se establece esta propiedad, se omite. Para más información sobremaxRequestLength
, consulte elemento de configuración <httpRuntime>. Todavía deberá configurar maxAllowedContentLength. Para más información, consulte Límites de solicitud de IIS.
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 | Más información |
---|---|---|---|
channelInitializationTimeout | NetTcpBinding | 30 segundos | Esta propiedad determina cuánto tiempo puede tardar una conexión TCP en autenticarse a sí misma mediante el protocolo de tramas .NET. Un cliente debe enviar algunos datos iniciales antes de que el servidor tenga información suficiente para realizar la autenticación. Este tiempo de expiración se ha hecho intencionadamente más breve que ReceiveTimeout (10 min) para que los clientes no autenticados y malintencionados no conserven las conexiones con el servidor durante mucho tiempo. El valor predeterminado es 30 segundos. Para más información sobre ChannelInitializationTimeout |
listenBacklog | NetTcpBinding | 16 * número de procesadores | Esta propiedad del nivel de socket describe el número de solicitudes "pendientes de aceptación" que se van a poner en cola. Si la cola de trabajos pendientes de escucha se llena, las nuevas solicitudes de socket se rechazarán. Para más información sobre ListenBacklog |
maxPendingAccepts | ConnectionOrientedTransportBindingElement SMSvcHost.exe |
2 * número de procesadores para transporte 4 * número de procesadores para SMSvcHost.exe |
Esta propiedad limita el número de canales que el servidor pueda tener en espera en un agente de escucha. Cuando MaxPendingAccepts es demasiado bajo, hay un pequeño intervalo de tiempo en el que todos los canales en espera han iniciado conexiones de mantenimiento, pero sin que ningún canal nuevo haya empezado a escuchar. Una conexión puede llegar durante este intervalo y producirá un error porque no hay nada en espera en el servidor. Esta propiedad se puede configurar si se establece la propiedad MaxPendingConnections en un número mayor. Para más información, consulte MaxPendingAccepts y Configuración del servicio de uso compartido de puertos Net.TCP. |
maxPendingConnections | ConnectionOrientedTransportBindingElement | 12 * número de procesadores | Esta propiedad controla cuántas conexiones ha aceptado un transporte pero no las ha seleccionado el distribuidor de ServiceModel. Para establecer este valor, use MaxConnections en el enlace o maxOutboundConnectionsPerEndpoint en el elemento de enlace. Para más información sobre MaxPendingConnections |
receiveTimeout | SMSvcHost.exe | 30 segundos | Esta propiedad especifica el tiempo de expiración para la lectura de datos de trama de TCP y para la conexión mediante el envío desde las conexiones subyacentes. Existe para limitar el tiempo que el servicio SMSvcHost.exe se mantiene ocupado para leer los datos de preámbulo de una conexión entrante. Para más información, consulte Configuración del servicio de uso compartido de puertos Net.TCP. |
Nota
Estos valores predeterminados nuevos se usan solo si implementa el servicio WCF en un equipo con .NET Framework 4.5. Si implementa el mismo servicio en un equipo con .NET Framework 4.0, se usan los valores predeterminados de .NET Framework 4.0. En tales casos se recomienda configurar estos valores de forma explícita.
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. La cuota de MaxReceivedMessageSize
no se ha cambiado, de modo que aún puede limitar el consumo de memoria para evitar que sea necesario tratar la complejidad de XmlDictionaryReaderQuotas. En la tabla siguiente se muestran las cuotas, sus nuevos valores predeterminados y una breve descripción de para qué se usa cada cuota.
Nombre de cuota | Valor predeterminado | Descripción |
---|---|---|
MaxArrayLength | Int32.MaxValue | Obtiene y establece la longitud máxima permitida de matriz. Esta cuota limita el tamaño máximo de una matriz de primitivas que devuelve el lector XML, incluidas las matrices de bytes. Esta cuota no limita el consumo de la memoria en el propio lector XML, sino en cualquier componente que esté utilizando el lector. Por ejemplo, cuando DataContractSerializer utiliza un lector protegido con MaxArrayLength, no deserializa matrices de bytes mayores que esta cuota. |
MaxBytesPerRead | Int32.MaxValue | Obtiene y establece el máximo permitido de bytes devueltos para cada lectura. Esta cuota limita el número de bytes que se leen en una operación de lectura única al leer la etiqueta de inicio de elemento y sus atributos. (En los casos en que no haya transmisión, el propio nombre del elemento no se cuenta para la cuota). Tener demasiados atributos XML puede usar un tiempo de proceso desproporcionado porque se tiene que comprobar la unicidad de los nombres de atributo. MaxBytesPerRead mitiga esta amenaza. |
MaxDepth | 128 nodos de profundidad | Esta cuota limita la profundidad máxima del anidamiento de elementos XML. MaxDepth interactúa con MaxBytesPerRead: el lector siempre mantiene los datos en memoria para el elemento vigente y todos sus antecesores, por lo que el consumo máximo de la memoria del lector es proporcional al producto de estos dos valores. Al deserializar un gráfico de objetos profundamente anidado, el deserializador se ve obligado a obtener acceso a la pila completa e iniciar una StackOverflowExceptionirrecuperable. Existe una correlación directa entre anidamiento de XML y anidamiento de objeto para DataContractSerializer y XmlSerializer. MaxDepth se usa para mitigar esta amenaza. |
MaxNameTableCharCount | Int32.MaxValue | Esta cuota limita el número máximo de caracteres permitidos en un objeto nametable. La tabla de nombres contiene ciertas cadenas (como espacios de nombres y prefijos) que se encuentran al procesar un documento XML. Como estas cadenas están almacenadas en búfer en la memoria, esta cuota se usa para evitar el almacenamiento en búfer excesivo cuando se espera streaming. |
MaxStringContentLength | Int32.MaxValue | Esta cuota limita el tamaño máximo de la cadena que el lector XML devuelve. Esta cuota no limita el consumo de la memoria en el propio lector XML, sino en el componente que está utilizando el lector. Por ejemplo, cuando DataContractSerializer utiliza un lector protegido con MaxStringContentLength, no deserializa cadenas mayores que esta cuota. |
Importante
Consulte "Uso de XML de forma segura" en Consideraciones de seguridad para los datos para obtener más información sobre cómo proteger los datos.
Nota
Estos valores predeterminados nuevos se usan solo si implementa el servicio WCF en un equipo con .NET Framework 4.5. Si implementa el mismo servicio en un equipo con .NET Framework 4.0, se usan los valores predeterminados de .NET Framework 4.0. En tales casos se recomienda configurar estos valores de forma explícita.
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 ahora se validan. 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 de BasicHttpBinding
Permite a un único extremo de WCF responder a distintos modos de autenticación.
Permite que la configuración de seguridad de un servicio WCF esté controlada por IIS