没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2007-12-10 10:12:15.000|阅读 908 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
WCF 支持对 Stream 对象的操作,尤其对于传递 size 过大的消息而言,如要考虑传递消息的效率,WCF 推荐通过 Stream 进行操作。
然而,WCF 对于 Stream 操作规定了一些限制,在我们编写相关程序时,需要特别注意:
1、绑定的限制
如果需要使用 Stream 操作,可以使用的绑定只能是 BasicHttpBinding,NetTcpBinding 以及 NetNamedPipeBinding。此外,在使用 Stream 操作时,不能使用 Reliable Messaging。如果考虑到消息安全,则此方式是不可取的。
2、对 Stream 对象的限制
要作为服务操作所传递的消息对象,这样的对象必须是可序列化的。遗憾的是,FileStream 类的定义却是不支持序列化的,我们能够使用的 Stream 对象,包括 Stream,MemoryStream 等。使用 Stream 类对象是大多数 Stream 操作的首选。
一个有趣的现象是 FileStream 与 Stream 类型的转换。例如在服务契约的操作中,有如下的实现:
public Stream TransferDocument(Document document)
{
FileStream stream = new FileStream
(document.LocalPath, FileMode.Open, FileAccess.Read);
return stream;
}
注意,操作 TransferDocument()的返回类型为 Stream,而方法的实现中,返回的对象则为 FileStream 类型。由于 Stream 类是 FileStream 类的父类,这样的实现没有问题。
然而,在客户端调用该操作时,却不能将操作的返回值赋给 FileStream 类型的对象,如下所示:
FileStream stream = m_service.TransferDocument(doc);
此时获得的 Stream 对象则为 null。因而,我们只能这样调用操作:
Stream stream = m_service.TransferDocument(doc);
但是,还有一个奇怪的问题是 WCF 并不支持 Stream 对象 Length 属性的序列化,也就是说,在客户端我们不能使用服务操作返回的 Stream 对象的 Length 属性。诸如 stream.Length 的调用会抛出 NotSupportedException 异常。
3、TransferMode 的限制
若要使用 Stream 操作,必须修改绑定的 TransferMode 属性。该属性的默认值为 Buffered。我们应该根据操作中 Stream 对象的参数类型,以决定 TransferMode 的值分别为 Streamed、StreamedRequest 或者 StreamedResponse。
4、MaxReceivedMessageSize 的限制
MaxReceivedMessageSize 属性的默认值为64kb,如果传递的 Stream 对象一旦超过了 MaxReceivedMessageSize 属性的设置值,则客户端在操作该对象时,就会出现 CommunicationException 异常。因此,我们应根据实际需要设置 MaxReceivedMessageSize 的值。MaxReceivedMessageSize 属性的取值范围为1-9223372036854775807(Int32.MaxValue)。如果设置值不在该范围之内,则无法通过编译。编程方式设置为:
binding.MaxReceivedMessageSize = 120000;
配置文件的设置方式为:
<binding …… maxReceivedMessageSize="120000"/>
5、操作参数的限制
WCF 对包含了 Stream 对象的操作参数进行严格的限制,它只允许这样的操作只能包含一个 Stream 对象,这里所谓的一个 Stream 对象,是包含 return 对象,out 和 ref 对象在内的。也就是说如下的操作定义都是错误的:
void Transfer(Stream s1, Stream s2);
void Transfer(Stream s1, out Stream s2);
void Transfer(Stream s1, ref Stream s2);
Stream Transfer(Stream stream);
如果定义了这样的操作,则会出现运行时错误。
此外,由于传输的 Stream 对象较大,可能会消耗过长的时间,因而建议增大绑定的 SendTimeout 属性值。例如设置为10分钟。编程方式设置为:
binding.SendTimeout = TimeSpan.FromMinutes(10);
配置文件的设置方式为:
<binding …… sendTimeout="00:10:00"/>
注意,对绑定的相关设置必须要求服务端与客户端的配置一致。最佳实践是均通过配置文件进行设置。例如在我的应用程序中是这样设置的:
<basicHttpBinding>
<binding name="DocumentExplorerServiceBinding"
sendTimeout="00:10:00"
transferMode="Streamed"
messageEncoding="Text"
textEncoding="utf-8"
maxReceivedMessageSize="9223372036854775807">
binding>
basicHttpBinding>
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:博客园面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号