• 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/
     

  • 相关阅读:
    25.大白话说java并发工具类-CountDownLatch,CyclicBarrier,Semaphore,Exchanger
    23.FutureTask基本操作总结
    22.线程池之ScheduledThreadPoolExecutor
    Jenkins + SVN搭建php持续集成
    Django学习系列之Form表单结合ajax
    Django学习系列之模板系统
    Django学习系列之路由系统
    zabbix学习系列之基础概念
    Python学习系列之反射
    Django学习系列之模板
  • 原文地址:https://www.cnblogs.com/llbofchina/p/2094191.html
Copyright © 2020-2023  润新知