手把手教你实现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-07-03 17:15:31

jsp上传文件

2023-04-26 12:46:43

DockerSpringKubernetes

2011-04-28 09:23:36

REST

2022-03-29 11:11:11

TortoisGitGitee码云

2011-01-06 10:39:25

.NET程序打包

2021-07-14 09:00:00

JavaFX开发应用

2011-05-03 15:59:00

黑盒打印机

2011-01-10 14:41:26

2011-04-21 10:32:44

MySQL双机同步

2021-03-12 10:01:24

JavaScript 前端表单验证

2020-05-15 08:07:33

JWT登录单点

2022-01-08 20:04:20

拦截系统调用

2022-03-14 14:47:21

HarmonyOS操作系统鸿蒙

2022-12-07 08:42:35

2022-07-27 08:16:22

搜索引擎Lucene

2011-02-22 13:46:27

微软SQL.NET

2021-02-26 11:54:38

MyBatis 插件接口

2021-12-28 08:38:26

Linux 中断唤醒系统Linux 系统

2015-07-15 13:18:27

附近的人开发

2016-05-12 11:54:39

点赞
收藏

51CTO技术栈公众号