WCF问题 - 大数据做参数,文件传输 本帖最后由 boss_george 于 2014-11-04 12:40:42 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 定义一个类,用类作为参数如:public class Param{ public byte []byt {get;set;} //很长的数组}public void youfunction(Param p) //这里传Param对象p,p里byt属性可以是很长的数组{} 基本算解决了吧。使用WSDualHttpBinding替换了NetTcpBinding,现在本机做测试,30M数据可以传输。使用类包裹一次的效果是一样的,依然会报错。至于参数,因为之前看了Caozhy的一个例子,我觉得完全不用app.config或web.config的方式比较容易部署发布,所以最终并没有任何的配置文件可以修改,都是代码方式的。如果可能,我希望这个帖子再放一阵子,希望了解WCF大数据传输的能来关注。呵呵,点个名:Caozhy,之前看的你的例子做的。 我手头项目就是用net.tcp的,传几百兆文件毫无压力。其实我觉得WCF用配置文件反而麻烦,代码实现配置就简单多了。具体的楼主可以看我的其中一篇博文,实现起来及其简单。 NetTcpBinding理论上可以传大文件个人觉得发送大数据需要有取舍:一次传输文件过大,局域网可能没问题,如果网络条件差,发生异常后需要重发的数据量也大。多次重发效率反倒会低。 哪一篇呢?我按照那个“无配置WCF客户端的一个简单到令人发指的实现方法”,也无法传输大文件呢如果可以,可否下载我的代码稍微修改下发给我?感激! 哪一篇呢?我按照那个“无配置WCF客户端的一个简单到令人发指的实现方法”,也无法传输大文件呢如果可以,可否下载我的代码稍微修改下发给我?感激!就是这篇呀,我在里面贴了一些示例代码,把服务器端、客户端的相关代码都贴出来了呀。你稍稍改一下就能用了 哪一篇呢?我按照那个“无配置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方法就可以了 [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了,您这么一说,我又想使用了,但,还是不可以~ _Binding.MaxReceivedMessageSize = xxx,这里改大就行了 这里还有个用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); 测试代码2已经按照xuanbg的修改了,还是不可以,是否可以帮忙看看嗯? 引用微软的一个示例包里面的GZipEncoder项目就行了,这个包你百度一下就有下载 服务器端和客户端都改一下这几句 binding.MaxReceivedMessageSize = 2147483647; binding.ReaderQuotas.MaxStringContentLength = 2147483647; binding.ReaderQuotas.MaxArrayLength = 2147483647;就是把参数调大,就可以了 C# 利用Schema解析指定的xml 小弟初学者,有个疑问。。还望指点。。 C# 到底可不可以调用 c++ callback,需要注意什么? 写存储过程报错 请问在.NET中连续打印的较好方法 .NET下报表打印完美解决方案 求一个ASPxGridView的项目,最好带过滤的,功能多些的 求助!C#编译平台搭建问题 当窗体大小改变时,如何动态的改变控件的大小?急。。。。。。。 很简单阿,快来拿分阿,(60分白送阿) 关于UDP通信,同一个端口收发的问题 bandedgridview 的band边框可以加粗吗?
如:
public class Param
{
public byte []byt {get;set;} //很长的数组
}public void youfunction(Param p) //这里传Param对象p,p里byt属性可以是很长的数组
{
}
使用WSDualHttpBinding替换了NetTcpBinding,现在本机做测试,30M数据可以传输。
使用类包裹一次的效果是一样的,依然会报错。
至于参数,因为之前看了Caozhy的一个例子,我觉得完全不用app.config或web.config的方式比较容易部署发布,所以最终并没有任何的配置文件可以修改,都是代码方式的。如果可能,我希望这个帖子再放一阵子,希望了解WCF大数据传输的能来关注。呵呵,点个名:Caozhy,之前看的你的例子做的。
一次传输文件过大,
局域网可能没问题,如果网络条件差,
发生异常后需要重发的数据量也大。
多次重发效率反倒会低。
如果可以,可否下载我的代码稍微修改下发给我?感激!
如果可以,可否下载我的代码稍微修改下发给我?感激!就是这篇呀,我在里面贴了一些示例代码,把服务器端、客户端的相关代码都贴出来了呀。你稍稍改一下就能用了
如果可以,可否下载我的代码稍微修改下发给我?感激!我看了一下,服务器端没什么不同。客户端你在代码里面先声明一下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方法就可以了
我看了一下,服务器端没什么不同。客户端你在代码里面先声明一下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了,您这么一说,我又想使用了,但,还是不可以~
// 设置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);
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.ReaderQuotas.MaxArrayLength = 2147483647;就是把参数调大,就可以了