WCF客户端从服务器下载数据

1.打开VS选择控制台项目新建一个解决方案Server,然后添加两个类库Contract和Service.

2.在Contract中添加一个接口IFileDownload

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace Contract
{
    [ServiceContract]
    public interface IFileDownload
    {
        [OperationContract]
        Dictionary<string, byte[]> DownloadFile(string[] fileNames);
    }
}

3.在Service中实现接口IFileDownload

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Contract;
using System.IO;

namespace Service
{
    public class FileDownload : IFileDownload
    {
        public Dictionary<string, byte[]> DownloadFile(string[] fileNames)
        {
            Dictionary<string, byte[]> filedata = new Dictionary<string, byte[]>();
            string queryDirectory = AppDomain.CurrentDomain.BaseDirectory + "数据"; //假设服务器数据存放在运行目录下的“数据”文件夹中
            DirectoryInfo drtInfo = new DirectoryInfo(queryDirectory);
            FileInfo[] fileInfo = drtInfo.GetFiles();
            foreach (FileInfo item in fileInfo)
            {
                foreach (string filename in fileNames)
                {
                    if (filename == item.Name)
                    {
                        FileStream fsRead = new FileStream(queryDirectory+"\\"+filename,FileMode.Open,FileAccess.Read);
                        byte[] bytDt = new byte[fsRead.Length];
                        fsRead.Read(bytDt,0,bytDt.Length);
                        fsRead.Close();
                        filedata.Add(filename,bytDt);
                        break;
                    }
                }
            }

            return filedata;
        }
    }
}

3.在Server中添加如下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using Service;

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost download_host = new ServiceHost(typeof(FileDownload));
            download_host.Open();
            Console.WriteLine("文件下载服务已启动");
            Console.Read();
        }
    }
}

4.在Server中添加一个应用程序配置文件App.xml,并选择菜单栏->工具->WCF服务配置编辑器对配置文件进行编辑,具体操作可参考http://www.cnblogs.com/judastree/archive/2012/08/26/2657555.html

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="DownloadFileBindingConfig" closeTimeout="20:56:00" openTimeout="20:30:00" sendTimeout="20:56:00" maxBufferSize="2073741824" maxReceivedMessageSize="2073741824" transferMode="Buffered" maxBufferPoolSize="2073741824" >
          <security mode="None">
            <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
            <message clientCredentialType="Windows"/>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="DownloadBehavior">
          <serviceMetadata httpGetEnabled="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="Service.FileDownload" behaviorConfiguration="DownloadBehavior">
        <endpoint address="net.tcp://localhost:2310/Download" binding="netTcpBinding"
            bindingConfiguration="DownloadFileBindingConfig" contract="Contract.IFileDownload" />
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:2310" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>
</configuration>

5.启动Server

6.新建一个窗体应用程序的解决方案Client,添加服务引用

7.修改Client的配置文件app.xml为

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_IFileDownload" maxBufferSize="2073741824" maxReceivedMessageSize="2073741824">
                    <security mode="None" />
                </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://localhost:2310/Download" binding="netTcpBinding"
                bindingConfiguration="NetTcpBinding_IFileDownload" contract="ServiceReference1.IFileDownload"
                name="NetTcpBinding_IFileDownload" />
        </client>
    </system.serviceModel>
</configuration>

8.添加一个TextBox和一个Button,在Button下添加代码

 private void button1_Click(object sender, EventArgs e)
        {
            ServiceReference1.FileDownloadClient fileDownload = new ServiceReference1.FileDownloadClient();
            List<string> filenames = new List<string>();
            filenames.Add(textBox1.Text); //为了简单,这里只查找一个文件
            Dictionary<string,byte[]>  downloadfiles = fileDownload.DownloadFile(filenames.ToArray());
            foreach (var item in downloadfiles)
            {
                if (item.Value!=null)
                {
                    FileStream fsWrite = new FileStream(@"C:\Users\yujian\Desktop\DownloadFiles\"+item.Key,FileMode.Create);//这里下载wav文件,可根据实际情况调整
                    fsWrite.Write(item.Value,0,item.Value.Length);
                    fsWrite.Close();
                }
            }
            MessageBox.Show("下载成功");
        }

9.运行结果

 源码

posted @ 2016-10-26 13:07  梦醒江南·Infinite  阅读(558)  评论(0编辑  收藏  举报