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应用差不多。


 

   

原创粉丝点击