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.运行结果