从VS2005推出WCF以来,WCF逐步取代了Remoting, WebService成为.NET上分布式程序的主要技术。WCF统一的模型整合了以往的 WebService、Remoting、MSMQ 等技术,让分布式开发变得更加简单,方便,快捷。

(上图选自《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

  1. namespace WCFStudy1
  2. {
  3. [ServiceContract]
  4. public interface IService1
  5. {
  6. [OperationContract]
  7. string SendMessage(string clientInput);
  8. }
  9. public class Service1 : IService1
  10. {
  11. #region IService1 Members
  12. public string SendMessage(string clientInput)
  13. {
  14. return string.Format("Server Get Message: {0}", clientInput);
  15. }
  16. #endregion
  17. }
  18. }

2. Program.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ServiceModel;
  6. namespace WCFStudy1
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. // 创建一个独立AppDomain作为服务端。
  13. AppDomain.CreateDomain("Server1").DoCallBack(delegate
  14. {
  15. ServiceHost host = new ServiceHost(typeof(Service1));
  16. host.AddServiceEndpoint(typeof(IService1),                  //契约(C)
  17. new BasicHttpBinding(),             //绑定(B)
  18. "http://localhost:9999/myservice"); //地址(A)
  19. host.Open();
  20. });
  21. // 下面是客户端
  22. ChannelFactory<IService1> factory = new ChannelFactory<IService1>(
  23. new BasicHttpBinding(),
  24. "http://localhost:9999/myservice");
  25. IService1 client = factory.CreateChannel();
  26. var reply = client.SendMessage("Hello WCF");
  27. Console.WriteLine(reply);
  28. Console.Read();
  29. }
  30. }
  31. }

如图所示:


简单实例-2: 创建 Console Self-Host

WcfServiceLib - 服务契约的实现; *ConsoleHost工程 – Wcf宿主; *ConsoleClient工程 - Wcf客户端

    1. 创建WcfServiceLib工程(选WCF Service Library工程模板: VS为我们自动添加一个IService1.cs和Service1.cs)

    1. Host工程里引用WcfServiceLib工程

    1. 将WcfServiceLib里App.config移动到ConsoleHost工程里,删掉Lib工程里的App.config

    1. Host工程的Program.cs添加下面的代码,右击Builder工程
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.ServiceModel;
  6. using WcfServiceLib;
  7. namespace WCFStudy2ConsoleHost
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. using(var host = new ServiceHost(typeof(Service1)))
  14. {
  15. host.Open();
  16. Console.WriteLine("Service start.");
  17. Console.Read();
  18. }
  19. }
  20. }
  21. }
    1. 运行 ConsoleHost工程 bin/debug 下面的 exe(这一步是为了生成客户端代理,需要启动Host)
    2. 在Client工程里通过添加 Service References,生成客户端Proxy,关闭exe

    1. 在Client工程的Program.cs里添加如下代码。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace WCFStudy2ConsoleClient
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. MyWcfSvc.Service1Client client = new MyWcfSvc.Service1Client();
  12. var result = client.GetData(123);
  13. Console.WriteLine(result);
  14. Console.Read();
  15. }
  16. }
  17. }
    1. F5 运行Solution里的Host, 再右击Client工程选Debug的Start new instance方式,运行Client

运行结果:

由于ServiceHost实例是被创建在应用程序域中,必须保证宿主进程在调用服务期间不会被关闭,因此利用Console.Read()来阻塞进程,以使得控制台应用程序能够一直运行,直到人为关闭应用程序。


简单实例-3: 创建 Winform Self-Host

Winform的Self-Host和ConsoleHost类似,先添加 WcfServiceLib 工程引用,将 WcfServiceLib 里的App.config 移到 Winform 工程里。加上启动Service的代码就OK了!

  1. public partial class Form1 : Form
  2. {
  3. public Form1()
  4. {
  5. InitializeComponent();
  6. }
  7. private ServiceHost host = null;
  8. // 开启服务端
  9. private void btnStart_Click(object sender, EventArgs e)
  10. {
  11. try
  12. {
  13. if (host != null)
  14. host.Close();
  15. host = new ServiceHost(typeof(WcfServiceLib.Service1));
  16. host.Open();
  17. this.textBox1.Text = "Server Opened!";
  18. }
  19. catch (Exception ex)
  20. {
  21. MessageBox.Show(ex.ToString());
  22. if (host != null)
  23. host.Close();
  24. }
  25. }
  26. // 关闭服务端
  27. private void btnStop_Click(object sender, EventArgs e)
  28. {
  29. if (host != null)
  30. {
  31. host.Close();
  32. this.textBox1.Text += "Server Closed!";
  33. }
  34. }
  35. }

