WCF实现上传图片功能

WCF实现上传图片功能,第1张

功能介绍  缓塌       主要是使用WCF框架实现从客户端上传图片到服务端并在服务端显示的基本功能         一 首先创建两Windows窗体应用程序 WinFormClient (客户端 发送端)和 WinFormReceiver (接收端)        如图设计FormClient(发送端窗体)的界面 上边是一个panel容咐哪侍器中添加了一个TextBox和 两个Button 下边是一个PictureBox控件(用于浏览上传之前的图片)

然后添加浏览按钮下的后台代码 实现客户端浏览的功能         View Code        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中显示文件名        pictureBox Load(fileName) //使该图片在客户端pictuBox中显示        }        else        return//未选中文件则返回         }        将WinFomClient设为启动项目 运行        当你选择图片后 该图片会显示在发送端的窗体中 供发送者浏览 如需更改上传图片可重新选取 该图片将会被覆盖掉 (上传功能将在下文实衡吵现)        FormReceiver接收端的窗体只需添加一个PictureBox控件 用于显示客户端上传的图片    

    二 在解决方案中添加两个类库 ITransferPic(接口) TransferPic(继承接口) 一个控制台应用程序 TransferPicHost(宿主程序)         该实例采用的是 自身托管宿主 并非 IIS宿主         ITransferPic        ( ) 添加引用 using System ServiceModel   using System IO        ( ) 创建一个 ITransferPicService 接口        View Code        [ServiceContract]        public interface ITransferPicService        {        [OperationContract]// *** 作契约        Stream GetPic()         [OperationContract]        void SendPic(Stream transferPic)         }        TransferPic        ( ) 添加引用 using ITransferPic  using System IO        ( ) 创建一个 TransferPicService 类 继承接口 ITransferPicService 并实现该接口         View Code        public class TransferPicService : ITransferPicService        {        public static Stream PicSource = new MemoryStream()         /// <summary>        /// 从服务端下载图片到本地 (上传和下载都是拷贝的过程)        /// </summary>        /// <returns></returns>        public Stream GetPic()        {        MemoryStream ms = new MemoryStream()         PicSource Position = //指明从第 位开始拷贝        PicSource CopyTo(ms) //服务端将客户端的Stream复制一份        ms Position = //注意如果缺少该条代码接收端将无法显示上传图片        return ms//然后在返回客户端         }        /// <summary>        /// 从客户端上传图片到服务端(将客户端的Stream拷贝给服务端的Stream)        /// </summary>        /// <param name= transferPic ></param>        public void SendPic(Stream transferPic)        {        PicSource Position =         transferPic CopyTo(PicSource)         }        }        TransferPicHose        自身托管宿主 利用WCF提供的ServiceHost<T>提供的Open()和Close()方法 可以便于开发者在控制台应用程序 Windows应用程序乃至于ASP NET应用程序中托管服务 不管自宿主的环境是何种应用程序 实质上托管服务的方式都是一致的 如该实例中用到的代码部分         添加引用         using System ServiceModel        using ITransferPic        using System ServiceModel Description        View Code        class Program        {        static void Main(string[] args)        {        NetTcpBinding bind = new NetTcpBinding()         bind MaxBufferSize =         bind TransferMode = TransferMode Streamed        bind MaxReceivedMessageSize =         bind Security Mode = SecurityMode None        //超出using 范围程序会自动释放        using (ServiceHost host = new ServiceHost(typeof(TransferPic TransferPicService)))        {        host AddServiceEndpoint(typeof(ITransferPicService) bind net tcp://localhost: /transferPic ) //该地址为宿主地址 和客户端接收端地址保持一致

        if (host Description Behaviors Find<ServiceMetadataBehavior>() == null)        {        ServiceMetadataBehavior behavior = new ServiceMetadataBehavior()         behavior HttpGetEnabled = true        behavior HttpGetUrl = new Uri(//localhost: /transferPic/metadata/ )         host Description Behaviors Add(behavior)         }        host Opened += delegate { Console WriteLine( 图片程序已成功启动! ) }        host Open()         Console ReadLine()         }        }        }        三 实现上传         WinFormClient 后台上传按钮部分         添加引用         using System IO        using System ServiceModel        using ITransferPic        View Code        //执行上传功能        private void btnUpload_Click(object sender EventArgs e)        {        //pictureBox Load(fileName)         //读取流 上传文件流到服务器        FileStream fs = new FileStream(fileName FileMode Open FileAccess Read) //创建一个文件 并把文件放在文件流里边         Stream *** = new MemoryStream() //创建一个滤层流 将文件从第 位拷贝到 *** 中        fs Position = //获取或设置此流的当前位置        fs CopyTo( *** )         //拷贝完成之后进行上传        EndpointAddress epAddr = new EndpointAddress( net tcp://localhost: /transferPic ) //此处也可以用IIS做服务        NetTcpBinding bind = new NetTcpBinding() //绑定方式        bind MaxBufferPoolSize = //最大缓冲        bind TransferMode = TransferMode Streamed//传输模式为流式处理        bind MaxReceivedMessageSize = //定义了服务端接收Message的最大长度 防止文件过大        bind Security Mode = SecurityMode None//安全模式设置为不进行验证         //创建一个工厂        ITransferPicService proxy = ChannelFactory<ITransferPicService>CreateChannel(bind epAddr)         *** Position =         proxy SendPic( *** ) //WCF客户端调用该方法 把客户端 *** 上传到服务端去         }        WinFormReceiver 后台         添加引用         using ITransferPic        using System IO        using System ServiceModel        View Code        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: /transferPic )         NetTcpBinding bind = new NetTcpBinding()         bind MaxBufferPoolSize =         bind TransferMode = TransferMode Streamed        bind MaxReceivedMessageSize =         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 =         streamFromServer CopyTo(ms) //将该文件流拷贝给到ms        if (ms Length == )        {        System Threading Thread Sleep( ) // 百毫秒执行一次         continue        }        Bitmap tn = new Bitmap(ms) //创建一个位图 把ms变成图片         pictureBox Image = tn        System Threading Thread Sleep( ) // 百毫秒执行一次 Sleep表示当前线程挂起指定的时间         }        }        四 运行程序         打开TransferPicHost 文件中bin目录 启动 TransferPicHost exe 此时会d出一个控制台应用程序的窗体 并提示 图片功能已成功启动!         分别启动发送端和接收端项目程序         (将 WinFormClient 或者 WinFormReceiver 设为启动项目 并启动另一个项目文件夹bin目录下的 WinFormReceiver exe 或者 WinFormClient exe )        点击发送端 浏览按钮 进行选择图片 之后点击 上传按钮 这时 你会发现客户端上传的图片显示在了接收端的窗体上 程序运行成功 lishixinzhi/Article/program/net/201311/12342

第一步,我们在刚刚创建完的解决方案里,再添加一个WebApplication的项目取名叫做“WebServicePerson”

第二步,给WebServicePerson这个项目添加一个.SVC的文件,取名叫做“PersonService”

接下来呢,将创建项目时自带的文件夹和.aspx文件都删除掉(如下图)然后打开 PersonService.svc 文件,我们需谈耐要将文件修改如下。

<%@ ServiceHost Language="C#" Debug="true" Service="WCFService_Library2010.PersonService" %>

Service="含仿春WCFService_Library2010.PersonService"是需要自己定义的,服务指向那个WCF的服务库

第三步,非常重要绝对不能忽略,就是要将WCF服务引用到当前的项目中来。

第四步,经过上面三步的 *** 作项目基本已成成型了,接下来只需要最后一步了,那就是配置Web.Config. 自己手写去配置Web.config是非常痛苦的,所幸微软给我我们提供了非常便捷的配置功能“Edit WCF Configuration”

进入配置界面后,我们发现Services下面并没有任何节点,需要我们自己去新建一个,可以点击“Create a New Service...”去创建

去选择,我们刚刚创建的 WCF Service Library的服务。

一路next往下。

创建完之后,我们会得到这样的一个界面。

这一步很重要的,因为之前我们已经添加了一个.svc的文件PersonService并且已经配置好了Service的内容,所以系统自动已经在Service Behaviors下面创建了一个PersonService的节点。

此时我们只需要填写一个name就可以了

回到Services 选中刚刚创建的name名称。

最后,最关键的一步就是要记得“保存”。

最后去运行PersonService.svc,右击 → 在浏览器中查看,一切大功告成了。此时你就可以将这个WebAppliction部署到IIS中去了,供Web项目所使用。

附上代码:

<p>

<asp:TextBox ID="TextAge" runat="server"></asp:TextBox>

<asp:TextBox ID="TextName" runat="server"><大逗/asp:TextBox>

<asp:Button ID="Button1" runat="server" Text="新增" onclick="Button1_Click" />

</p>

<p>

<asp:Label ID="LabInfo" runat="server" Text=""></asp:Label>

<asp:Button ID="Button2" runat="server" Text="获取" onclick="Button2_Click"

/>

</p>

using System

using System.Collections.Generic

using System.Linq

using System.Web

using System.Web.UI

using System.Web.UI.WebControls

using WebPerson.PersonService//这里是引用webservice

namespace WebPerson

{

public partial class _Default : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

}

protected void Button1_Click(object sender, EventArgs e)

{

PersonServiceClient client = new PersonServiceClient()

client.AddPerson(new Person() { Age=Convert.ToInt32(TextAge.Text), Name=TextName.Text })

client.Close()

}

protected void Button2_Click(object sender, EventArgs e)

{

LabInfo.Text = ""

PersonServiceClient client = new PersonServiceClient()

Person [] personList = client.GetAllPersons()

foreach (Person model in personList)

{

LabInfo.Text += model.Age + "," + model.Id + "," + model.Name + "<br />"

}

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12123491.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存