• WCF实现多个服务


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

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


    21


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

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

    22

    一旦添加了对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个按钮如下:           

    23


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

  • 相关阅读:
    机器学习-Matplotlib绘图(柱状图,曲线图,点图)
    人工智能-机器学习之numpy方法
    爬虫解码~以及我的一些小经验
    django-子项目
    Django-模板语法
    Django-cookie的保存以及删除操作
    django-路由
    响应式瀑布流
    原生js实现最简单的瀑布流布局
    原生js用div实现简单的轮播图
  • 原文地址:https://www.cnblogs.com/darrenji/p/4638445.html
Copyright © 2020-2023  润新知