利用WCF实现上传下载文件服务

摘要:
使用WCF上传文件在WCF没出现之前,我一直使用用WebService来上传文件,我不知道别人为什么要这么做,因为我们的文件服务器和网站后台和网站前台都不在同一个机器,操作人员觉得用FTP传文件太麻烦,我就做一个专门用来上传文件的WebService,把这个WebService部署在文件服务器上,然后在网站后台调用这个WebService,把网站后台页面上传上来的文件转化为字节流传给WebService,然后WebService把这个字节流保存文件到一个只允许静态页面的网站。

使用WCF上传文件

在WCF没出现之前,我一直使用用WebService来上传文件,我不知道别人为什么要这么做,因为我们的文件服务器和网站后台和网站前台都不在同一个机器,操作人员觉得用FTP传文件太麻烦,我就做一个专门用来上传文件的WebService,把这个WebService部署在文件服务器上,然后在网站后台调用这个WebService,把网站后台页面上传上来的文件转化为字节流传给WebService,然后WebService把这个字节流保存文件到一个只允许静态页面的网站(静态网站可以防止一些脚本木马)。 WebService来上传文件存在的问题是效率不高,而且不能传输大数据量的文件,当然你可以用Wse中的MTOM来传输大文件,有了WCF就好多了,通过使用WCF传递Stream对象来传递大数据文件,但有一些限制:

1、只有 BasicHttpBinding、NetTcpBinding 和 NetNamedPipeBinding 支持传送流数据。

2、 流数据类型必须是可序列化的 Stream 或 MemoryStream。

3、 传递时消息体(Message Body)中不能包含其他数据。

4、TransferMode的限制和MaxReceivedMessageSize的限制等。

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

利用WCF实现上传下载文件服务第1张{
利用WCF实现上传下载文件服务第2张[OperationContract(Action="UploadFile",IsOneWay=true)]
利用WCF实现上传下载文件服务第2张voidUploadFile(FileUploadMessagerequest);
利用WCF实现上传下载文件服务第4张}
利用WCF实现上传下载文件服务第5张
利用WCF实现上传下载文件服务第5张
利用WCF实现上传下载文件服务第5张[MessageContract]
利用WCF实现上传下载文件服务第5张publicclassFileUploadMessage
利用WCF实现上传下载文件服务第9张利用WCF实现上传下载文件服务第10张利用WCF实现上传下载文件服务第1张{
利用WCF实现上传下载文件服务第2张[MessageHeader(MustUnderstand=true)]
利用WCF实现上传下载文件服务第2张publicstringSavePath;
利用WCF实现上传下载文件服务第2张
利用WCF实现上传下载文件服务第2张[MessageHeader(MustUnderstand=true)]
利用WCF实现上传下载文件服务第2张publicstringFileName;
利用WCF实现上传下载文件服务第2张
利用WCF实现上传下载文件服务第2张[MessageBodyMember(Order=1)]
利用WCF实现上传下载文件服务第2张publicStreamFileData;
利用WCF实现上传下载文件服务第2张
利用WCF实现上传下载文件服务第4张}
利用WCF实现上传下载文件服务第1张{
利用WCF实现上传下载文件服务第2张[OperationContract(Action="UploadFile",IsOneWay=true)]
利用WCF实现上传下载文件服务第2张voidUploadFile(FileUploadMessagerequest);
利用WCF实现上传下载文件服务第4张}

[ServiceContract] public interface IUpLoadService { [OperationContract(Action = "UploadFile", IsOneWay = true)] void UploadFile(FileUploadMessage request); }

[MessageContract] public class FileUploadMessage { [MessageHeader(MustUnderstand = true)] public string SavePath;

[MessageHeader(MustUnderstand = true)] public string FileName;

[MessageBodyMember(Order = 1)] public Stream FileData;

}

定义FileUploadMessage类的目的是因为第三个限制,要不然文件名和存放路径就没办法传递给WCF了,根据第二个限制,文件数据是用System.IO.Stream来传递的

接口方法只有一个,就是上传文件,注意方法参数是FileUploadMessage

接口实现类文件的代码如下:

