WCF 第七章 寄宿 在一个进程中寄宿多个服务
2011-06-30 10:28
204 查看
将应用程序功能聚集到正确的服务层次是系统设计的一个必须元素。创建一个有很多接口的系统,这个系统也会变得很令人迷惑。创建只有很多接口的一个系统,这个系统会是变成一个很难改变的整体。
在第二章”契约”,我们描述了如何将多个类接口集成到一个单一的终结点中。这是通过.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 在一个进程中的多个自我寄宿服务
列表7.11的app.config 文件在<System.ServiceHost>部分有两个入口-一个服务一个入口。每个服务有一个独一无二的基地址。注意每个服务里的每个 终结点有一个空地址。一个有一个空地址的终结点在服务基地址上监听进入的请求消息。这样至多可以使用与基地址相同的URI方案来指定一个服务终结点的空地 址。
列表7.11 在一个进程内设置多个自我寄宿服务的配置
view sourceprint?
=======
转载自
作者:DanielWise
出处:http://www.cnblogs.com/danielWise/
在第二章”契约”,我们描述了如何将多个类接口集成到一个单一的终结点中。这是通过.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 在一个进程内设置多个自我寄宿服务的配置
view sourceprint?
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/
相关文章推荐
- WCF 第七章 寄宿 在一个进程中寄宿多个服务
- WCF 第七章 寄宿 在一个IIS寄宿服务中开启ASMX特性
- WCF 第七章 寄宿 在Windows 进程激活服务中寄宿服务
- WCF 第七章 寄宿 在Windows 进程激活服务中寄宿服务
- WCF 第七章 寄宿 在一个IIS寄宿服务中开启ASMX特性
- [WCF Step by Step 读书笔记] Chapter02 寄宿一个WCF服务
- WCF并发(Concurrency)的本质:同一个服务实例上下文(InstanceContext)同时处理多个服务调用请求(转)
- 多个服务运行在一个进程的问题,请教高手
- WCF并发(Concurrency)的本质:同一个服务实例上下文(InstanceContext)同时处理多个服务调用请求
- 重温WCF之构建一个简单的WCF(一)(1)通过控制台和IIS寄宿服务
- WCF 第七章 寄宿 在IIS7中寄宿服务
- WCF 寄宿于Windows服务 ,可能会报的错:在系统启动时至少有一个服务或驱动程序产生错误。详细信息,请使用事件查看器查看事件日志。
- 重温WCF之构建一个简单的WCF(一)(2)通过Windows Service寄宿服务和WCF中实现操作重载
- WCF并发(Concurrency)的本质:同一个服务实例上下文(InstanceContext)同时处理多个服务调用请求
- WCF 第七章 寄宿 定义服务和终结点地址
- WCF 第七章 寄宿 定义服务和终结点地址
- WCF 第一章 基础 为一个ASMX服务实现一个WCF客户端
- 一个通过JSONP跨域调用WCF REST服务的例子(以jQuery为例)
- 进程 vs 线程 :一个进程可以包含多个线程
- 一个通过JSONP跨域调用WCF REST服务的例子(以jQuery为例)