WCF实现多个服务

时间:2020-12-27 13:22:03

 

本篇体验使用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();
            }
        }
    }
}

 

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


WCF实现多个服务


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

 

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

WCF实现多个服务

 

一旦添加了对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服务可实现多个服务。