WAS 是 Windows (Process) Activation Service 的缩写,是Windows Vista中所新增的一种进程宿主模型。WAS作为 IIS7.0 特有的新增功能,和以前IIS 6.0的功能相比更加强大,因为它提供并支持除HTTP之外的更多协议,比如TCP方式和Pipe(管道)方式。以下的文中,都把Windows (Process) Activation Service简称为WAS。利用WAS作为WCF(Windows Communication Foundation)的宿主,我们能充分利用WAS的很多优点,因为我们再也不用为非HTTP方式的WCF Service单独编写宿主程序了。而WAS本身的特点,也让我们的服务端程序能享受到只有以往的HTTP方式的WCF Service才能拥有的很多特性。本文也简单向大家分享一下怎样使用WAS来作为WCF Service的宿主。
以往的部署WCF Service的方式,大家一般会想到以下几种:
1. 使用WinForm或者控制台程序作为宿主
2. 使用Windows Service作为宿主
不管我们用怎样的方式来作为WCF Service的宿主,少不了的麻烦,都是需要单独编写Host程序,除此之外,就该轮到WAS了。WAS在Vista中,其实是由一个单独的Windows Service来实现的,如果我们仔细找找,就能找到,Windows Service的名称,就叫做”Windows Process Activation Service”。由此看来,WAS的进程和IIS进程在物理上是隔离开的,能为我们提供一个灵活、稳定的WCF Service宿主环境。WAS内部的工作机制,大致和ASMX WebService类似。
简单了解了WAS的特性,下面我们用一个netTcpBinding的WCF示例来演示怎样利用WAS来Host WCF Service:
首先,我们需要查看Vista的组件中,是否打开了WAS的功能,打开控制面板,打开“程序和功能”对话框,在”打开/关闭 Windows功能”对话框中,确保下面图中的功能项被打开:
其实在这一部操作之后,windows会自动帮我们在IIS中做好配置,不过为了放心,我们还是打开IIS确认一下设置是否正确。
首先是检查IIS站点中的绑定:
确保net.tcp方式,绑定到808端口
打开站点的高级设置,确认”已启用的协议”中,填有”net.tcp”,没有的话,可以补上。
然后是建立应用程序目录,这个目录等下会用来部署WCF的Service端程序。建立好目录后,也在”高级设置–已启用的协议”中,填上net.tcp
到这里,基本的host环境我们已经设置好了。下面来实现我们的服务端和客户端。
建立Contract [code] [ServiceContract] public interface IService1 { [OperationContract] string SayHello(string value); } [/code]
实现简单的Service类 [code] public class Service1 : IService1 { public string SayHello(string value) { return string.Format(“Hello,{0}”, value); } } [/code]
建立svc文件 [code] <%@ ServiceHost Language=”C#” Debug=”true” Service=”WCFLibrary.Service1” CodeBehind=”./App_Data/Service1.cs” %> [/code]
服务端的WCF配置 [code]
[/code]
其实endpoint只需要一个即可,为了方便通过svcutil.exe生成客户端代理,需要通过另外一个endpoint的mexTcpBinding来暴露元数据。这样当服务在发布好的时候,我们可以通过 Svcutil.exe net.tcp://Timothy-T61/WCFService/HelloService.svc/mex 来生成客户端代理了。
完成服务端的编写,直接将服务端程序,部署到刚才在IIS中添加的应用程序目录中。
客户端的wcf配置如下: [code]
[/code]
客户端拖放一个按钮,添加如下代码: [code] private void button1_Click(object sender, EventArgs e) { ClientProxy client = new ClientProxy(); MessageBox.Show(client.SayHello(“Timothy!”)); } [/code]
一切就绪,运行程序,点击按钮:
没有单独编写host程序,通过WAS,我们的服务端正常运行了。