分享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#的图形界面。求高手赐教。
    2015-06-06
  • c#的datatable转list示例

    c#的datatable转list示例

    这篇文章主要介绍了c#的datatable转list示例,代码中有注释,需要的朋友可以参考下
    2014-04-04
  • c# Linq查询详解

    c# Linq查询详解

    这篇文章主要介绍了c# Linq查询的相关资料,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-04-04
  • C#调用FFplay实现播放视频功能

    C#调用FFplay实现播放视频功能

    这篇文章主要为大家详细介绍了C#如何调用FFplay实现播放视频功能,文中的示例代码讲解详细,具有一定的参考价值,有需要的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • 验证本机的excel版本的C#代码

    验证本机的excel版本的C#代码

    安装的excel的版本,0为没有安装,大于1说明安装了多个. 需要的朋友可以参考下。
    2011-08-08
  • c# wpf使用GMap.NET类库,实现地图轨迹回放

    c# wpf使用GMap.NET类库,实现地图轨迹回放

    这篇文章主要介绍了c# wpf使用GMap.NET类库,实现地图轨迹回放的方法,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • 基于C# wpf实现桌面放大镜

    基于C# wpf实现桌面放大镜

    做桌面截屏功能时需要放大镜,显示鼠标所在位置的放大图像,所以本文为大家介绍了如何基于C# wpf实现桌面放大镜功能,有需要的小伙伴可以参考下
    2023-09-09
  • 解读赫夫曼树编码的问题

    解读赫夫曼树编码的问题

    本篇文章对赫夫曼树编码的问题进行了分析说明,需要的朋友参考下
    2013-05-05
  • C# GetMethod方法的应用实例讲解

    C# GetMethod方法的应用实例讲解

    GetMethod 是获取当前 Type 的特定方法,具有多个重载, GetMethod 即使用指定的绑定约束搜索指定方法,本文给大家介绍了C# GetMethod方法的应用实例,需要的朋友可以参考下
    2024-04-04
  • C#实体类转换的两种方式小结

    C#实体类转换的两种方式小结

    这篇文章主要介绍了C#实体类转换的两种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01

最新评论