本篇体验使用WCF实现2个服务。一个使用HTTP通讯,一个使用TCP通讯。

大致思路是:

→ 创建WCF服务以及接口,写2个接口
→ 实现2个接口
→ 为WCF创建一个控制台项目的宿主,配置App.config,开启宿主
→ 创建一个Web客户端,创建对WCF服务的引用
→ 在Web客户端,调用WCF服务,即调用WCF的代理类的实例方法

打开Visual Studio 2013,创建一个类库项目。

在类库下创建一个名称为"HelloServie"的WCF服务。随即,在项目中多了WCF相关的组件,以及自动创建了IHelloServie类和HelloServie类。

修改IHelloService接口如下:

  1. namespace MyServices
  2.  
  3. {
  4.  
  5.     [ServiceContract]
  6.  
  7.     public interface IOneService
  8.  
  9.     {
  10.  
  11.         [OperationContract]
  12.  
  13.         string GetOne();
  14.  
  15.     }
  16.  
  17.     [ServiceContract]
  18.  
  19.     public interface ITwoService
  20.  
  21.     {
  22.  
  23.         [OperationContract]
  24.  
  25.         string GetTwo();
  26.  
  27.     }
  28.  
  29. }
  30.  

HelloService类现在需要同时实现以上2个接口。

  1. namespace MyServices
  2.  
  3. {
  4.  
  5.     // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“HelloServie”。
  6.  
  7.     public class HelloServie : IOneService, ITwoService
  8.  
  9.     {
  10.  
  11.         public string GetOne()
  12.  
  13.         {
  14.  
  15.             return "本条信息通过HTTP传递";
  16.  
  17.         }
  18.  
  19.         public string GetTwo()
  20.  
  21.         {
  22.  
  23.             return "本条信息通过TCP传递";
  24.  
  25.         }
  26.  
  27.     }
  28.  
  29. }
  30.  

现在需要一个宿主。在当前解决方案下创建一个控制台项目。

添加对WCF所在类库的引用,添加对"System.ServiceModel"的引用。

设置控制台项目的配置文件。

  1. <?xml version="1.0" encoding="utf-8" ?>
  2.  
  3. <configuration>
  4.  
  5.     <startup>
  6.  
  7.         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  8.  
  9.     </startup>
  10.  
  11.     <system.serviceModel>
  12.  
  13.       <services>
  14.  
  15.         <!--name="命名空间名称.实现类名称"-->
  16.  
  17.         <service name="MyServices.HelloServie" behaviorConfiguration="mexBehaviour">
  18.  
  19.           <endpoint address="MyServices" binding="basicHttpBinding" contract="MyServices.IOneService">
  20.  
  21.           </endpoint>
  22.  
  23.           <endpoint address="MyServices" binding="netTcpBinding" contract="MyServices.ITwoService">
  24.  
  25.           </endpoint>
  26.  
  27.           <host>
  28.  
  29.             <baseAddresses>
  30.  
  31.               <add baseAddress="http://localhost:9090/"/>
  32.  
  33.               <add baseAddress="net.tcp://localhost:6060/"/>
  34.  
  35.             </baseAddresses>
  36.  
  37.           </host>
  38.  
  39.         </service>
  40.  
  41.       </services>
  42.  
  43.       <behaviors>
  44.  
  45.         <serviceBehaviors>
  46.  
  47.           <behavior name="mexBehaviour">
  48.  
  49.             <serviceMetadata httpGetEnabled="true"/>
  50.  
  51.           </behavior>
  52.  
  53.         </serviceBehaviors>
  54.  
  55.       </behaviors>
  56.  
  57.     </system.serviceModel>
  58.  
  59. </configuration>

其中,

● 通过Service节点的behaviorConfiguration属性绑定behavior行为
● service节点的name属性值的格式是:"命名空间名称.实现类名称"
● endpoint一般包含"abc"三个属性,a代表address,b代表binding,c代表contract
● endpoint中的contract属性值的格式是:"命名空间名称.接口名称"

编写控制台项目如下:

  1. using System.ServiceModel;
  2.  
  3. ......
  4.  
  5. namespace MyHost
  6.  
  7. {
  8.  
  9.     class Program
  10.  
  11.     {
  12.  
  13.         static void Main(string[] args)
  14.  
  15.         {
  16.  
  17.             using (ServiceHost host = new ServiceHost(typeof(HelloServie)))
  18.  
  19.             {
  20.  
  21.                 host.Open();
  22.  
  23.                 Console.WriteLine("宿主已经开启,开启时间;" + DateTime.Now);
  24.  
  25.                 Console.ReadKey();
  26.  
  27.             }
  28.  
  29.         }
  30.  
  31.     }
  32.  
  33. }
  34.  

把控制台项目设置为启动项目,并启动控制台项目,即开启宿主。

现在需要客户端。开启一个新的Visual Studio解决方案。

创建一个空的,名称为"MyServiceClient"空网站。

一旦添加了对WCF服务的引用,在网站的Web.config中就自动多了system.serviceModel节点。

创建一个Web界面。

  1.     <div>
  2.  
  3.         <asp:Button ID="Button1" runat="server" Text="获取通过HTTP通讯的信息" OnClick="Button1_Click" />
  4.  
  5.         <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
  6.  
  7.         <br /><br />
  8.  
  9.         <asp:Button ID="Button2" runat="server" Text="获取通过TCP通讯的信息" OnClick="Button2_Click" />
  10.  
  11.         <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
  12.  
  13.     </div>
  14.  

