栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

分享WCF文件传输实现方法---WCFFileTransfer

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

分享WCF文件传输实现方法---WCFFileTransfer

前几天分享了分享了WCF聊天程序--WCFChat ,本文和大家一起分享利用WCF实现文件的传输。
程序运行效果:
接收文件端:

发送文件端:连接WCF服务,选择要传输的文件

文件传输成功:

我们会在保存文件的默认路径:C:documents and SettingsAdministrator桌面,下看到传输的文件:

代码分析:
这里就不一一的阐述每一句代码的作用了,感兴趣的朋友可以下载,文后会有下载链接。说下值得注意的地方:
前两天有人在百度知道中问能不能把WCF中的契约单独封装到一个类库中,当时感觉多此一举,无意中看到把接口单独分出去,有个很好的应用,就是利用通道实现客户端代理。
ITransfer.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;
using System.Threading;
using System.IO;

namespace FileInterface
{
  [ServiceContract]
  public interface ITransfer
  {
    [OperationContract(Action = "UploadFile")]
    void TransferFile(FileTransferMessage request);//文件传输
  }


  [MessageContract]
  public class FileTransferMessage
  {
    [MessageHeader(MustUnderstand = true)]
    public string SavePath;//文件保存路径

    [MessageHeader(MustUnderstand = true)]
    public string FileName;//文件名称

    [MessageBodyMember(Order = 1)]
    public Stream FileData;//文件传输时间
  }
}

利用通道创建客户端代理:

if (_proxy == null)
      {
 try
 {
   NetTcpBinding binding = new NetTcpBinding();
   binding.TransferMode = TransferMode.Streamed;
   binding.SendTimeout = new TimeSpan(0, 30, 0);
   //利用通道创建客户端代理
   _proxy = ChannelFactory.CreateChannel(binding, new EndpointAddress(CBSerURL.Text));
   IContextChannel obj = _proxy as IContextChannel;
   //string s = obj.SessionId;

 }
 catch (Exception ex)
 {
   MessageBox.Show(ex.Message);
   return;
 }

这样,既不用添加服务引用,也不需要生成代理。
文件传输的函数不是很难,代码如下:

public void TransferFile(FileTransferMessage request)
    {
      string logInfo;

      Program.Get_ILog().Log(logInfo = string.Format("开始接收文件,name={0}", request.FileName));//填写日志
      //文件信息
      string uploadFolder = AppValue.GetParam()._saveDir;
      string savaPath = request.SavePath;
      string fileName = request.FileName;
      Stream sourceStream = request.FileData;
      FileStream targetStream = null;
      //判断文件是否可读
      if (!sourceStream.CanRead)
      {
 throw new Exception("数据流不可读!");
      }
      if (savaPath == null) savaPath = @"文件传输";
      if (!savaPath.EndsWith("\")) savaPath += "\";
      if (!uploadFolder.EndsWith("\")) uploadFolder += "\";

      uploadFolder = uploadFolder + savaPath;
      //创建保存文件夹
      if (!Directory.Exists(uploadFolder))
      {
 Directory.CreateDirectory(uploadFolder);
      }

      int fileSize = 0;
      string filePath = Path.Combine(uploadFolder, fileName);//Combine合并两个路径
      try
      {
 //文件流传输
 using (targetStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
 {
   //定义文件缓冲区
   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);
     fileSize += count;
   }
   targetStream.Close();
   sourceStream.Close();
 }
      }
      catch (Exception ex)
      {
 Program.Get_ILog().Log(logInfo + ex.Message);
      }

      Program.Get_ILog().Log(string.Format("接收文件完毕 name={0},filesize={1}",
request.FileName, fileSize));
    }

其他的代码感兴趣的朋友下载来研究吧!


源代码:WCFFileTransfer.rar

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/124620.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号