WCF实现上传图片功能
功能介绍:
主要是使用WCF框架实现从客户端上传图片到服务端并在服务端显示的基本功能。
一、首先创建两Windows窗体应用程序“WinFormClient”(客户端、发送端)和“WinFormReceiver”(接收端)
1、如图设计FormClient(发送端窗体)的界面,上边是一个panel容器中添加了一个TextBox和 两个Button,下边是一个PictureBox控件(用于浏览上传之前的图片)。
然后添加浏览按钮下的后台代码,实现客户端浏览的功能。
string fileName = "" ; // 定义一个全局变量; // 浏览选择上传内容 private void btnBrowser_Click( object sender, EventArgs e) { // string fileName = ""; // 定义一个字段用于获取上传的文件名; OpenFileDialog openFileDialog = new OpenFileDialog(); // 创建一个OpenFileDialog对象专门用于打开文件 if (openFileDialog.ShowDialog() == DialogResult.OK) // 打开的文件对话框如果选择了OK按钮(确定),则为真,执行大括号中的内容 { fileName = openFileDialog.FileName; txtPicName.Text = fileName; // 在textBox中显示文件名 pictureBox1.Load(fileName); // 使该图片在客户端pictuBox中显示 } else return ; // 未选中文件则返回; }
将WinFomClient设为启动项目,运行
当你选择图片后,该图片会显示在发送端的窗体中,供发送者浏览,如需更改上传图片可重新选取,该图片将会被覆盖掉。(上传功能将在下文实现)
2、FormReceiver接收端的窗体只需添加一个PictureBox控件,用于显示客户端上传的图片。
二、在解决方案中添加两个类库:ITransferPic(接口)、TransferPic(继承接口),一个控制台应用程序 TransferPicHost(宿主程序);
该实例采用的是“自身托管宿主”并非“IIS宿主”。
1、ITransferPic
(1)、添加引用:using System.ServiceModel; using System.IO;
(2)、创建一个“ITransferPicService”接口
[ServiceContract] public interface ITransferPicService { [OperationContract] // 操作契约 Stream GetPic(); [OperationContract] void SendPic(Stream transferPic); }
2、TransferPic
(1)、添加引用:using ITransferPic; using System.IO;
(2)、创建一个“TransferPicService” 类,继承接口“ITransferPicService”并实现该接口;
public class TransferPicService : ITransferPicService { public static Stream PicSource = new MemoryStream(); /// <summary> /// 从服务端下载图片到本地 (上传和下载都是拷贝的过程) /// </summary> /// <returns></returns> public Stream GetPic() { MemoryStream ms = new MemoryStream(); PicSource.Position = 0 ; // 指明从第0位开始拷贝 PicSource.CopyTo(ms); // 服务端将客户端的Stream复制一份 ms.Position = 0 ; // 注意如果缺少该条代码接收端将无法显示上传图片 return ms; // 然后在返回客户端; } /// <summary> /// 从客户端上传图片到服务端(将客户端的Stream拷贝给服务端的Stream) /// </summary> /// <param name="transferPic"></param> public void SendPic(Stream transferPic) { PicSource.Position = 0 ; transferPic.CopyTo(PicSource); } }
3、TransferPicHose
自身托管宿主: 利用WCF提供的ServiceHost<T>提供的Open()和Close()方法,可以便于开发者在控制台应用程序,Windows应用程序乃至于ASP.NET应用程序中托管服务。不管自宿主的环境是何种应用程序,实质上托管服务的方式都是一致的。如该实例中用到的代码部分:
添加引用:
using System.ServiceModel;
using ITransferPic;
using System.ServiceModel.Description;
class Program { static void Main( string [] args) { NetTcpBinding bind = new NetTcpBinding(); bind.MaxBufferSize = 214783647 ; bind.TransferMode = TransferMode.Streamed; bind.MaxReceivedMessageSize = 214783647 ; bind.Security.Mode = SecurityMode.None; // 超出using 范围程序会自动释放 using (ServiceHost host = new ServiceHost( typeof (TransferPic.TransferPicService))) { host.AddServiceEndpoint( typeof (ITransferPicService), bind, " net.tcp://localhost:9600/transferPic " ); // 该地址为宿主地址,和客户端接收端地址保持一致 if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null ) { ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); behavior.HttpGetEnabled = true ; behavior.HttpGetUrl = new Uri( " http://localhost:9603/transferPic/metadata/ " ); host.Description.Behaviors.Add(behavior); } host.Opened += delegate { Console.WriteLine( " 图片程序已成功启动! " ); }; host.Open(); Console.ReadLine(); } } }
三、实现上传。
1、WinFormClient 后台上传按钮部分;
添加引用:
using System.IO;
using System.ServiceModel;
using ITransferPic;
// 执行上传功能 private void btnUpload_Click( object sender, EventArgs e) { // pictureBox1.Load(fileName); // 读取流,上传文件流到服务器 FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); // 创建一个文件,并把文件放在文件流里边; Stream sm = new MemoryStream(); // 创建一个滤层流 将文件从第0位拷贝到sm中 fs.Position = 0 ; // 获取或设置此流的当前位置 fs.CopyTo(sm); // 拷贝完成之后进行上传 EndpointAddress epAddr = new EndpointAddress( " net.tcp://localhost:9600/transferPic " ); // 此处也可以用IIS做服务 NetTcpBinding bind = new NetTcpBinding(); // 绑定方式 bind.MaxBufferPoolSize = 2147483647 ; // 最大缓冲 bind.TransferMode = TransferMode.Streamed; // 传输模式为流式处理 bind.MaxReceivedMessageSize = 2147483647 ; // 定义了服务端接收Message的最大长度,防止文件过大 bind.Security.Mode = SecurityMode.None; // 安全模式设置为不进行验证; // 创建一个工厂 ITransferPicService proxy = ChannelFactory<ITransferPicService> .CreateChannel(bind, epAddr); sm.Position = 0 ; proxy.SendPic(sm); // WCF客户端调用该方法 把客户端sm上传到服务端去; }
2、WinFormReceiver 后台。
添加引用:
using ITransferPic;
using System.IO;
using System.ServiceModel;
private void FormReceiver_Load( object sender, EventArgs e) { Thread myThread = new Thread(ShowPic); // 创建一个线程 myThread.IsBackground = true ; // 设置后台线程(防止主程序关闭后,仍在运行) myThread.Start(); // 启动线程 } public void ShowPic() { #region 同客户端一样,创建WCF客户端 EndpointAddress epAddr = new EndpointAddress( " net.tcp://localhost:9600/transferPic " ); NetTcpBinding bind = new NetTcpBinding(); bind.MaxBufferPoolSize = 2147483647 ; bind.TransferMode = TransferMode.Streamed; bind.MaxReceivedMessageSize = 2147483647 ; bind.Security.Mode = SecurityMode.None; // 创建一个通道 ITransferPicService proxy = ChannelFactory<ITransferPicService> .CreateChannel(bind, epAddr); #endregion while ( true ) { Stream streamFromServer = proxy.GetPic(); // 返回一个文件流; MemoryStream ms = new MemoryStream(); // 滤层流拷贝一份; ms.Position = 0 ; streamFromServer.CopyTo(ms); // 将该文件流拷贝给到ms; if (ms.Length == 0 ) { System.Threading.Thread.Sleep( 300 ); // 300百毫秒执行一次; continue ; } Bitmap tn = new Bitmap(ms); // 创建一个位图;把ms变成图片; pictureBox1.Image = tn; System.Threading.Thread.Sleep( 300 ); // 300百毫秒执行一次;Sleep表示当前线程挂起指定的时间; } }
四、运行程序。
1、打开TransferPicHost 文件中bin目录,启动“TransferPicHost.exe”,此时会弹出一个控制台应用程序的窗体,并提示“图片功能已成功启动!”。
2、分别启动发送端和接收端项目程序;
(将“WinFormClient” 或者 “WinFormReceiver” 设为启动项目,并启动另一个项目文件夹bin目录下的“WinFormReceiver.exe”或者“WinFormClient.exe”)
点击发送端“浏览按钮” 进行选择图片,之后点击“上传按钮”。这时,你会发现客户端上传的图片显示在了接收端的窗体上。程序运行成功。
分类: .Net开发之WCF实例应用
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息