转载出处:http://blog.csdn.net/fangxing80/article/details/6101790

从VS2005推出WCF以来,WCF逐步取代了Remoting, WebService成为.NET上分布式程序的主要技术。WCF统一的模型整合了以往的 WebService、Remoting、MSMQ 等技术,让分布式开发变得更加简单,方便,快捷。 wcf_host_architecture (上图选自《Programming WCF Services》) WCF基本概念(ABC): 1.地址(Address):决定服务的地址;2.绑定(Binding):决定服务的细节;3.契约(Contract):服务的定义(抽象),决定消息结构的定义。 WCF的发布:WCF服务的发布可以有几种形式: IIS, Windows Service, Self-Host(可以是Console程序也可以是Winform程序)。 WCF的工具: Windows Communication Foundation 工具 简单实例-1: 内置AppDomain (无配置) 1. Service1.cs [c-sharp] view plaincopy namespace WCFStudy1 { [ServiceContract] public interface IService1 { [OperationContract] string SendMessage(string clientInput); } public class Service1 : IService1 { #region IService1 Members public string SendMessage(string clientInput) { return string.Format("Server Get Message: {0}", clientInput); } #endregion } } 2. Program.cs [c-sharp] view plaincopy using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; namespace WCFStudy1 { class Program { static void Main(string[] args) { // 创建一个独立AppDomain作为服务端。 AppDomain.CreateDomain("Server1").DoCallBack(delegate { ServiceHost host = new ServiceHost(typeof(Service1)); host.AddServiceEndpoint(typeof(IService1), //契约(C) new BasicHttpBinding(), //绑定(B) "http://localhost:9999/myservice"); //地址(A) host.Open(); }); // 下面是客户端 ChannelFactory factory = new ChannelFactory( new BasicHttpBinding(), "http://localhost:9999/myservice"); IService1 client = factory.CreateChannel(); var reply = client.SendMessage("Hello WCF"); Console.WriteLine(reply); Console.Read(); } } } 如图所示: 简单实例-2: 创建 Console Self-Host SelfHostConsole_overview WcfServiceLib - 服务契约的实现; *ConsoleHost工程 – Wcf宿主; *ConsoleClient工程 - Wcf客户端 创建WcfServiceLib工程(选WCF Service Library工程模板: VS为我们自动添加一个IService1.cs和Service1.cs) SelfHostConsole_servicelib Host工程里引用WcfServiceLib工程 SelfHostConsole_hostRef 将WcfServiceLib里App.config移动到ConsoleHost工程里,删掉Lib工程里的App.config SelfHostConsole_appconfig Host工程的Program.cs添加下面的代码,右击Builder工程 [c-sharp] view plaincopy using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using WcfServiceLib; namespace WCFStudy2ConsoleHost { class Program { static void Main(string[] args) { using(var host = new ServiceHost(typeof(Service1))) { host.Open(); Console.WriteLine("Service start."); Console.Read(); } } } } 运行 ConsoleHost工程 bin/debug 下面的 exe(这一步是为了生成客户端代理,需要启动Host) 在Client工程里通过添加 Service References,生成客户端Proxy,关闭exe SelfHostConsole_clientproxy 在Client工程的Program.cs里添加如下代码。 [c-sharp] view plaincopy using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WCFStudy2ConsoleClient { class Program { static void Main(string[] args) { MyWcfSvc.Service1Client client = new MyWcfSvc.Service1Client(); var result = client.GetData(123); Console.WriteLine(result); Console.Read(); } } } F5 运行Solution里的Host, 再右击Client工程选Debug的Start new instance方式,运行Client 运行结果: SelfHostConsole_runtime 由于ServiceHost实例是被创建在应用程序域中,必须保证宿主进程在调用服务期间不会被关闭,因此利用Console.Read()来阻塞进程,以使得控制台应用程序能够一直运行,直到人为关闭应用程序。 简单实例-3: 创建 Winform Self-Host Winform的Self-Host和ConsoleHost类似,先添加 WcfServiceLib 工程引用,将 WcfServiceLib 里的App.config 移到 Winform 工程里。加上启动Service的代码就OK了! [c-sharp] view plaincopy public partial class Form1 : Form { public Form1() { InitializeComponent(); } private ServiceHost host = null; // 开启服务端 private void btnStart_Click(object sender, EventArgs e) { try { if (host != null) host.Close(); host = new ServiceHost(typeof(WcfServiceLib.Service1)); host.Open(); this.textBox1.Text = "Server Opened!"; } catch (Exception ex) { MessageBox.Show(ex.ToString()); if (host != null) host.Close(); } } // 关闭服务端 private void btnStop_Click(object sender, EventArgs e) { if (host != null) { host.Close(); this.textBox1.Text += "Server Closed!"; } } } 在Winform中,不要使用 using(...) 代码块,这将导致在Button方法结束后自动销毁Host对象而关闭服务。 简单实例-4: 创建 Windows Service Host Windows Services宿主便于管理者方便地启动或停止服务,且在服务出现故障之后,能够重新启动服务。还可以通过Service Control Manager(服务控制管理器),将服务设置为自动启动方式,省去了服务的管理工作。此外,Windows Services自身还提供了一定的安全性以及检测机制和日志机制。 1. 创建Windows Service工程 2. 引用 WcfServiceLib 工程,添加 App.config (和前面Host添加的App.config一样) 3. 重写 WindowsService 类的 OnStart 和 OnStop 方法 [c-sharp] view plaincopy public partial class Service1 : ServiceBase { public Service1() { InitializeComponent(); } private ServiceHost host = null; protected override void OnStart(string[] args) { if (host != null) host.Close(); host = new ServiceHost(typeof(WcfServiceLib.Service1)); host.Open(); } protected override void OnStop() { if (host != null) host.Close(); } } 4. 创建Service的安装类:在WindowsService 类的设计界面上右击选择 [Add Installer] 修改 serviceProcessInstaller 的 Account 属性 (默认为User) 改为 LocalSystem 通过在Visual Studio的 [Command Prompt] (命令行)模式下通过 InstallUtil 工具安装 Windows服务: InstallUtil [绝对路径]/WCFStudy2WindowsServiceHost.exe (安装成功之后,使用Services.msc查看服务) 简单实例-5: 创建 IIS Host 最简单的就是直接创建一个 WCF Service Application 就OK了。 以上所有工程的关系图如下:

WCF发布方式介绍的更多相关文章

  1. WCF寄宿方式

    WCF开发框架形成之旅---WCF的几种寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者 ...

  2. WCF之各种WCF引用方式

    写在开头:本文内容来自 WCF全面解析中的一个经典例子,如果你已经看过了,那么可以忽略本文,本文旨在和大家分享不一样的WCF使用方法. 准备工作: 1.创建解决方案WCFService(当然名字可以任 ...

  3. WCF引用方式

    WCF之各种WCF引用方式 写在开头:本文内容来自 WCF全面解析中的一个经典例子,如果你已经看过了,那么可以忽略本文,本文旨在和大家分享不一样的WCF使用方法. 准备工作: 1.创建解决方案WCFS ...

  4. Qt官方开发环境生成的exe发布方式--使用windeployqt(windeployqt是单独的程序,放在低版本qt4目录下也可以运行的)

    Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...

  5. Qt官方开发环境生成的exe发布方式

    本来想自己写一个打包程序的文章了,但是我发现了宝贝,在这里,大神写的比我牛逼的多了,这里做一下搬运工 一是为了方便大家 二是为了以后方便自己找 原文链接:http://tieba.baidu.com/ ...

  6. Qt官方开发环境生成的exe发布方式--使用windeployqt

    Qt 官方开发环境使用的动态链接库方式,在发布生成的exe程序时,需要复制一大堆 dll,如果自己去复制dll,很可能丢三落四,导致exe在别的电脑里无法正常运行.因此 Qt 官方开发环境里自带了一个 ...

  7. C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍

    在前面一系列文章中,我们可以看到微信自定义菜单的重要性,可以说微信公众号账号中,菜单是用户的第一印象,我们要规划好这些菜单的内容,布局等信息.根据微信菜单的定义,我们可以看到,一般菜单主要分为两种,一 ...

  8. **crontab的使用方式介绍和no crontab for root 提示的处理

    crontab的使用方式介绍   定时任务参数详解如下:  crontab -l     |  crontab -e    www.2cto.com   #*/30 * * * * ntpdate 1 ...

  9. Spark部署三种方式介绍:YARN模式、Standalone模式、HA模式

    参考自:Spark部署三种方式介绍:YARN模式.Standalone模式.HA模式http://www.aboutyun.com/forum.php?mod=viewthread&tid=7 ...

随机推荐

  1. [leetcode-609-Find Duplicate File in System]

    https://discuss.leetcode.com/topic/91430/c-clean-solution-answers-to-follow-upGiven a list of direct ...

  2. lintcode-109-数字三角形

    109-数字三角形 给定一个数字三角形,找到从顶部到底部的最小路径和.每一步可以移动到下面一行的相邻数字上. 注意事项 如果你只用额外空间复杂度O(n)的条件下完成可以获得加分,其中n是数字三角形的总 ...

  3. ArcGis融合小多边形到相邻多边形

     在有的时候,我们的数据中可能会有许多细小的图斑,这些并不是我们想要的,需要将它们合并到周围的图斑中,如果一个一个手动合并,那工作量之大简直不敢想象.现在借助ArcGIS的Eliminate工具可 ...

  4. WM_CTLCOLOR消息

    文章参考地址:http://blog.csdn.net/hisinwang/article/details/8070393         在每个控件开始绘制之前,都会向其父窗口发送WM_CTLCOL ...

  5. BZOJ1057 [ZJOI2007]棋盘制作 【最大同色矩形】

    1057: [ZJOI2007]棋盘制作 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 3248  Solved: 1636 [Submit][St ...

  6. 洛谷 P1268 树的重量 解题报告

    P1268 树的重量 题目描述 树可以用来表示物种之间的进化关系.一棵"进化树"是一个带边权的树,其叶节点表示一个物种,两个叶节点之间的距离表示两个物种的差异.现在,一个重要的问题 ...

  7. 工具——SVN常用命令

    SVN一般都是团队合作做一个项目所需用到的,为了是版本的统一 ;1. Check out——从服务器端取得代码    把服务器资料库里存放的某个项目代码取出来,放到本地主机中,这个动作叫做“check ...

  8. CodeForces 167B - Wizards and Huge Prize 期望概率dp

    初步分析:把赢了的巡回赛的a值加起来就是最后的剩余空间 这个明显的是状态转移的dp啊,然而他的状态比较骚是个数组,表示剩余空间,f(i,j,b),i表示比到第几场,j表示赢了几场,b就是里面的核心状态 ...

  9. ionic安装遇到的一些问题

    ionic = Cordova + Angular + ionic CSS // 安装(失败的话 Mac 尝试使用 sudo,Windows 尝试管理员身份运行 cmd)$ npm install - ...

  10. Ubuntu修改grub启动顺序和启动时间

    sudo gedit /boot/grub/grub.cfg,输入密码,在弹出的文件中找到set default = "0",想要改为第N项默认就把0改成N-1 看到启动界面是第几 ...