public class UpLoadService : IUpLoadService { public void UploadFile(FileUploadMessage request) { string uploadFolder = @"C:kkk"; string savaPath = request.SavePath; string dateString = DateTime.Now.ToShortDateString() + @""; string fileName = request.FileName; Stream sourceStream = request.FileData; FileStream targetStream = null; if (!sourceStream.CanRead) { throw new Exception("数据流不可读!"); } if (savaPath == null) savaPath = @"Photo"; if (!savaPath.EndsWith("\")) savaPath += "\";

uploadFolder = uploadFolder + savaPath + dateString; if (!Directory.Exists(uploadFolder)) { Directory.CreateDirectory(uploadFolder); }

string filePath = Path.Combine(uploadFolder, fileName); using (targetStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None)) { //read from the input stream in 4K chunks //and save to output stream const int bufferLen = 4096; byte[] buffer = new byte[bufferLen]; int count = 0; while ((count = sourceStream.Read(buffer, 0, bufferLen)) > 0) { targetStream.Write(buffer, 0, count); } targetStream.Close(); sourceStream.Close(); } }

}

实现的功能是到指定目录下按照日期进行目录划分,然后以传过来的文件名保存文件。

这篇文章最主要的地方就是下面的Web.Config配置:

<system.serviceModel>
利用WCF实现上传下载文件服务第5张<bindings>
利用WCF实现上传下载文件服务第5张<basicHttpBinding>
利用WCF实现上传下载文件服务第5张<bindingname="FileTransferServicesBinding"maxReceivedMessageSize="9223372036854775807"
利用WCF实现上传下载文件服务第5张messageEncoding="Mtom"transferMode="Streamed"sendTimeout="00:10:00"/>
利用WCF实现上传下载文件服务第5张</basicHttpBinding>
利用WCF实现上传下载文件服务第5张</bindings>
利用WCF实现上传下载文件服务第5张<services>
利用WCF实现上传下载文件服务第5张<servicebehaviorConfiguration="UploadWcfService.UpLoadServiceBehavior"
利用WCF实现上传下载文件服务第5张name="UploadWcfService.UpLoadService">
利用WCF实现上传下载文件服务第5张<endpointaddress=""binding="basicHttpBinding"bindingConfiguration="FileTransferServicesBinding"contract="UploadWcfService.IUpLoadService">
利用WCF实现上传下载文件服务第5张</endpoint>
利用WCF实现上传下载文件服务第5张<endpointaddress="mex"binding="mexHttpBinding"contract="IMetadataExchange"/>
利用WCF实现上传下载文件服务第5张</service>
利用WCF实现上传下载文件服务第5张</services>
利用WCF实现上传下载文件服务第5张<behaviors>
利用WCF实现上传下载文件服务第5张<serviceBehaviors>
利用WCF实现上传下载文件服务第5张<behaviorname="UploadWcfService.UpLoadServiceBehavior">
利用WCF实现上传下载文件服务第5张<serviceMetadatahttpGetEnabled="true"/>
利用WCF实现上传下载文件服务第5张<serviceDebugincludeExceptionDetailInFaults="false"/>
利用WCF实现上传下载文件服务第5张</behavior>
利用WCF实现上传下载文件服务第5张</serviceBehaviors>
利用WCF实现上传下载文件服务第5张</behaviors>
利用WCF实现上传下载文件服务第5张</system.serviceModel>

配置要遵循上面的第一条和第四条限制,因为默认.net只能传4M的文件,所以要在 <System.Web>配置节下面加上<httpRuntimemaxRequestLength="2097151"/>

这样WCFService就完成了,新建一个Console项目或者Web项目测试一下。要注意的是Client端的配置必须要和服务端一样,实例程序在这里下载

免责声明:文章转载自《利用WCF实现上传下载文件服务》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇git基本命令--远程安装RHEL7红帽操作系统下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

pycharm上传文件目录到Linux

前言:相信不少学Python或者正在编写项目的Python爱好者都在用pycharm,有时候要上传文件目录到Linux服务器,比较麻烦,但是Pycharm已经有这个功能了,详细实现如下 1、打开Pycharm编辑器,选择选项Tools-Deployment-Configuration 2、填写命名,这个可以随便起,选择Type为SFTP 3、填写服务...

WCF:调用方未由服务器进行身份验证

在使用wsHttpBinding方式,且又没有安全验证的情况下客户端调用服务会报:调用方未有服务器进行身份验证的异常。 原因:wsHttpBinding默认为安全认证模式,排除此异常只需要修改配置文件,在wsHttpBinding配置中添加<security mode="None"/>即可。 1 <system.serviceModel...

我的WCF之旅 (11): 再谈WCF的双向通讯基于Http的双向通讯 V.S. 基于TCP的双向通讯

在一个基于面向服务的分布式环境中,借助一个标准的、平台无关的Communication Infrastructure,各个Service通过SOAP Message实现相互之间的交互。这个交互的过程实际上就是Message Exchange的过程。WCF支持不同形式的Message Exchange,我们把这称之为Message Exchange Patt...

wcf通道Channel

正文       客户端与服务进行交互的过程是通过通道进行交互的。客户端通过调用代理类执行相应的方法,通过通道编码,调用上下文,传输客户端的事务,管理可靠会话,对消息正文的加密,最后要执行的通道是传输通道就像我们七层的最后一层是物理传输层与服务端的那一头的传输通道交接。服务端拿到以后会逐个拆包,然后交给分发器,分发器交给对应的服务处理。         ...

koa 上传图片,上传文件,批量上传文件,批量上传图片...

冰火koa版上传 一切以简单粗暴易用的koa上传文件、上传图片方式 使用指南 1、下载依赖库(koa-icefire-upload) yarn add koa-icefire-upload 2、在koa里使用 const {icefireUpload} = require('koa-icefire-upload'); router.post('/', a...

NServiceBus 概况

NServiceBus 概况NServiceBus 概况 NServiceBus 被设计用来组合面向业务的服务,它并不是用来替代诸如 WCF 一类的RPC技术。 NServiceBus 不只包含通信模块,像其他成熟的SOA和DDD项目一样,它使用了多种组合的方法和技术。 本篇文章探讨了 NServiceBus 和微软相关产品的相似点和不同点。 相比 Biz...