采取微软提供的透明压缩方式,自定义的绑定,在传输大的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>无效

解决方案 »

  1.   

    当然不行了,这个需要直接修改源文件才行的。
    找到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>();
            }
      

  2.   

    难道你还需要客户端往服务器端传大数据?因为一般情况下,只要服务端往客户端传大数据,所以改那一处即可,如果你反过来也需要,也就是需要向服务器上传大数据的话,还需要改一个函数,就在它下面:        public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
            {
                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>();
            }这是服务器端的限制修改。