编写按钮事件。

  1.         //HTTP通讯信息
  2.  
  3.         protected void Button1_Click(object sender, EventArgs e)
  4.  
  5.         {
  6.  
  7.             MyServiceClient.MyService.OneServiceClient client = new MyService.OneServiceClient("BasicHttpBinding_IOneService");
  8.  
  9.             Label1.Text = client.GetOne();
  10.  
  11.         }
  12.  
  13.         //TCP通讯信息
  14.  
  15.         protected void Button2_Click(object sender, EventArgs e)
  16.  
  17.         {
  18.  
  19.             MyServiceClient.MyService.TwoServiceClient client = new MyService.TwoServiceClient("NetTcpBinding_ITwoService");
  20.  
  21.             Label2.Text = client.GetTwo();
  22.  
  23.         }
  24.  

以上,声明OneServiceClient和TwoServiceClient实例时, 构造函数传递的实参值是Web.config中endpoint的name属性值。

点击页面上的2个按钮如下:

可见,一个WCF服务可实现多个服务。

WCF实现多个服务的更多相关文章

  1. WCF初探-11:WCF客户端异步调用服务

    前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码 ...

  2. WCF初探-13:WCF客户端为双工服务创建回调对象

    前言: 在WCF初探-5:WCF消息交换模式之双工通讯(Duplex)博文中,我讲解了双工通信服务的一个应用场景,即订阅和发布模式,这一篇,我将通过一个消息发送的例子讲解一下WCF客户端如何为双工服务 ...

  3. WCF大文件传输服务

    由于项目需要,自己写一个基于WCF的大文件传输服务雏形.觉得有一定的参考价值,因此放在网上分享. 目前版本为v1.1特点如下: 1.文件传输端口为18650 2.上传和下载文件 3.支持获取文件传输状 ...

  4. 使用WCF实现SOA面向服务编程—— 架构设计

    原文地址:http://www.cnblogs.com/leslies2/archive/2011/03/29/1997889.html SOA本身就是一种面向企业级服务的系统架构,简单来说,SOA就 ...

  5. WCF Restful Service的服务

    构建基于WCF Restful Service的服务 前言 传统的Asmx服务,由于遵循SOAP协议,所以返回内容以xml方式组织.并且客户端需要添加服务端引用才能使用(虽然看到网络上已经提供了这方面 ...

  6. 【WCF系列】(四)WCF客户端怎么消费服务

    WCF客户端怎么消费服务 获取服务绑定协议.绑定和地址:实现方式 SvcUtil方式:SvcUtil.exe是一个命令行工具,位于:C:\Program Files (x86)\Microsoft S ...

  7. WCF备忘录一:服务端实例的生命周期

    示例代码下载地址:WCFDemo1Day 概述 客户端向WCF服务发出请求后,服务端会实例化一个Service对象(实现了契约接口的对象)用来处理请求,实例化Service对象以及维护其生命周期的方式 ...

  8. Wcf:可配置的服务调用方式

    添加wcf服务引用时,vs.net本来就会帮我们在app.config/web.config里生成各种配置,这没啥好研究的,但本文谈到的配置并不是这个.先看下面的图: 通常,如果采用.NET的WCF技 ...

  9. 跟我一起学WCF(6)——深入解析服务契约[下篇]

    一.引言 在上一篇博文中,我们分析了如何在WCF中实现操作重载,其主要实现要点是服务端通过ServiceContract的Name属性来为操作定义一个别名来使操作名不一样,而在客户端是通过重写客户端代 ...

随机推荐

  1. 详细到没朋友,一文帮你理清Linux 用户与用户组关系~

    引用自:https://mp.weixin.qq.com/s/Fl8ZjaUQuLDx7jbgM-1T5w 1.用户和用户组文件 在 linux 中,用户帐号,用户密码,用户组信息和用户组密码均是存放 ...

  2. MySQL 5.6.10 跨平台GTID复制实践

    根据业务需要,建立MySQL复制来实现数据冗余. 1:binlog_format   默认值是:statement 有效值: ROW,基于行的复制 STATEMENT 基于语句级别的复制 MASTER ...

  3. linux sftp安装【转】

    工具:虚拟机:VMware Workstation Pro.操作系统:CentOS-6.4-x86_64-minimal.终端模拟器:Xshell 5 .ftp:filezilla 一.让虚拟机联网 ...

  4. git 入门常用命令(转)

    Git工作流程:D:\projects\Setup2\Setup2\Setup2\Express\SingleImage\DiskImages\DISK1 git clone工作开始之初,可通过git ...

  5. Oracle SQL部分练习题

    SQL练习题        注:查询列表不建议用 “*” 1.列出至少有一个雇员的所有部门: a. select * from dept where deptno in(select distinct ...

  6. lombok使用说明

    简介lombok 的官方网址:http://projectlombok.org/lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码.特别是相对于 POJO, ...

  7. 通过anaconda进行python多版本控制

    ---恢复内容开始--- linux与windows通用. 1. 假设电脑上已经转好anaconda3. (anaconda 默认装好了python3.jupyter.spyter) 2. 现在需求是 ...

  8. Linux下的snmpd.conf配置说明

    SNMP(Simple Network Management Protocol,简单网络管理协议)的前身是简单网关监控协议(SGMP),用来对通信线路进行管理.在RHEL中,SNMP的配置文件地址是/ ...

  9. Java中 equals 和 == 的比较

    先来看这样一个题目,假设有以下代码 下列选项中返回false的语句是? String s = "hello"; String t = "hello"; char ...

  10.  sublime text3快速生成html头部信息(转)

    sublime text3快速生成html头部信息  https://blog.csdn.net/sunshinegirl_7/article/details/49802579 经常见别人创建新的ht ...