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

    源代码下载

  • 相关阅读:
    C#封装(访问修饰符)和方法
    源文件声明规则和import、package
    throw和throws 的区别
    曲率计算
    react组件三大核心属性之一refs;react中的事件处理
    react脚手架,样式模块化
    es6 class类中可以直接写赋值语句
    es6 class类内部的方法自动开启了严格模式
    react脚手架
    react三大核心之一props
  • 原文地址:https://www.cnblogs.com/hackpig/p/1668495.html
Copyright © 2020-2023  润新知