码迷,mamicode.com
首页 > 其他好文 > 详细

分享WCF文件传输---WCFFileTransfer

时间:2016-04-02 14:44:30      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

前几天分享了分享了WCF聊天程序--WCFChat 本文和大家一起分享利用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));
????????}

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


源代码:

/Files/gaoweipeng/WCFFileTransfer.rar

分享WCF文件传输---WCFFileTransfer

标签:

原文地址:http://www.cnblogs.com/qq260250932/p/5347532.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!