在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 方法

  1. public partial class Service1 : ServiceBase
  2. {
  3. public Service1()
  4. {
  5. InitializeComponent();
  6. }
  7. private ServiceHost host = null;
  8. protected override void OnStart(string[] args)
  9. {
  10. if (host != null)
  11. host.Close();
  12. host = new ServiceHost(typeof(WcfServiceLib.Service1));
  13. host.Open();
  14. }
  15. protected override void OnStop()
  16. {
  17. if (host != null)
  18. host.Close();
  19. }
  20. }

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 -- 简单实例的更多相关文章

  1. WCF学习——构建一个简单的WCF应用(一)

    本文的WCF服务应用功能很简单,却涵盖了一个完整WCF应用的基本结构.希望本文能对那些准备开始学习WCF的初学者提供一些帮助. 在这个例子中,我们将实现一个简单的计算器和传统的分布式通信框架一样,WC ...

  2. WCF学习——构建一个简单的WCF应用(二)

    我们接着上一篇文章进行讲解 http://www.cnblogs.com/songjianhui/p/7060698.html 一:客户端通过添加引用调用服务 WCF应用服务被成功寄宿后,WCF服务应 ...

  3. 关于深度学习之TensorFlow简单实例

    1.对TensorFlow的基本操作 import tensorflow as tf import os os.environ[" a=tf.constant(2) b=tf.constan ...

  4. WCF 学习总结2 -- 配置WCF

    前面一篇文章<WCF 学习总结1 -- 简单实例>一股脑儿展示了几种WCF部署方式,其中配置文件(App.config/Web.config)都是IDE自动生成,省去了我们不少功夫.现在回 ...

  5. Django学习笔记(一):环境安装与简单实例

    Django学习笔记(一):环境安装与简单实例 通过本文章实现: Django在Windows中的环境安装 Django项目的建立并编写简单的网页,显示欢迎语与当前时间 一.环境安装 结合版本兼容性等 ...

  6. WCF学习之旅—HTTP双工模式(二十)

    WCF学习之旅—请求与答复模式和单向模式(十九) 四.HTTP双工模式 双工模式建立在上文所实现的两种模式的基础之上,实现客户端与服务端相互调用:前面介绍的两种方法只是在客户端调用服务端的方法,然后服 ...

  7. WCF学习笔记之事务编程

    WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...

  8. WCF学习笔记之传输安全

    WCF学习笔记之传输安全 最近学习[WCF全面解析]下册的知识,针对传输安全的内容做一个简单的记录,这边只是简单的记录一些要点:本文的内容均来自[WCF全面解析]下册: WCF的传输安全主要涉及认证. ...

  9. WCF学习之旅—WCF服务部署到IIS7.5(九)

    上接   WCF学习之旅—WCF寄宿前的准备(八) 四.WCF服务部署到IIS7.5 我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以 ...

随机推荐

  1. SQL Server 字符串拼接、读取

    一.查询结果使用,字符串拼接 declare @names nvarchar(1000) declare @ParmDefinition nvarchar(1000) declare @sqltext ...

  2. spark Graph 的PregelAPI 理解和使用

    spark Graph 的PregelAPI 理解和使用 图本质上是一种递归的数据结构,可以使用Spark GraphX 的PregelAPI接口对图数据进行批量计算, 之前一直不怎么理解Pregel ...

  3. 使用 xUnit 编写 ASP.NET Core WebAPI单元测试

    本文使用xUnit对ASP.NET Core WebAPI做单元测试,使用HttpClient的同步和异步请求,下面详细介绍xUnit的使用过程: 一.创建示例项目 模板为我们自动创建了一个Value ...

  4. XAML 调试工具 不见了?

    XAML调试工具不见了怎么办? 1.调试---> 选项---> 选中 启用XAML的UI调试工具 2.调试---> 选项---> 禁用 使用托管兼容模式 欧了!

  5. 类库中使用WPF 资源文件

    1.类库的 后缀.csproj文件,第一个<PropertyGroup>中加入下面代码 <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-b ...

  6. Postgres 的 Array 类型

    mysql 不支持 Array 类型 一.Postgres 原生SQL 适用场景:可以用于实现贴标签功能 1.定义 CREATE TABLE "Students" ( name V ...

  7. C#导出Excel文件Firefox中文件名乱码

    首先说明下:我的解决方法不一定适用于其他遇到该问题的人,因为情况多种多样,适合我的方法不一定适合别人,就像我在遇到问题时查到别人的解决方案放到我的代码里却不管用,所以这个方法仅供参考 这两天做了一个导 ...

  8. flask框架1

    说flask框架之前,必须得提一下web框架,他的作用是为了利用互联网交流工作文档,我们为什么要使用框架,因为框架的稳定性和可扩展性强并且可以降低开发难度,提高开发效率.总的来说就是避免做无用功,重复 ...

  9. B2C电商项目

    经历四个月的自学. 结合所学的知识(HTML,CSS,javascript,jQuery,Mysql,Redis,Django,celery,fastDfs,haystack,whoosh,uWSGI ...

  10. centos clamav杀毒软件安装配置及查杀,没想到linux下病毒比windows还多!

    centos clamav杀毒软件安装配置及查杀,没想到linux下病毒比windows还多! 一.手动安装 1.下载(官网)    cd /soft     wget http://www.clam ...