社区编辑申请
注册/登录
手把手教你实现WCF上传文件
开发 后端
文章主要实现WCF上传文件,有详细的步骤和代码介绍,喜欢研究WCF的朋友一定要仔细阅读,希望对大家有技术上的提高。

在优酷上我想上传一段视频,你有想过会台是怎么实现的吗?这里我就为大家分析一下关于利用WCF上传文件,在WCF没出现之前,我一直使用用WebService来上传文件,我不知道别人为什么要这么做,因为我们的文件服务器和网站后台和网站前台都不在同一个机器,操作人员觉得用FTP传文件太麻烦,我就做一个专门用来上传文件的WebService,把这个WebService部署在文件服务器上,然后在网站后台调用这个WebService,把网站后台页面上传上来的文件转化为字节流传给WebService,然后WebService把这个字节流保存文件到一个只允许静态页面的网站(静态网站可以防止一些脚本木马)。

#T#WebService来上传文件存在的问题是效率不高,而且不能传输大数据量的文件,当然你可以用Wse中的MTOM来传输大文件,有了WCF就好多了,通过使用WCF传递Stream对象来传递大数据文件,但有一些限制:只有BasicHttpBinding、NetTcpBinding和NetNamedPipeBinding支持传送流数据。流数据类型必须是可序列化的Stream或MemoryStream。传递时消息体(MessageBody)中不能包含其他数据。TransferMode的限制和MaxReceivedMessageSize的限制等。

下面具体实现:新建一个WCFService,接口文件的代码如下:

  1. [ServiceContract]  
  2. publicinterfaceIUpLoadService  
  3. {  
  4. [OperationContract(Action="UploadFile",IsOneWay=true)]  
  5. voidUploadFile(FileUploadMessagerequest);  
  6. }  
  7. [MessageContract]  
  8. publicclassFileUploadMessage  
  9. {  
  10. [MessageHeader(MustUnderstand=true)]  
  11. publicstringSavePath;  
  12. [MessageHeader(MustUnderstand=true)]  
  13. publicstringFileName;  
  14. [MessageBodyMember(Order=1)]  
  15. publicStreamFileData;  

定义FileUploadMessage类的目的是因为第三个限制,要不然文件名和存放路径就没办法传递给WCF了,根据第二个限制,文件数据是用System.IO.Stream来传递的接口方法只有一个,就是WCF上传文件,注意方法参数是FileUploadMessage接口实现类文件的代码如下:

  1. publicclassUpLoadService:IUpLoadService  
  2. {  
  3. publicvoidUploadFile(FileUploadMessagerequest)  
  4. {  
  5. stringuploadFolder=@"C:\kkk\";  
  6. stringsavaPath=request.SavePath;  
  7. stringdateString=DateTime.Now.ToShortDateString()+@"\";  
  8. stringfileName=request.FileName;  
  9. StreamsourceStream=request.FileData;  
  10. FileStreamtargetStream=null;  
  11. if(!sourceStream.CanRead)  
  12. {  
  13. thrownewException("数据流不可读!");  
  14. }  
  15. if(savaPath==null)savaPath=@"Photo\";  
  16. if(!savaPath.EndsWith("\\"))savaPath+="\\";  
  17.  
  18. uploadFolderuploadFolder=uploadFolder+savaPath+dateString;  
  19. if(!Directory.Exists(uploadFolder))  
  20. {  
  21. Directory.CreateDirectory(uploadFolder);  
  22. }  
  23. stringfilePath=Path.Combine(uploadFolder,fileName);  
  24. using(targetStream=newFileStream(filePath,FileMode.Create,FileAccess.Write,FileShare.None))  
  25. {  
  26. //readfromtheinputstreamin4Kchunks  
  27. //andsavetooutputstream  
  28. constintbufferLen=4096;  
  29. byte[]buffer=newbyte[bufferLen];  
  30. intcount=0;  
  31. while((count=sourceStream.Read(buffer,0,bufferLen))>0)  
  32. {  
  33. targetStream.Write(buffer,0,count);  
  34. }  
  35. targetStream.Close();  
  36. sourceStream.Close();  
  37. }  
  38. }  
  39. }  

实现的功能是到指定目录下按照日期进行目录划分,然后以传过来的文件名保存文件。这篇文章最主要的地方就是下面的Web.Config配置:

  1. <system.serviceModel> 
  2. <bindings> 
  3. <basicHttpBinding> 
  4. <bindingnamebindingname="FileTransferServicesBinding"maxReceivedMessageSize="9223372036854775807"  
  5. messageEncoding="Mtom"transferMode="Streamed"sendTimeout="00:10:00"/> 
  6. </basicHttpBinding> 
  7. </bindings> 
  8. <services> 
  9. <servicebehaviorConfigurationservicebehaviorConfiguration="UploadWcfService.UpLoadServiceBehavior" 
  10. name="UploadWcfService.UpLoadService"> 
  11. <endpointaddressendpointaddress=""binding="basicHttpBinding"bindingConfiguration="FileTransferServicesBinding"contract="UploadWcfService.IUpLoadService"> 
  12. </endpoint> 
  13. <endpointaddressendpointaddress="mex"binding="mexHttpBinding"contract="IMetadataExchange"/> 
  14. </service> 
  15. </services> 
  16. <behaviors> 
  17. <serviceBehaviors> 
  18. <behaviornamebehaviorname="UploadWcfService.UpLoadServiceBehavior"> 
  19. <serviceMetadatahttpGetEnabledserviceMetadatahttpGetEnabled="true"/> 
  20. <serviceDebugincludeExceptionDetailInFaultsserviceDebugincludeExceptionDetailInFaults="false"/> 
  21. </behavior> 
  22. </serviceBehaviors> 
  23. </behaviors> 
  24. </system.serviceModel> 
责任编辑:田树 来源: 博客
相关推荐

2009-12-22 15:14:33

WCF调用

2010-02-22 10:29:11

WCF上传文件

2009-11-05 10:13:39

WCF框架

2010-02-22 17:58:06

WCF异步上传

2009-12-21 10:00:46

WCF基础开发

2010-02-22 10:18:18

WCF配置文件

2010-03-01 13:17:46

WCF单向服务

2009-12-21 18:46:50

WCF传输大数据

2009-11-05 17:00:34

WCF有序传递

2009-11-06 09:48:40

2010-02-24 15:42:03

WCF服务端安全

2009-11-05 15:25:36

WCF服务端配置

2009-12-21 18:10:50

WCF实现事件通知

2010-02-23 14:48:38

WCF事件通知

2010-02-24 14:10:54

WCF修改App.co

2009-11-05 13:08:44

WCF客户端配置

2009-12-08 17:34:25

WCF的配置

2009-11-09 10:10:13

WCF异常

2009-12-21 13:27:45

WCF服务配置信息

2009-11-06 12:59:56

WCF服务通信

同话题下的热门内容

太强了!Python 开发桌面小工具,让代码替我们干重复的工作!Python轻量级Web框架:Bottle库!Python居然被用来开发游戏了?盘点你想不到的Python开发场景用了那么久的Lombok,你知道它的原理么?实战 | 如何用 Python 自动化监控文件夹完成服务部署!Fury:一个基于JIT动态编译的高性能多语言原生序列化框架细思恐极,插上U盘就开始执行Python代码太全了!用Python操作MySQL的使用教程集锦!

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号