利用wcf改进文件流传输的三种方式

上传人:ji****n 文档编号:45128574 上传时间:2018-06-15 格式:DOCX 页数:16 大小:220.04KB
返回 下载 相关 举报
利用wcf改进文件流传输的三种方式_第1页
第1页 / 共16页
利用wcf改进文件流传输的三种方式_第2页
第2页 / 共16页
利用wcf改进文件流传输的三种方式_第3页
第3页 / 共16页
利用wcf改进文件流传输的三种方式_第4页
第4页 / 共16页
利用wcf改进文件流传输的三种方式_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《利用wcf改进文件流传输的三种方式》由会员分享,可在线阅读,更多相关《利用wcf改进文件流传输的三种方式(16页珍藏版)》请在金锄头文库上搜索。

1、利用利用 WCF 改进文件流传输的三种方式改进文件流传输的三种方式 本文来自博客园 作者:Frank Xu Lei WCF 在跨域传输使用了两种模型的方法调用:一种是同步模型,这种模型显然对那些需要 大量操作时间的方法调用(如从数据库中获取大量数据时)是一种痛苦的选择。另一种是 异步模型的方法调用,这种模型是一种非阻塞方法,其方法调用期间并不等到方法调用结 束获得结果才返回,而是方法调用一经开始就马上返回,程序可以继续向前执行,被调用 方法和主程序同时执行,在调用方法结束才返回结果。显然这种模型给了我们很好的编程 和使用体验。 基于 WCF 在普通的编码是以文本编码方式在信道之间传输信息的,这

2、种编码会把所有的 二进制信息以字节数组的形式存储,并以 Base64 进行编码,而 Base64 则是用三个字节来 储存 4 个字符信息。使得数据量增大约 30%以上。在 WCF 中引入了一种专门针对数据流 进行优化编码的 MTOM 模型。下面我们使用编码模型和调用模型三种方式来改写文件流 的传输,以提高 WCF 应用程序的性能。 1、 MTOM 模型: 这模型在于将 SOAP 消息编码成 SOAP MT OM(消息传输优化机制)编码。这种编码是为那 些包含大量的二进制数据的 SOAP 消息而做的,它是把数据流作为 SOAP 消息的附件而添 加的。所以利用这种编码在传输信道之间传输可以显著提高

3、传输性能。在 WCF 中 MTOM 模型的操作契约中只能使用单个 Stream 对象作为参数或者返回类型。这种模型的特点如图所示: 1.1 实现服务契约 服务契约是服务所支持的操作、使用的消息交换模式和每一则消息的格式,它控制消息被 格式化的方式,在这里由于要使用 MTOM 编码消息,所以在操作契约中必须要以单一的 Stream 对象为输入输出参数。所以这儿我们把服务定义为如下的形式: ServiceContract public interface ISendStreamService OperationContract void SendStream(Stream stream); /这个

4、方法的是为了传递文件的参数而设的 OperationContract void FileNameSetting(string filename, string destinationpath); 另外我们还定义了一个传输文件路径的名称的辅助方法:FileNameSetting(); 1.2 实现服务器方法 在上面定义了公共的接口后,接下来我们就实现接口的方法,主要的方法的目的是为了传 输 Stream 对象,由于 Stream 是一个抽象类,所以这儿以文件流为操作对象来使用 SendStream()这个方法。public class SendStreamService : ISendStrea

5、mService static FileStream outStream = null; static int startLength; static int fileLength; static int maxBytesCount=4096; static byte bytes = new byteint maxBytesCount; string filePath; static string fileName; public void SendStream(System.IO.Stream stream) string file = filePath + “/“ + fileName;

6、outStream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write); try while (startLength = stream.Read(bytes, 0, int maxBytesCount) 0) outStream.Write(bytes, 0, startLength); fileLength += startLength; catch (Exception e) public void FileNameSetting(string filename,string destinationpath) f

7、ileName = filename; filePath = destinationpath; 1.3 客户通过接口调用服务器方法 客户端调用服务器方法至少有三种,这里我们选择工厂方法来实现, System.ServiceMode.Channel.ChannelFactory类是这个信道工厂类,它的方法 CreateChannel()可以创建 T 的实例。 ISendStreamService proxy=newChannelFactory(“WSHttpBinding_ISendStreamService”).Create- Channel(); proxy.FileNameSetting(

8、file.Substring (file.LastIndexOf (“)+1), filePath); proxy.SendStream(inStream); 1.4 服务器和客户端的配置信息 配置信息定义了双方通信的终结点、绑定、契约行为及其他的配置如安全,可靠性等。服 务器的配置如:同样客户端的配置如:注意:在这种方式下使用同步和异步方法没有明显的差别,后来我在分析了 Windows Trace Viewer 的消息包,发现在用异步方法时,整个过程只用两个消息来回,这就意味着 第一次的 SOAP 包是在把 SOAP 消息加上 MTOM 编码的文件流作为附件一起发送的,在 等待文件传输完成后

