Host WCF Service in WAS
2008-12-11 11:35 Timothy Ye 阅读(386) 评论(0) 编辑 收藏 举报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
程序代码
[ServiceContract]
public interface IService1
{
[OperationContract]
string SayHello(string value);
}
实现简单的Service类
程序代码
public class Service1 : IService1
{
public string SayHello(string value)
{
return string.Format("Hello,{0}", value);
}
}
建立svc文件
程序代码
<%@ ServiceHost Language="C#" Debug="true" Service="WCFLibrary.Service1" CodeBehind="./App_Data/Service1.cs" %>
服务端的WCF配置
程序代码
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<services>
<service behaviorConfiguration="WCFLibrary.Service1Behavior" name="WCFLibrary.Service1">
<endpoint binding="netTcpBinding"
bindingConfiguration="NetTcpBinding" contract="WCFLibrary.IService1">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint contract="IMetadataExchange" binding="mexTcpBinding" address="mex" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://Timothy-T61/WCFService/HelloService.svc" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WCFLibrary.Service1Behavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
其实endpoint只需要一个即可,为了方便通过svcutil.exe生成客户端代理,需要通过另外一个endpoint的mexTcpBinding来暴露元数据。这样当服务在发布好的时候,我们可以通过
Svcutil.exe net.tcp://Timothy-T61/WCFService/HelloService.svc/mex 来生成客户端代理了。
完成服务端的编写,直接将服务端程序,部署到刚才在IIS中添加的应用程序目录中。
客户端的wcf配置如下:
程序代码
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="ClientBinding">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://timothy-t61/WCFService/HelloService.svc" binding="netTcpBinding"
bindingConfiguration="ClientBinding" contract="WCFLibrary.IService1" />
</client>
</system.serviceModel>
客户端拖放一个按钮,添加如下代码:
程序代码
private void button1_Click(object sender, EventArgs e)
{
ClientProxy client = new ClientProxy();
MessageBox.Show(client.SayHello("Timothy!"));
}
一切就绪,运行程序,点击按钮:
没有单独编写host程序,通过WAS,我们的服务端正常运行了。