WCF readerQuotas设置 - 缺点?

时间:2009-05-07 14:49:52

标签: wcf performance

如果WCF服务在其响应消息中返回字节数组,则数据有可能超过默认长度16384字节。发生这种情况时,异常将类似于

  

最大阵列长度配额(16384)   读取XML时已超出   数据。这个配额可能会增加   更改MaxArrayLength属性   在XmlDictionaryReaderQuotas上   创建XML时使用的对象   阅读器。

我在网上看到的所有建议只是将<readerQuotas>元素中的设置增加到最大值,所以

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

在服务器上,类似于客户端。

我想知道这种方法的任何缺点,特别是如果字节数组的大小可能只是偶尔变得非常大。上面的设置是否只是让WCF为每个请求声明一个巨大的数组?您是否必须限制返回的数据的最大大小,或者您是否只需指定一个合理大小的缓冲区并让WCF继续运行直到读取所有数据?

谢谢!

2 个答案:

答案 0 :(得分:33)

主要缺点是可能存在攻击漏洞 - 例如恶意来源现在可以使您的网络服务器充斥着最大2 GB的消息并可能将其关闭。

当然,允许2 GB消息也会在内存消耗方面给您的服务器带来一些压力,因为这些消息需要在内存中完整地组装(除非您在WCF中使用流协议)。如果您有10个客户端向您发送2 GB消息,您的服务器上将需要大量RAM! : - )

除此之外,我没有看到任何实际问题。

马克

答案 1 :(得分:8)

MSDN上有一篇文章解释了设置这些值时需要考虑的各种安全注意事项。一些拒绝服务攻击是那些占用内存的攻击,其中一些(例如MaxDepth没有正确设置)可能导致致命的StackOverflowExceptions,这可能会在一个请求中关闭您的服务器。

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