9、才会返回一个加高消息给方法。也就是说异步方法 IAsyncResult Begin*(params parameters,AsyncCallback callback,object state)是在发送第一个 SOAP 包,并 等待服务器接收完第一个包后回应消息包才会返回的。由于在发送文件流时,因为文本字 符始终不会超过一个 SOAP 包而必须等待。所在在这种编码方式下异步调用和同步调用没 有差别。 2、 基于同步传输的异步回调模型: 同步传输是指方法在调用过程中一直阻塞到方法调用结束返回结果才会让程序继续向前执 行,这种行为比较耗费资源,因为网络访问在等待方法完成的时间内是阻塞的。而且如果

10、远程对象的调用时花费的时间会更长,所以这种时间的浪费让人是不可接受的,这在大文 件传输中尤为明显。于是一种让方法的异步调用的机制便产生了。这种方法的内部处理中 使用线程池中的一个线程接管这个调用,程序可以获得异步调用的返回信息而继续向前执 行。 WCF 编程模型中采用了一种让同步传输中使用异步回调的方式来提高应用程序的响应。具 体是在每个操作契约中可以选择生成异步方法的调用,具体是在同步方法的前面加上IAsyncResult Begin.(params param,AsyncCallback,object state)形式表明这是一个异步调用。 并且生成相应的 void End(IAsyncR

11、esult state)来返回结果。 2.1 定义契约和实现相应的同步方法 这里在服务契约中定义了相应的同步方法,用这个调用 FileStream 类的同步方法 Read()和 Write()方法对文件进行读写操作,以实现将文件传输到服务的机器上。这里在服务契约中 通过设置属性 CallbackContract 来实现客户端的回调功能。来其相应的代码如下:ServiceContract(CallbackContract = typeof(IUploadCallback) public interface IUploadFileService /同步传输的接口 OperationContract

12、 void FileUpload(string localFilePath, string netPath); public interface IUploadCallback OperationContract(IsOneWay = true) void ReportFileUpload(int length);/这个回调函数是文件传输完成时发布一个通知 /实现文件读写的服务器方法 public class UploadFileService : IUploadFileService static int startLength; static int fileLength; static

13、int bytesLength; static byte bytes; static int maxLength=4096; static FileStream inStream = null; static FileStream outStream = null; IUploadCallback client = null; public void FileUpload(string localFilePath, string netPath) /获得客户端代理的回调 client = OperationContext.Current.GetCallbackChannel(); /得到原始文

14、件名 string fileName = localFilePath.Substring(localFilePath.LastIndexOf(“) + 1); string netFile = netPath + fileName; bytes = new bytemaxLength;/设置缓冲区 try outStream = new FileStream(netFile, FileMode.OpenOrCreate, FileAccess.Write); inStream = File.OpenRead(localFilePath);/打开文件读 int length; while (le

15、ngth = inStream.Read(bytes, 0, maxLength) 0) fileLength += length; outStream.Write(bytes, 0, length); catch (Exception e) Console.WriteLine(“文件上传错误:“ + e.Message); inStream.Close(); outStream.Close(); finally client.ReportFileUpload(fileLength);/使用回调报告文件的状态 inStream.Close(); outStream.Close(); 2.2 在

16、客户端调用方法 在客户端调用 BeginFileUpload()和 EndFileUpload()方法来实现客户端的异步回调。并在这 些方法完成后服务调用客户回调 ReportFileUpload()报告给客户端相应的信息。 3、 基于异步传输的异步模型: 在同步方式处理中,文件传输的时间是和文件的长度密切相关的,对于一个大容量的文件 传输,如果全部在主线程中执行,那么应用程序可能会等待很长的时间,因此我们给予文 件流以异步方法读写的方法来实现性能的改进。这只调用了文件操作的异步处理。第二种 模式一样这也是采用线程池来完成的。这实际上是利用了文件流的异步方法。 在这儿我们仍然使用第二种模型的 WCF 框架,只是我们这儿使用了 FileStream 对象 BeginWrite();BeginRead()方法及相应的 EndWrite();EndRead()方法。这儿我们只给出了

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号