2009-05-07 12 views
27

Si un servicio WCF devuelve una matriz de bytes en su mensaje de respuesta, existe la posibilidad de que los datos excedan la longitud predeterminada de 16384 bytes. Cuando esto sucede, la excepción será algo así comoReader WCFConfiguración de cuotas: ¿desventajas?

La cuota máxima longitud de la matriz (16384) se ha excedido al leer XML datos. Esta cuota se puede aumentar en cambiando la propiedad MaxArrayLength en el objeto XmlDictionaryReaderQuotas utilizado al crear el lector XML .

Todos los consejos que he visto en la web es sólo para aumentar los ajustes en el elemento <readerQuotas> al máximo, así que algo como

<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
       maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
       maxNameTableCharCount="2147483647" /> 

en el servidor, y similares en el cliente.

Me gustaría saber de cualquier inconveniente con este enfoque, especialmente si el tamaño de la matriz de bytes puede ocasionalmente ser muy grande. ¿La configuración anterior solo hace que WCF declare una gran matriz para cada solicitud? ¿Tiene que limitar el tamaño máximo de los datos devueltos, o puede simplemente especificar un búfer de tamaño razonable y conseguir que WCF continúe hasta que se lean todos los datos?

Gracias!

Respuesta

33

El principal inconveniente es una posible vulnerabilidad a los ataques, p. una fuente maliciosa ahora puede inundar su servidor web con un mensaje de hasta 2 GB de tamaño y posiblemente bajarlo.

Por supuesto, permitir mensajes de 2 GB también pone un poco de tensión en su servidor en términos de consumo de memoria, ya que esos mensajes deben ser ensamblados en memoria, en su totalidad (a menos que use protocolos de transmisión en WCF). Si tienes 10 clientes enviándote mensajes de 2 GB, necesitarás mucha RAM en tu servidor. :-)

Aparte de eso, no veo ningún problema real.

Marc

+0

Ok, por lo que los ajustes en la configuración del servidor sólo afectan a los mensajes de solicitud y los ajustes en la configuración del cliente afectan a los mensajes de respuesta? Si tengo un servicio que recibe un pequeño mensaje de solicitud pero puede devolver una respuesta grande, ¿tengo que hacer algún cambio en la configuración del servidor o dejarlo en manos de los clientes? ¿Hay alguna manera de cambiar la configuración del servidor para que cuando un cliente crea una referencia de servicio se configure automáticamente para respuestas grandes? ¡Gracias! –

+0

¿Cómo se estructura esa "gran respuesta"? ¿Básicamente es un archivo que estás devolviendo? Si es así, verificaría la transmisión de una respuesta basada en flujo. Por lo que yo entiendo, la configuración del servidor afectará las solicitudes entrantes, así como las respuestas salientes, por lo que si configuras el tamaño del mensaje demasiado pequeño, no será posible una respuesta grande (básicamente estás dimensionando un buffer en el servidor utilizado para solicitudes y respuestas). –

8

Hay un artículo en MSDN que explica las diversas consideraciones de seguridad que necesite para pensar en la hora de establecer estos valores. Algunos ataques de denegación de servicio son los que devoran su memoria y algunos de ellos (como MaxDepth no se ha configurado correctamente) podrían causar StackOverflowExceptions fatales que podrían provocar la caída de su servidor en una sola solicitud.

http://msdn.microsoft.com/en-us/library/ms733135.aspx