zoukankan      html  css  js  c++  java
  • WCF 第七章 寄宿 在一个进程中寄宿多个服务

    将应用程序功能聚集到正确的服务层次是系统设计的一个必须元素。创建一个有很多接口的系统,这个系统也会变得很令人迷惑。创建只有很多接口的一个系统,这个系统会是变成一个很难改变的整体。

      在第二章”契约”,我们描述了如何将多个类接口集成到一个单一的终结点中。这是通过.NET接口集成完成的。我们也描述了如何在一个单一服务内部暴露多个 终结点。这一部分提供了一个可供选择的方案。不是通过将两个接口合并为一个然后将聚合作为一个服务暴露出来,这里我们描述的是如何在一个单一的操作系统进 程内分别暴露两个服务。

      一个ServiceHost 仅暴露一个服务。所以,为了在一个操作系统进程内暴露多个服务,你需要实现多个ServiceHost类。而这正是WAS做的工作-它为每个服务创建一个 ServiceHost并通过一个SVC文件激活。SVC包含了在应用配置文件(web.config)中描述的终结点的服务名。终结点列出了地址,绑定 和契约,所以ServiceHost有它需要的所有东西来监听并分发消息。

      当自我寄宿服务时, 你可以同样的实例化多个ServiceHosts. 每个宿主时完全独立的,而不是共享同样的操作系统进程。每个宿主在app.config 文件的<system.servicemodel>部分有它自己的配置信息。在ServiceHost 启动时,线程和实例管理由WCF独立管理,所以宿主程序不需要实现那个逻辑。

      列表7.10描述了一个寄宿两个服务的控制台应用。GoodStockService的GetStockPrice方法在返回结果前等待10秒,而 GreatStockService的同样方法立即返回结果。因为服务行为在WCF中配置,这个简单的程序是多线程的,所有当 GoodStockService在睡眠时,GreatStockService对请求进行反馈。即便是最慢的服务也是多线程的,按照需要分发多个入站消 息给GetStockPrice实例。

    列表7.10 在一个进程中的多个自我寄宿服务

    namespace EssentialWCF
    {
        [ServiceContract]
        public class GoodStockService
        {
            [OperationContract]
            public double GetStockPrice(string ticker)
            {
                Thread.Sleep(10000);
                return 94.85;
            }
        }   
       [ServiceContract]
        public class GreatStockService
        {
            [OperationContract]
            public double GetStockPrice(string ticker)
            {
                return 94.85;
            }
        }
       public class Program
        {           
            //Host the service within this EXE console application.
            public static void Main(string[] args)
            {
                ServiceDescription desc = null;
                ServiceHost serviceHost1 = new ServiceHost(typeof(GoodStockService));
                serviceHost1.Open();
                Console.WriteLine("Service #1 is ready.");
     
                ServiceHost serviceHost2 = new ServiceHost(typeof(GreatStockService));
                serviceHost2.Open();
                Console.WriteLine("Service #2 is ready.");
     
                Console.WriteLine("Press  to terminate.\n\n");
                Console.ReadLine();
     
                //Close the ServiceHosts to shutdown the service.
                serviceHost1.Close();
                serviceHost2.Close();
            }
        }
    }

      列表7.11的app.config 文件在<System.ServiceHost>部分有两个入口-一个服务一个入口。每个服务有一个独一无二的基地址。注意每个服务里的每个 终结点有一个空地址。一个有一个空地址的终结点在服务基地址上监听进入的请求消息。这样至多可以使用与基地址相同的URI方案来指定一个服务终结点的空地 址。

    列表7.11 在一个进程内设置多个自我寄宿服务的配置 

    01<?xml version="1.0" encoding="utf-8" ?>
    02<configuration>
    03    <system.serviceModel>
    04        <behaviors>
    05            <serviceBehaviors>
    06                <behavior name="mexServiceBehavior">
    07                    <serviceMetadata httpGetEnabled="true" />
    08                </behavior>
    09            </serviceBehaviors>
    10        </behaviors>
    11        <services>
    12            <service behaviorConfiguration="mexServiceBehavior" name="EssentialWCF.GoodStockService">
    13                <endpoint address="" binding="basicHttpBinding" bindingConfiguration=""
    14                    contract="EssentialWCF.GoodStockService" />
    15                <host>
    16                    <baseAddresses>
    17                        <add baseAddress="http://localhost:8001/EssentialWCF" />
    18                    </baseAddresses>
    19                </host>
    20            </service>
    21            <service behaviorConfiguration="mexServiceBehavior" name="EssentialWCF.GreatStockService">
    22                <endpoint address="" binding="basicHttpBinding" bindingConfiguration=""
    23                    contract="EssentialWCF.GreatStockService" />
    24                <host>
    25                    <baseAddresses>
    26                        <add baseAddress="http://localhost:8002/EssentialWCF" />
    27                    </baseAddresses>
    28                </host>
    29            </service>
    30        </services>
    31    </system.serviceModel>
    32</configuration>


    =======
    转载自
    作者:DanielWise
    出处:http://www.cnblogs.com/danielWise/
     

  • 相关阅读:
    Luogu 1080 【NOIP2012】国王游戏 (贪心,高精度)
    Luogu 1314 【NOIP2011】聪明的质检员 (二分)
    Luogu 1315 【NOIP2011】观光公交 (贪心)
    Luogu 1312 【NOIP2011】玛雅游戏 (搜索)
    Luogu 1525 【NOIP2010】关押罪犯 (贪心,并查集)
    Luogu 1514 引水入城 (搜索,动态规划)
    UVA 1394 And Then There Was One / Gym 101415A And Then There Was One / UVAlive 3882 And Then There Was One / POJ 3517 And Then There Was One / Aizu 1275 And Then There Was One (动态规划,思维题)
    Luogu 1437 [HNOI2004]敲砖块 (动态规划)
    Luogu 1941 【NOIP2014】飞扬的小鸟 (动态规划)
    HDU 1176 免费馅饼 (动态规划)
  • 原文地址:https://www.cnblogs.com/llbofchina/p/2094191.html
Copyright © 2011-2022 走看看