转:WCF传送二进制流数据基本实现步骤详解
2013-10-31 16:35
323 查看
来自:http://developer.51cto.com/art/201002/185444.htm
WCF传送二进制流数据的相关操作方法在实际应用中是一个比较基础的操作应用。我们在这里将会针对此做一个详细介绍。
我们知道,在实现WCF传送二进制流数据这一操作过程中,会有一些限制因素。我们在实际应用中要特别注意这一点。今天我们就会针对这方面的问题做一个详细的介绍,希望对大家有所帮助。
WCF释放服务对象最直接方式解读
WCF分布事务保证数据完整性
Silverlight调用WCF出现异常解决方案
WCF套接字连接中断具体解决方法详解
寄宿WCF服务相关实现方法解析
只有 BasicHttpBinding、WebHttpBinding、NetTcpBinding 和 NetNamedPipeBinding 支持传送流数据。
流数据类型必须是可序列化的 Stream 或 MemoryStream。
传递时消息体(Message Body)中不能包含其他数据。
我们先看看下面的WCF传送二进制流数据例子。
注意将 Binding.TransferMode 设置为 TransferMode.Streamed,我们还可以修改 Binding.MaxReceivedMessageSize 来调整消息大小(默认是64KB)。
一切正常。那么 "传递时消息体(Memory Body)中不能包含其他数据" 是什么意思?我们修改一下上面的契约,除了传递文件流外,我们还希望传递文件名。
当你修改完WCF传送二进制流数据的代码后,运行时你发现触发了一个 InvalidOperationException 异常。
未处理 System.InvalidOperationException
Message="For request in operation Upload to be a stream the operation must have a single parameter whose type is Stream."
Source="System.ServiceModel"
那么该怎么办呢?DataContract 肯定不行。 没错!你应该记得 MessageContract,将 filename 放到 MessageHeader 里面就行了。
问题解决了。上面的例子使用 BaseHttpBinding,如果使用 NetTcpBinding,相信速度要快很多。除了向服务器传送流外,也可反向返回流数据。
虽然服务器在操作结束时会自动关闭客户端 Request Stream,但个人建议还是使用 try...finnaly... 自主关闭要好一些,因为意外总是会发生的。
WCF传送二进制流数据的全部操作方法就为大家介绍到这里。
WCF传送二进制流数据基本实现步骤详解
2010-02-26 16:10 佚名 CSDNWCF传送二进制流数据的相关操作方法在实际应用中是一个比较基础的操作应用。我们在这里将会针对此做一个详细介绍。
我们知道,在实现WCF传送二进制流数据这一操作过程中,会有一些限制因素。我们在实际应用中要特别注意这一点。今天我们就会针对这方面的问题做一个详细的介绍,希望对大家有所帮助。
WCF释放服务对象最直接方式解读
WCF分布事务保证数据完整性
Silverlight调用WCF出现异常解决方案
WCF套接字连接中断具体解决方法详解
寄宿WCF服务相关实现方法解析
只有 BasicHttpBinding、WebHttpBinding、NetTcpBinding 和 NetNamedPipeBinding 支持传送流数据。
流数据类型必须是可序列化的 Stream 或 MemoryStream。
传递时消息体(Message Body)中不能包含其他数据。
我们先看看下面的WCF传送二进制流数据例子。
注意将 Binding.TransferMode 设置为 TransferMode.Streamed,我们还可以修改 Binding.MaxReceivedMessageSize 来调整消息大小(默认是64KB)。
[ServiceContract] public interface IFileService { [OperationContract] void Upload(Stream stream); } public class FileService : IFileService, IDisposable { public void Upload(Stream stream) { FileStream file = new FileStream("test.dll", FileMode.Create); try { BinaryWriter writer = new BinaryWriter(file); BinaryReader reader = new BinaryReader(stream); byte[] buffer; do { buffer = reader.ReadBytes(1024); writer.Write(buffer); } while (buffer.Length > 0); } finally { file.Close(); stream.Close(); } } public void Dispose() { Console.WriteLine("Dispose..."); } } public class WcfTest { public static void Test() { AppDomain.CreateDomain("Server").DoCallBack(delegate { ServiceHost host = new ServiceHost(typeof(FileService), new Uri("http://localhost:8080/FileService")); BasicHttpBinding binding = new BasicHttpBinding(); binding.TransferMode = TransferMode.Streamed; host.AddServiceEndpoint(typeof(IFileService), binding, ""); host.Open(); }); BasicHttpBinding binding2 = new BasicHttpBinding(); binding2.TransferMode = TransferMode.Streamed; IFileService channel = ChannelFactory<IFileService>.CreateChannel(binding2, new EndpointAddress("http://localhost:8080/FileService")); using (channel as IDisposable) { FileStream stream = new FileStream("MyLibrary2.dll", FileMode.Open); channel.Test(stream); stream.Close(); } } }
一切正常。那么 "传递时消息体(Memory Body)中不能包含其他数据" 是什么意思?我们修改一下上面的契约,除了传递文件流外,我们还希望传递文件名。
[ServiceContract] public interface IFileService { [OperationContract] void Upload(string filename, Stream stream); } // ... 其他代码暂略 ...
当你修改完WCF传送二进制流数据的代码后,运行时你发现触发了一个 InvalidOperationException 异常。
未处理 System.InvalidOperationException
Message="For request in operation Upload to be a stream the operation must have a single parameter whose type is Stream."
Source="System.ServiceModel"
那么该怎么办呢?DataContract 肯定不行。 没错!你应该记得 MessageContract,将 filename 放到 MessageHeader 里面就行了。
[MessageContract] public class FileData { [MessageHeader] public string filename; [MessageBodyMember] public Stream data; } [ServiceContract] public interface IFileService { [OperationContract] void Upload(FileData file); } public class FileService : IFileService, IDisposable { public void Upload(FileData file) { FileStream f = new FileStream(file.filename, FileMode.Create); try { BinaryWriter writer = new BinaryWriter(f); BinaryReader reader = new BinaryReader(file.data); byte[] buffer; do { buffer = reader.ReadBytes(1024); writer.Write(buffer); } while (buffer.Length > 0); } finally { f.Close(); file.data.Close(); } } public void Dispose() { Console.WriteLine("Dispose..."); } } public class WcfTest { public static void Test() { AppDomain.CreateDomain("Server").DoCallBack(delegate { ServiceHost host = new ServiceHost(typeof(FileService), new Uri("http://localhost:8080/FileService")); BasicHttpBinding binding = new BasicHttpBinding(); binding.TransferMode = TransferMode.Streamed; host.AddServiceEndpoint(typeof(IFileService), binding, ""); host.Open(); }); BasicHttpBinding binding2 = new BasicHttpBinding(); binding2.TransferMode = TransferMode.Streamed; IFileService channel = ChannelFactory<IFileService>.CreateChannel(binding2, new EndpointAddress("http://localhost:8080/FileService")); using (channel as IDisposable) { FileData file = new FileData(); file.filename = "test2.dll"; file.data = new FileStream("MyLibrary2.dll", FileMode.Open); channel.Upload(file); file.data.Close(); } } }
问题解决了。上面的例子使用 BaseHttpBinding,如果使用 NetTcpBinding,相信速度要快很多。除了向服务器传送流外,也可反向返回流数据。
[ServiceContract] public interface IFileService { [OperationContract] void Upload(Stream stream); [OperationContract] Stream Download(string filename); }
虽然服务器在操作结束时会自动关闭客户端 Request Stream,但个人建议还是使用 try...finnaly... 自主关闭要好一些,因为意外总是会发生的。
WCF传送二进制流数据的全部操作方法就为大家介绍到这里。
相关文章推荐
- WCF 传送二进制流数据 stream
- WCF基础教程(四)——数据契约实现传送自定义数据类型
- 【hbase】HBase基本数据操作代码实现详解
- JS+WCF实现进度条实时监测数据加载量的方法详解
- 重温之Struts与Ajax结合向前台传送json数据实现ztree(一次性加载ztree)
- mysql基本数据类型详解
- java的栈与堆(基本数据类型与包装数据类型)详解
- 利用注解实现spring基本配置详解
- 稳扎稳打Silverlight(57) - 4.0通信之WCF RIA Services: 概述, 通过 DomainDataSource 实现数据的添加、查询、更新和删除操作
- 详解Android系统中跨应用数据分享功能的实现
- 详解如何实现一个基本的Android用户界面
- 详解C#中利用ODP实现瞬间导入百万级数据
- 稳扎稳打Silverlight(58) - 4.0通信之WCF RIA Services: 通过 Domain Service, 以 MVVM 模式实现数据的添加、删除、修改和查询
- HBase基本数据操作详解【完整版,绝对精品】
- 用JavaScript与WebService实现网页部分数据XML传送
- 数据结构实验二——单链表的基本实现
- (2) 第二章 WCF服务与数据契约 服务契约详解(三)- [ServiceContract]特性
- Spark Mllib里的Mllib基本数据类型(图文详解)
- 从ora10g 刷数据到 8I基本操作步骤
- stl map底层之红黑树插入步骤详解与代码实现