Windows进程激活服务(WAS)是Vista和Windows Server 2008 自带的寄宿基础。先前的特性只在IIS中才有,比如进程激活,回收和身份标识管理,已经加入到WAS中而且支持所有的协议除了HTTP。
WAS允许你在一个不依赖HTTP协议的鲁棒环境中寄宿服务。HTTP协议被广泛部署和理解,但是有一些情况它并不是最好的选择。
例如,想象有一个为跟踪和分析的目的而接受一条单向消息的服务,消息由客户端发送并最终从网络中断开。为了提供在断开网络时的消息发送能力,需要一个队列结构。MSMQ协议将会完成这个,而HTTP协议将不会完成这个。或者,想象一个非常"不正式"的服务,很快发送一条大消息转换的很多小消息。对这种情况,TCP协议比HTTP协议高效因为它在发送多个消息时连接是保持连接的。在这两个例子中,WAS可以寄宿服务而IIS不能。
WAS通过监听器与具体进程管理功能抽象出去的一个监听器适配器架构来支持多种协议。通过在WAS和监听器之间定义一个接口,WAS可以不用引入额外的复杂性到系统中就可以支持多个监听器。这种方式,WAS可以使用一种一致的方法使用HTTP,TCP,MSMQ和命名管道通信,因而改变了系统可信赖性。图片7.1显示了WAS架构。
当IIS被安装时WAS被自动安装到Vista和Windows Server 2008,因为IIS依赖于WAS。当IIS被安装时,它在WAS上将w3svc注册为一个HTTP监听适配器。当.NET 3.5 被安装时,它在WAS注册TCP,MSMQ和命名管道监听适配器。不安装IIS也可以使用WAS。为了做这个,你必须开启两个Windows特性。首先,你必须向图片7.2显示的那样开启Windows进程激活管理服务。你在Windows中通过开始->控制面板->程序->打开/关闭Windows 特性可以得到下面的窗口。
图片7.2 开启Windows进程激活管理服务
其次,在WAS开启了后,你必须像图片7.3显示的那样检查WCF非HTTP激活。如果你想为WCF服务开启HTTP激活,你必须开始WCF HTTP激活组件,HTTP激活组件在开启需要的IIS7特性时会被自动开启。
图片7.3 开启WCF 非HTTP激活
在WAS中寄宿一个服务与在IIS中寄宿服务很类似,就如第一章描述的。你需要一个虚拟应用,一个SVC文件,在web.config文件的<system.serviceModel>部分有/没有入口。为了开启除了HTTP的协议,你需要完成两个额外的步骤。
首先,在WAS配置文件中的相关Web 站点中添加协议绑定信息。例如,使用TCP你需要配置一个特殊的端口。net.tcp的默认绑定信息是808:*, 意味着端口号是808而监听器使用通配符结构来监听。然后你需要更新虚拟应用来开启相关的协议。这些设置都在%windir\System32\inetsrv\config中的ApplicationHost.config文件中而且可以使用appcmd.exe实用工具来设置,appcmd.exe可以在%windir\System32\inetsrv\中找到。列表7.2显示了可以做这两个改变的命令。虚拟应用的名字是WASHosted在默认站点(Default Web Site)下定义。
列表7.2 为一个虚拟应用开启net.tcp
appcmd.exe set site "Default Web Site" +bindings.[protocol='net.tcp', bindingInformation='808:*']
appcmd.exe set app "Default Web Site/WASHosted" /enableProtocols:http, net.tcp
你可以添加一个协议,同样也可以移除一个协议。例如,如果如果你想为那个应用禁止HTTP协议,你可以从开启的协议列表中将HTTP协议移除,就如列表7.3显示的那样。
列表7.3 从一个虚拟应用禁止HTTP协议
appcmd.exe set app "Default Web Site/WASHosted" /enabledProtocols:net.tcp
其次,在web.config中开启任何WCF支持的传输绑定,包括TCP,MSMQ和命名管道。列表7.4显示了一个为TCP绑定配置的web.config文件。
列表7.4 WAS 宿主配置
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="EssentialWCF.StockService"> <endpoint address="" binding="netTcpBinding" contract="EssentialWCF.IStockService"/> </service> </services> </system.serviceModel> </configuration>