温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎样实现WCF上传文件

发布时间:2021-11-24 09:45:55 来源:亿速云 阅读:252 作者:柒染 栏目:编程语言

今天就跟大家聊聊有关怎样实现WCF上传文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

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

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

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

[ServiceContract]  publicinterfaceIUpLoadService  {  [OperationContract(Action="UploadFile",IsOneWay=true)]  voidUploadFile(FileUploadMessagerequest);  }  [MessageContract]  publicclassFileUploadMessage  {  [MessageHeader(MustUnderstand=true)]  publicstringSavePath;  [MessageHeader(MustUnderstand=true)]  publicstringFileName;  [MessageBodyMember(Order=1)]  publicStreamFileData;  }

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

publicclassUpLoadService:IUpLoadService  {  publicvoidUploadFile(FileUploadMessagerequest)  {  stringuploadFolder=@"C:\kkk\";  stringsavaPath=request.SavePath;  stringdateString=DateTime.Now.ToShortDateString()+@"\";  stringfileName=request.FileName;  StreamsourceStream=request.FileData;  FileStreamtargetStream=null;  if(!sourceStream.CanRead)  {  thrownewException("数据流不可读!");  }  if(savaPath==null)savaPath=@"Photo\";  if(!savaPath.EndsWith("\\"))savaPath+="\\";   uploadFolderuploadFolder=uploadFolder+savaPath+dateString;  if(!Directory.Exists(uploadFolder))  {  Directory.CreateDirectory(uploadFolder);  }  stringfilePath=Path.Combine(uploadFolder,fileName);  using(targetStream=newFileStream(filePath,FileMode.Create,FileAccess.Write,FileShare.None))  {  //readfromtheinputstreamin4Kchunks  //andsavetooutputstream  constintbufferLen=4096;  byte[]buffer=newbyte[bufferLen];  intcount=0;  while((count=sourceStream.Read(buffer,0,bufferLen))>0)  {  targetStream.Write(buffer,0,count);  }  targetStream.Close();  sourceStream.Close();  }  }  }

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

<system.serviceModel> <bindings> <basicHttpBinding> <bindingnamebindingname="FileTransferServicesBinding"maxReceivedMessageSize="9223372036854775807"  messageEncoding="Mtom"transferMode="Streamed"sendTimeout="00:10:00"/> </basicHttpBinding> </bindings> <services> <servicebehaviorConfigurationservicebehaviorConfiguration="UploadWcfService.UpLoadServiceBehavior" name="UploadWcfService.UpLoadService"> <endpointaddressendpointaddress=""binding="basicHttpBinding"bindingConfiguration="FileTransferServicesBinding"contract="UploadWcfService.IUpLoadService"> </endpoint> <endpointaddressendpointaddress="mex"binding="mexHttpBinding"contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behaviornamebehaviorname="UploadWcfService.UpLoadServiceBehavior"> <serviceMetadatahttpGetEnabledserviceMetadatahttpGetEnabled="true"/> <serviceDebugincludeExceptionDetailInFaultsserviceDebugincludeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>

看完上述内容,你们对怎样实现WCF上传文件有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

wcf
AI