日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分享WCF文件传输---WCFFileTransfer

發(fā)布時間:2025/3/8 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分享WCF文件传输---WCFFileTransfer 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前幾天分享了分享了WCF聊天程序--WCFChat ,本文和大家一起分享利用WCF實現(xiàn)文件的傳輸。
程序運行效果
接收文件端:

發(fā)送文件端:連接WCF服務,選擇要傳輸?shù)奈募?br />
文件傳輸成功:

我們會在保存文件的默認路徑:C:\Documents and Settings\Administrator\桌面,下看到傳輸?shù)奈募?


代碼分析
這里就不一一的闡述每一句代碼的作用了,感興趣的朋友可以下載,文后會有下載鏈接。說下值得注意的地方:
前兩天有人在百度知道中問能不能把WCF中的契約單獨封裝到一個類庫中,當時感覺多此一舉,無意中看到把接口單獨分出去,有個很好的應用,就是利用通道實現(xiàn)客戶端代理。
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;//文件傳輸時間
????}
}
利用通道創(chuàng)建客戶端代理:
Code
if?(_proxy?==?null)
????????????{
????????????????
try
????????????????{
????????????????????NetTcpBinding?binding?
=?new?NetTcpBinding();
????????????????????binding.TransferMode?
=?TransferMode.Streamed;
????????????????????binding.SendTimeout?
=?new?TimeSpan(0,?30,?0);
????????????????????
//利用通道創(chuàng)建客戶端代理
????????????????????_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;
????????????????}
這樣,既不用添加服務引用,也不需要生成代理。
文件傳輸?shù)暮瘮?shù)不是很難,代碼如下:
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("數(shù)據(jù)流不可讀!");
????????????}
????????????
if?(savaPath?==?null)?savaPath?=?@"文件傳輸\";
????????????
if?(!savaPath.EndsWith("\\"))?savaPath?+=?"\\";
????????????
if?(!uploadFolder.EndsWith("\\"))?uploadFolder?+=?"\\";

????????????uploadFolder?
=?uploadFolder?+?savaPath;
????????????
//創(chuàng)建保存文件夾
????????????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))
????????????????{
????????????????????
//定義文件緩沖區(qū)
????????????????????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


轉載于:https://www.cnblogs.com/gaoweipeng/archive/2009/09/13/1565409.html

總結

以上是生活随笔為你收集整理的分享WCF文件传输---WCFFileTransfer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。