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

 更新时间:2015年11月08日 15:03:09   投稿:mdxy-dxy  
这篇文章主要介绍了分享WCF文件传输实现方法---WCFFileTransfer,需要的朋友可以参考下

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

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

文件传输成功:

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

代码分析:
这里就不一一的阐述每一句代码的作用了,感兴趣的朋友可以下载,文后会有下载链接。说下值得注意的地方:
前两天有人在百度知道中问能不能把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<ITransfer>.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

相关文章

  • C#之继承实现

    C#之继承实现

    本文详细讲解了C#之继承的实现,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • c#文件下载示例的4种方法分享

    c#文件下载示例的4种方法分享

    这篇文章主要介绍了c#文件下载示例的4种方法,有TransmitFile实现下载,WriteFile实现下载,WriteFile分块下载,流方式下载,需要的朋友可以参考下
    2014-03-03
  • C#插入法排序算法实例分析

    C#插入法排序算法实例分析

    这篇文章主要介绍了C#插入法排序算法,实例分析了C#排序算法的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C#中的Linq To XML讲解

    C#中的Linq To XML讲解

    本文详细讲解了C#中的Linq To XML,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • WPF中NameScope的查找规则详解

    WPF中NameScope的查找规则详解

    这篇文章主要给大家介绍了关于WPF中NameScope的查找规则的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • 详解Unity日志打印工具功能

    详解Unity日志打印工具功能

    Unity是一个非常火的游戏引擎,我们再开发的时候有的时候要进行程序的调试,下面给大家介绍下Unity日志打印工具功能,感兴趣的朋友一起看看吧
    2022-01-01
  • C#使用System.Net邮件发送功能踩过的坑

    C#使用System.Net邮件发送功能踩过的坑

    这篇文章主要介绍了C#使用System.Net邮件发送功能踩过的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C#实现快速查询文件的方法

    C#实现快速查询文件的方法

    这篇文章介绍了C#实现快速查询文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 关于C#基础知识回顾--反射(三)

    关于C#基础知识回顾--反射(三)

    在前面例子中,由于MyClass类型的对象是显示创建的,因此使用反射技术来调用MyClass上的方法没有任何优势--以普通的方式调用对象上的方法会简单的多
    2013-07-07
  • C#条件语句、循环语句(if、while)

    C#条件语句、循环语句(if、while)

    这篇文章主要介绍了C#条件语句、循环语句(if、while)的用法,学习c#的朋友可以参考下
    2014-03-03

最新评论