Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se describen varias propiedades en diferentes áreas de la arquitectura de Windows Communication Foundation (WCF) que funcionan para controlar el consumo de recursos y afectar a las métricas de rendimiento.
Propiedades que restringen el consumo de recursos en WCF
Windows Communication Foundation (WCF) aplica restricciones en determinados tipos de procesos con fines de seguridad o rendimiento. Estas restricciones adquieren dos formas básicas: cuotas y aceleradores. Las cuotas son límites que cuando se alcanzan o superan desencadenan una excepción inmediata en algún momento del sistema. Las limitaciones son límites que no producen inmediatamente una excepción. En su lugar, cuando se alcanza el límite del acelerador, el procesamiento continúa pero dentro de los límites establecidos por ese valor. Este procesamiento limitado podría desencadenar una excepción en otra parte, pero esto depende de la aplicación.
Además de la distinción entre cuotas y limitadores, algunas propiedades de restricción están ubicadas en el nivel de serialización, algunas en el nivel de transporte y algunas en el nivel de aplicación. Por ejemplo, la cuota TransportBindingElement.MaxReceivedMessageSize, que implementa todos los elementos de enlace de transporte proporcionados por el sistema, se establece en 65.536 bytes de forma predeterminada para impedir que los clientes malintencionados interactúen en ataques por denegación de servicio contra un servicio al provocar un consumo excesivo de memoria. (Normalmente, puede aumentar el rendimiento reduciendo este valor).
Un ejemplo de una cuota de serialización es la DataContractSerializer.MaxItemsInObjectGraph propiedad , que especifica el número máximo de objetos que el serializador serializa o deserializa en una sola ReadObject llamada de método. Un ejemplo de un acelerador en el nivel de aplicación es la propiedad ServiceThrottle.MaxConcurrentSessions, que de forma predeterminada restringe el número de conexiones de canal con sesión simultáneas a 10. (A diferencia de las cuotas, si se alcanza este valor de limitación, la aplicación continúa procesando pero no acepta nuevos canales con sesión, lo que significa que los nuevos clientes no se pueden conectar hasta que finalice uno de los otros canales con sesión).
Estos controles están diseñados para proporcionar una mitigación integrada contra determinados tipos de ataques o para mejorar las métricas de rendimiento, como la superficie de memoria, el tiempo de inicio, etc. Sin embargo, en función de la aplicación, estos controles pueden impedir el rendimiento de la aplicación de servicio o impedir que la aplicación funcione en absoluto. Por ejemplo, una aplicación diseñada para transmitir vídeo puede superar fácilmente la propiedad predeterminada TransportBindingElement.MaxReceivedMessageSize . En este tema se proporciona información general sobre los distintos controles aplicados a las aplicaciones en todos los niveles de WCF, se describen varias formas de obtener más información sobre si una configuración está dificultando la aplicación y se describen formas de corregir varios problemas. La mayoría de los aceleradores y algunas cuotas están disponibles en el nivel de aplicación, incluso cuando la propiedad base es una serialización o una restricción de transporte. Por ejemplo, puede configurar la propiedad DataContractSerializer.MaxItemsInObjectGraph mediante la propiedad ServiceBehaviorAttribute.MaxItemsInObjectGraph en la clase de servicio.
Nota:
Si tiene un problema determinado, primero debe leer el Inicio Rápido de Solución de Problemas de WCF para ver si el problema (y una solución) se encuentra allí.
Las propiedades que restringen los procesos de serialización se enumeran en Consideraciones de seguridad para los datos. Las propiedades que restringen el consumo de recursos relacionados con los transportes se enumeran en Cuotas de transporte. Las propiedades que restringen el consumo de recursos en el nivel de aplicación son los miembros de la ServiceThrottle clase .
Detección de problemas de aplicación y rendimiento relacionados con la configuración de cuota
Los valores predeterminados de los valores anteriores se han elegido para habilitar la funcionalidad básica de la aplicación en una amplia gama de tipos de aplicación, al tiempo que proporcionan protección básica frente a problemas comunes de seguridad. Sin embargo, los diseños de las diferentes aplicaciones pueden superar uno o más valores de acelerador aunque por otro lado la aplicación sea segura y funcione como se ha diseñado. En estos casos, debe identificar qué valores de acelerador se superan y en qué nivel, y decidir la acción adecuada para aumentar el rendimiento de la aplicación.
Normalmente, al escribir la aplicación y depurarla, establece la propiedad ServiceDebugBehavior.IncludeExceptionDetailInFaults en true
en el archivo de configuración o mediante programación. Esto indica a WCF que se devuelvan los seguimientos de pila de excepciones de servicio a la aplicación cliente para verlas. Esta característica informa de la mayoría de las excepciones de nivel de aplicación de forma que se muestre qué configuración de cuota podría estar implicada, si ese es el problema.
Algunas excepciones se producen en tiempo de ejecución por debajo de la visibilidad de la capa de aplicación y no se devuelven mediante este mecanismo, y es posible que no se controlen mediante una implementación personalizada System.ServiceModel.Dispatcher.IErrorHandler . Si se encuentra en un entorno de desarrollo como Microsoft Visual Studio, la mayoría de estas excepciones se muestran automáticamente. Sin embargo, algunas excepciones se pueden enmascarar mediante la configuración del entorno de desarrollo, como Just My Code Visual Studio.
Independientemente de las funcionalidades del entorno de desarrollo, puede usar funcionalidades de seguimiento de WCF y registro de mensajes para depurar todas las excepciones y ajustar el rendimiento de las aplicaciones. Para obtener más información, consulte Uso del seguimiento para solucionar problemas de la aplicación.
Problemas de rendimiento y XmlSerializer
Servicios y aplicaciones cliente que utilizan tipos de datos serializables con XmlSerializer generan y compilan el código de serialización para esos tipos de datos en tiempo de ejecución, lo que puede dar lugar a que el rendimiento de inicio sea lento.
Nota:
El código de serialización generado previamente solo se puede usar en aplicaciones cliente y no en servicios.
La herramienta de utilidad de metadatos serviceModel (Svcutil.exe) puede mejorar el rendimiento de inicio de estas aplicaciones mediante la generación del código de serialización necesario a partir de los ensamblados compilados para la aplicación. Para obtener más información, vea Cómo mejorar el tiempo de inicio de las aplicaciones cliente WCF utilizando XmlSerializer.
Problemas de rendimiento al hospedar servicios WCF en ASP.NET
Cuando un servicio WCF se hospeda en IIS y ASP.NET, los valores de configuración de IIS y ASP.NET pueden afectar al rendimiento y la superficie de memoria del servicio WCF. Para obtener más información sobre el rendimiento de ASP.NET, consulte Mejora del rendimiento de ASP.NET. Una configuración que podría tener consecuencias no deseadas es MinWorkerThreads, que es una propiedad de .ProcessModelSection Si la aplicación tiene un número fijo o pequeño de clientes, establecer MinWorkerThreads en 2 podría proporcionar un aumento del rendimiento en una máquina multiprocesador que tenga un uso de CPU cercano a 100%. Este aumento del rendimiento conlleva un costo: también provocará un aumento en el uso de memoria, lo que podría reducir la escalabilidad.