您的位置:首页 > 其它

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 在一个进程中的多个自我寄宿服务

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 在一个进程内设置多个自我寄宿服务的配置

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