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