zoukankan      html  css  js  c++  java
  • WCF文件传输

    本文和大家一起分享利用WCF实现文件的传输。
    程序运行效果
    接收文件端:
     

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

    文件传输成功:

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

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

    Code
    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;//文件传输时间
        }
    }

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

    Code
    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;
                    }
    这样,既不用添加服务引用,也不需要生成代理。
    文件传输的函数不是很难,代码如下:

    Code
    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));
            }
    其他的代码感兴趣的朋友下载来研究吧!

    源代码下载

  • 相关阅读:
    com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: INSTALL_FAILED_UPDATE_INCOMPATIBLE:
    vue 使用video.js循环
    微信小程序使用iconfont
    小程序使用可滑动的tab
    vue cli2引入iconfont
    Couldn't find preset "es2015" relative to directory
    Electron桌面应用框架的使用,结合react项目
    如何用Linux重现《黑客帝国》中的经典界面?
    iOS----------证书的制作
    iOS----------charles如何设置本地映射、和取消本地映射
  • 原文地址:https://www.cnblogs.com/hackpig/p/1668495.html
Copyright © 2011-2022 走看看