采取微软提供的透明压缩方式,自定义的绑定,在传输大的Dataset和Datatable之类都没有问题,但是在传输二进制byte[]数组的时候,说我超出数组长度。如果只是普通nettcpbinding,可以<readerQuotas maxArrayLength ="16553600">这样设置的,但是自定义消息编码的时候,这种设置不能通过。我在网上找到个
<gzipMessageEncoding innerMessageEncoding="binaryMessageEncoding" >
<binaryMessageEncoding>
<readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
</binaryMessageEncoding>
</gzipMessageEncoding>
这上面的设置也不行,后台起动的时候,提示<binaryMessageEncoding>无效
<gzipMessageEncoding innerMessageEncoding="binaryMessageEncoding" >
<binaryMessageEncoding>
<readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
</binaryMessageEncoding>
</gzipMessageEncoding>
这上面的设置也不行,后台起动的时候,提示<binaryMessageEncoding>无效
找到GZipMessageEncodingBindingElement.cs,修改下面函数为: public override IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)
{
if (context == null)
throw new ArgumentNullException("context"); context.BindingParameters.Add(this); #region 修改XmlDictionaryReaderQuotas的限制
var property = GetProperty<XmlDictionaryReaderQuotas>(context);
property.MaxStringContentLength = 2147483647; //Int32.MaxValue
property.MaxArrayLength = 2147483647;
property.MaxBytesPerRead = 2147483647;
#endregion return context.BuildInnerChannelFactory<TChannel>();
}
{
if (context == null)
throw new ArgumentNullException("context"); #region 修改XmlDictionaryReaderQuotas的限制
var property = GetProperty<XmlDictionaryReaderQuotas>(context);
property.MaxStringContentLength = 2147483647; //Int32.MaxValue
property.MaxArrayLength = 2147483647;
property.MaxBytesPerRead = 2147483647;
#endregion context.BindingParameters.Add(this);
return context.BuildInnerChannelListener<TChannel>();
}这是服务器端的限制修改。