WCF实现文件的上传与下载
来源:互联网 发布:html5 书籍 知乎 编辑:程序博客网 时间:2024/05/17 22:21
一. 实现描述:
1. 创建文件上传下载的服务:StreamService
2. 宿主机加载文件上传下载服务并发布服务:Host
3. 在宿主中配置服务的ABC,配置文件接收与发送的传输模式/消息传输最大值:host.config
4. 客户端检索引用宿主发布的服务,并调用服务中的接口实现文件的上传与下载:Client
5. 配置客户端中引用服务的文件接收与发送的传输模式/消息传输最大值:client.config
二. 实现举例
1. 创建服务
通过流的方式进行文件的传输,实例中采用MemoryStream。
服务接口代码IStreamService:
[ServiceContract] public interface IStreamService { [OperationContract] MemoryStream DownloadFile(string fileName); [OperationContract] void DownloadFileByOutStream(out MemoryStream stream, string fileName); [OperationContract] void UploadFile(MemoryStream stream); }
服务接口实现代码StreamService:
public class StreamService : IStreamService { public MemoryStream DownloadFile(string fileName) { string filePath = AppDomain.CurrentDomain.BaseDirectory + fileName; byte[] content = File.ReadAllBytes(filePath); MemoryStream memory = new MemoryStream(content); Console.WriteLine("Begin to send file"); return memory; } public void DownloadFileByOutStream(out MemoryStream stream, string fileName) { stream = DownloadFile(fileName); } public void UploadFile(MemoryStream stream) { byte[] buffer = new byte[stream.Length]; for(long i =0 ;i<stream.Length ;i++) { buffer[i] = Convert.ToByte(stream.ReadByte()); } File.WriteAllBytes("u.zip", buffer); stream.Close(); Console.WriteLine("File is receviced"); } }
2. 宿主端的代码
采用控制台方式实现Host :
public class Program { static void Main(string[] args) { ServiceHost stream = new ServiceHost(typeof(WCFService.StreamService)); if (stream.State != CommunicationState.Opening) stream.Open(); Console.WriteLine("Stream service is runing "); Console.Read(); stream.Close(); } }
服务发布的配置文件生成可以采用VS提供的WCF服务配置编译器
1)配置服务行为:定义服务的分发方式,客户通过什么方式发现检索服务,添加serviceMetadata和serviceDebug
2)新建服务配置
配置EndPoint
配置终结点的类型绑定配置(文件传输模式、最大传输数据值等)
保存后自动生成的host.config配置如下:
<?xml version="1.0" encoding="utf-8"?><configuration> <system.serviceModel> <bindings> <netTcpBinding> <binding name="netTcpStreamBinding" receiveTimeout="10:10:00" transferMode="Streamed" maxBufferSize="300000000" maxReceivedMessageSize="300000000"> <readerQuotas maxStringContentLength="65000" maxArrayLength="300000000" /> </binding> </netTcpBinding> </bindings> <services> <service behaviorConfiguration="WCFService.NetTcpServiceBehavior" name="WCFService.StreamService"> <endpoint address="StreamService" binding="netTcpBinding" bindingConfiguration="netTcpStreamBinding" name="StreamService" contract="WCFService.IStreamService" /> <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" name="MexService" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="net.tcp://localhost:9000" /> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior name="WCFService.WCFServiceBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> <behavior name="WCFService.NetTcpServiceBehavior"> <serviceMetadata /> <serviceDebug /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel></configuration>
3 客户端代码
1) 添加服务引用
2)修改客户端配置项client.config:
服务应用成功后,客户端的app.config自动生成绑定配置,我们需要修改maxRecevidMessageSize和maxArrayLength两个配置项来支持传送大于64K的文件
3) 编写客户端代码Client:
采用控制台方式实现
class Program { static void Main(string[] args) { StreamService.IStreamService stream = new StreamService.StreamServiceClient(); MemoryStream memory = stream.DownloadFileByOutStream("service.zip"); //MemoryStream memory = stream.DownloadFile("service.zip"); Console.WriteLine("File length is :" + memory.Length); byte[] buffer = new byte[memory.Length]; for (long i = 0; i < memory.Length; i++) { buffer[i] = Convert.ToByte(memory.ReadByte()); } //memory.Read(buffer,0,(int)memory.Length); File.WriteAllBytes("local.zip", buffer); memory.Close(); buffer = File.ReadAllBytes("client.zip"); MemoryStream memoryStream = new MemoryStream(buffer); stream.UploadFile(memoryStream); memoryStream.Close(); Console.Read(); } }
三. 总结
WCF实现文件的上传与下载关键在于宿主端的服务发布配置和客户端的服务引用配置。配置的关键项在于TransferMode、MaxReceivedMessageSize、MaxArrayLength,其它和普通的WCF应用差不多。
- WCF实现文件的上传与下载
- WCF实现的文件上传和下载
- servlet 实现 文件的上传与下载
- jspsmart实现文件的上传与下载
- JSP实现文件的上传与下载
- sliverlight实现文件的上传与下载
- struts2 实现文件的上传与下载
- JSP实现的文件上传与下载
- struts2实现文件的上传与下载
- Servlet 实现文件的上传与下载
- Struts2实现文件的上传与下载
- 实现FTP的文件上传与下载
- 文件上传与下载的功能实现
- Xshell实现文件的上传与下载
- 文件上传与下载的实现
- SpringMVC实现文件的上传与下载
- Smartupload 实现文件的上传与下载
- SpringMVC文件上传与下载的实现
- Android APK 多渠道快速编译
- maven 仓库地址
- [Web Chart系列之四] 图形布局-Layout 之js设计实现
- UML——实现图
- PHP开发学习-Apache+PHP+MySQL环境搭建
- WCF实现文件的上传与下载
- 解决WEB集群session同步的方案,Redis内存缓存
- poj - 3468 - A Simple Problem with Integers(线段树(区间更新))
- arm-linux下usb驱动的结构和相关函数
- curator-client源码阅读笔记
- 创建自定义view
- 如何让ECSHOP后台添加完商品后默认不上架 ecshop实现供应商上传产品需要审核
- [算法] 输出 字符串的全部子组合 [dfs - 递归神技]
- 去除win8未激活水印