本帖最后由 boss_george 于 2014-11-04 12:40:42 编辑

解决方案 »

  1.   

    定义一个类,用类作为参数
    如:
    public class Param
    {
         public byte []byt {get;set;} //很长的数组
    }public void youfunction(Param p)  //这里传Param对象p,p里byt属性可以是很长的数组
    {
    }
      

  2.   

    基本算解决了吧。
    使用WSDualHttpBinding替换了NetTcpBinding,现在本机做测试,30M数据可以传输。
    使用类包裹一次的效果是一样的,依然会报错。
    至于参数,因为之前看了Caozhy的一个例子,我觉得完全不用app.config或web.config的方式比较容易部署发布,所以最终并没有任何的配置文件可以修改,都是代码方式的。如果可能,我希望这个帖子再放一阵子,希望了解WCF大数据传输的能来关注。呵呵,点个名:Caozhy,之前看的你的例子做的。
      

  3.   

    我手头项目就是用net.tcp的,传几百兆文件毫无压力。其实我觉得WCF用配置文件反而麻烦,代码实现配置就简单多了。具体的楼主可以看我的其中一篇博文,实现起来及其简单。
      

  4.   

    NetTcpBinding理论上可以传大文件个人觉得发送大数据需要有取舍:
    一次传输文件过大,
    局域网可能没问题,如果网络条件差,
    发生异常后需要重发的数据量也大。
    多次重发效率反倒会低。
      

  5.   

    哪一篇呢?我按照那个“无配置WCF客户端的一个简单到令人发指的实现方法”,也无法传输大文件呢
    如果可以,可否下载我的代码稍微修改下发给我?感激!
      

  6.   

    哪一篇呢?我按照那个“无配置WCF客户端的一个简单到令人发指的实现方法”,也无法传输大文件呢
    如果可以,可否下载我的代码稍微修改下发给我?感激!就是这篇呀,我在里面贴了一些示例代码,把服务器端、客户端的相关代码都贴出来了呀。你稍稍改一下就能用了
      

  7.   

    哪一篇呢?我按照那个“无配置WCF客户端的一个简单到令人发指的实现方法”,也无法传输大文件呢
    如果可以,可否下载我的代码稍微修改下发给我?感激!我看了一下,服务器端没什么不同。客户端你在代码里面先声明一下Binding和Address,
    如以下代码:
    _BaseAddress = String.Format("net.tcp://{0}:{1}/", Config.BaseAddress(), Config.Port());  //从配置文件获取服务器地址和端口
        _Address = new EndpointAddress(_BaseAddress + "MainForm");//为不同的服务加上相应的路径,这样多个服务就可以使用同一个端口  
        _Binding.Security.Mode = SecurityMode.None;   
        _Binding.MaxReceivedMessageSize = 1048576;   
        _Binding.ReaderQuotas.MaxStringContentLength = 16777216;   
        _Binding.ReaderQuotas.MaxArrayLength = 16777216;  然后在上传文件的方法里面,先实例化一个client:
    _Client = new BaseService.BaseClient(_Binding, _Address); 
    然后正常使用你的WCF方法就可以了
      

  8.   

    [quote=引用 11 楼 xuanbg 的回复:
    我看了一下,服务器端没什么不同。客户端你在代码里面先声明一下Binding和Address,
    如以下代码:
    _BaseAddress = String.Format("net.tcp://{0}:{1}/", Config.BaseAddress(), Config.Port());  //从配置文件获取服务器地址和端口
        _Address = new EndpointAddress(_BaseAddress + "MainForm");//为不同的服务加上相应的路径,这样多个服务就可以使用同一个端口  
        _Binding.Security.Mode = SecurityMode.None;   
        _Binding.MaxReceivedMessageSize = 1048576;   
        _Binding.ReaderQuotas.MaxStringContentLength = 16777216;   
        _Binding.ReaderQuotas.MaxArrayLength = 16777216;  然后在上传文件的方法里面,先实例化一个client:
    _Client = new BaseService.BaseClient(_Binding, _Address); 
    然后正常使用你的WCF方法就可以了你看过我代码了么?似乎,我按你的这个设置后,还是只能发送<1M的数据呢,虽然我最终也会限制发送小于1M的数据,但是我本机调试都如此,担心回头网络上环境不好时候经常会报错。还请继续关注,最好能直接测试下我代码并修改下,不是我偷懒不想修改,您说的我都改到代码中了,依然不可以呢
    本来打算放弃TcpBinding了,您这么一说,我又想使用了,但,还是不可以~
      

  9.   

    _Binding.MaxReceivedMessageSize = xxx,这里改大就行了
      

  10.   

    这里还有个用Gzip压缩传输的方法。用的是CustomBinding
                // 设置Endpoint基地址
                string _BaseAddress = String.Format("net.tcp://{0}:{1}/", Config.BaseAddress(), Config.Port());            // 设置Endpoint绑定
                var _Binding = new CustomBinding();            var transport = new TcpTransportBindingElement();
                transport.MaxReceivedMessageSize = 2147483647;
                transport.TransferMode = TransferMode.Streamed;            var encoder = new BinaryMessageEncodingBindingElement();
                encoder.ReaderQuotas.MaxArrayLength = 2147483647;
                encoder.ReaderQuotas.MaxStringContentLength = 2147483647;            var gZipEncoding = new GZipMessageEncodingBindingElement(encoder);            _Binding.Elements.Add(encoder);// 参数说明:普通模式使用(encoder);压缩模式使用(gZipEncoding)
                _Binding.Elements.Add(transport);
                _Binding.ReceiveTimeout = TimeSpan.FromMinutes(30);
                _Binding.SendTimeout = TimeSpan.FromMinutes(30);
      

  11.   

    测试代码2已经按照xuanbg的修改了,还是不可以,是否可以帮忙看看嗯?
      

  12.   

    引用微软的一个示例包里面的GZipEncoder项目就行了,这个包你百度一下就有下载
      

  13.   

    服务器端和客户端都改一下这几句            binding.MaxReceivedMessageSize = 2147483647;
                binding.ReaderQuotas.MaxStringContentLength = 2147483647;
                binding.ReaderQuotas.MaxArrayLength = 2147483647;就是把参数调大,就可以了