如果WCF服务在其响应消息中返回字节数组,则数据有可能超过默认长度16384字节。发生这种情况时,异常将类似于
最大阵列长度配额(16384) 读取XML时已超出 数据。这个配额可能会增加 更改MaxArrayLength属性 在XmlDictionaryReaderQuotas上 创建XML时使用的对象 阅读器。
我在网上看到的所有建议只是将<readerQuotas>
元素中的设置增加到最大值,所以
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
在服务器上,类似于客户端。
我想知道这种方法的任何缺点,特别是如果字节数组的大小可能只是偶尔变得非常大。上面的设置是否只是让WCF为每个请求声明一个巨大的数组?您是否必须限制返回的数据的最大大小,或者您是否只需指定一个合理大小的缓冲区并让WCF继续运行直到读取所有数据?
谢谢!
答案 0 :(得分:33)
主要缺点是可能存在攻击漏洞 - 例如恶意来源现在可以使您的网络服务器充斥着最大2 GB的消息并可能将其关闭。
当然,允许2 GB消息也会在内存消耗方面给您的服务器带来一些压力,因为这些消息需要在内存中完整地组装(除非您在WCF中使用流协议)。如果您有10个客户端向您发送2 GB消息,您的服务器上将需要大量RAM! : - )
除此之外,我没有看到任何实际问题。
马克
答案 1 :(得分:8)
MSDN上有一篇文章解释了设置这些值时需要考虑的各种安全注意事项。一些拒绝服务攻击是那些占用内存的攻击,其中一些(例如MaxDepth没有正确设置)可能导致致命的StackOverflowExceptions,这可能会在一个请求中关闭您的服务器。