Para ver el artículo en inglés, active la casilla Inglés. También puede ver el texto en inglés en una ventana emergente si pasa el puntero del mouse por el texto.
Traducción
Inglés

Características de simplificación de WCF

.NET Framework (current version)
 

Publicado: mayo de 2016

En este tema se describen las características nuevas que simplifican la escritura de aplicaciones WCF.

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>

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

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 de subconjuntos portátiles solo hacen referencia a bibliotecas portátiles de .NET que son un ensamblado de .NET Framework que puede usarse en cualquier plataforma básica de .NET.La experiencia del desarrollador es igual que agregar una referencia de servicio en cualquier otra aplicación cliente de WCF.Para obtener más información, consulteAgregar referencia de servicio en un proyecto de subconjuntos portátiles.

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 atributo aspNetCompatibilityEnabled en true en la sección <serviceHostingEnvironment> de web.config.Además, cualquier servicio de este appDomain debe tener la propiedad RequirementsMode en su AspNetCompatibilityRequirementsAttribute establecida en Allowed o en Required.De forma predeterminada, AspNetCompatibilityRequirementsAttribute ahora se establece en Allowed y la plantilla de aplicación de servicio WCF predeterminada establece el atributo aspNetCompatibilityEnabled en true.Para obtener más información, consulteNovedades de Windows Communication Foundation 4.5 y Servicios WCF y ASP.NET.

  • Se ha agregado a WCF una nueva compatibilidad para streaming asincrónico.Para habilitar el streaming asincrónico, agregue el comportamiento de extremo 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 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 obtener más información sobremaxRequestLength, vea <httpRuntime> (elemento de configuración).Todavía deberá configurar maxAllowedContentLength, Para obtener más información, consulteLímites de solicitud de IIS.

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

Propiedad

On

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 obtener más información, consulteChannelInitializationTimeout

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 obtener más información, consulteListenBacklog

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 obtener 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 obtener más información, consulteMaxPendingConnections

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 obtener más información, consulteConfiguración del servicio de uso compartido de puertos Net.TCP.

System_CAPS_noteNota

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 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 la 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 StackOverflowException irrecuperable.Existe una correlación directa entre anidamiento de XML y anidamiento de objeto para DataContractSerializer y T:System.Runtime.Serialization.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.

System_CAPS_importantImportante

Consulte “Usar XML con seguridad” en Consideraciones de seguridad para datos para obtener más información sobre la seguridad de los datos.

System_CAPS_noteNota

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.

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.

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 y sus propiedades que forma parte del archivo de configuración del servicio.

  1. Permite a un único extremo de WCF responder a distintos modos de autenticación.

  2. Permite que la configuración de seguridad de un servicio WCF esté controlada por IIS

Mostrar: