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

大致思路是:

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

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

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

修改IHelloService接口如下:

namespace MyServices
{
    [ServiceContract]
    public interface IOneService
    {
        [OperationContract]
        string GetOne();
    }

    [ServiceContract]
    public interface ITwoService
    {
        [OperationContract]
        string GetTwo();
    }
}


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

namespace MyServices
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“HelloServie”。
    public class HelloServie : IOneService, ITwoService
    {

        public string GetOne()
        {
            return "本条信息通过HTTP传递";
        }

        public string GetTwo()
        {
            return "本条信息通过TCP传递";
        }
    }
}

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

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

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

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
      <services>
        <!--name="命名空间名称.实现类名称"-->
        <service name="MyServices.HelloServie" behaviorConfiguration="mexBehaviour">
          <endpoint address="MyServices" binding="basicHttpBinding" contract="MyServices.IOneService">
          </endpoint>
          <endpoint address="MyServices" binding="netTcpBinding" contract="MyServices.ITwoService">
          </endpoint>
          <host>
            <baseAddresses>
              <add baseAddress="http://localhost:9090/"/>
              <add baseAddress="net.tcp://localhost:6060/"/>
            </baseAddresses>
          </host>
        </service>
      </services>

      <behaviors>
        <serviceBehaviors>
          <behavior name="mexBehaviour">
            <serviceMetadata httpGetEnabled="true"/>
          </behavior>
        </serviceBehaviors>
      </behaviors>
    </system.serviceModel>
</configuration>

其中,

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

编写控制台项目如下:

using System.ServiceModel;
......

namespace MyHost
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ServiceHost host = new ServiceHost(typeof(HelloServie)))
            {
                host.Open();
                Console.WriteLine("宿主已经开启,开启时间;" + DateTime.Now);
                Console.ReadKey();
            }
        }
    }
}

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

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

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

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

创建一个Web界面。

    <div>
        <asp:Button ID="Button1" runat="server" Text="获取通过HTTP通讯的信息" OnClick="Button1_Click" />
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

        <br /><br />
        <asp:Button ID="Button2" runat="server" Text="获取通过TCP通讯的信息" OnClick="Button2_Click" />
        <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
    </div>

编写按钮事件。

        //HTTP通讯信息
        protected void Button1_Click(object sender, EventArgs e)
        {

            MyServiceClient.MyService.OneServiceClient client = new MyService.OneServiceClient("BasicHttpBinding_IOneService");
            Label1.Text = client.GetOne();
        }

        //TCP通讯信息
        protected void Button2_Click(object sender, EventArgs e)
        {
            MyServiceClient.MyService.TwoServiceClient client = new MyService.TwoServiceClient("NetTcpBinding_ITwoService");
            Label2.Text = client.GetTwo();
        }

以上,声明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. rpmbuild 构建rpm包时报错解决 error: Installed (but unpackaged) file(s) found:

    解决的办法是找到 /usr/lib/rpm/macros 中%__check_files         /usr/lib/rpm/check-files %{buildroot}   注释掉

  2. bulk_write&Replace_one

    ns=[]ns.append(ReplaceOne({'ip': ok['ip']}, ok, upsert=True))#更新插入 if len(ns) > 0: res = coll.bul ...

  3. IDEA下利用Jrebel插件实现JFinal项目main方法【热加载】

    IDEA下利用Jrebel插件实现JFinal项目main方法[热加载] Jrebel破解办法 https://github.com/ilanyu/ReverseProxy/releases/tag/ ...

  4. 微信小程序Http高级封装 es6 promise

    公司突然要开放微信小程序,持续蒙蔽的我还不知道小程序是个什么玩意. 于是上网查了一下,就开始着手开发..... 首先开发客户端的东西,都有个共同点,那就是  数据请求! 看了下小程序的请求方式大概和a ...

  5. USING NHIBERNATE WITH MySQL

    In previous USING NHIBERNATE WITH SQLITE, we connect SQLITE with ORM framework NHibernate. One of th ...

  6. MVC底层原理

    窥探ASP.Net MVC底层原理 实现跨越Session的分布式TempData 1.问题的引出 我相信大家在项目中都使用过TempData,TempData是一个字典集合,一般用于两个请求之间临时 ...

  7. 【GOF23设计模式】--工厂模式

    工厂模式: 实现了创建者调用者的分离 详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Principle):一个软件的实体应当 ...

  8. Ubuntu 18.04及Snap体验——让Linux入门更简单(转))

    https://www.linuxidc.com/Linux/2018-06/152993.htm 初次听说过Linux的时候,是大一计算机课时候老师介绍说除了Windows还有Linux.Unix操 ...

  9. P2429 制杖题

    P2429 制杖题这个题用线性筛会WA一个点,因为这个题是给定的质数集,最大的质数会比当前的倍数大,就会出现上面的情况.怎办?判重用set啊!set+线性筛就过掉了.16ms #include< ...

  10. babel更新之后的 一些坑

    最近在使用babel-loader的时候,发生了一些错误,现在的babel-loader版本已经是8.0.0,更新到这个版本之后,如果还按照以前的安装依赖的方法: cnpm install --sav ...