在上篇我介绍了如何对WCF的服务端进行配置,使用服务之前,需要进行WCF服务的部署操作。有两种常见的方式可以对WCF服务进行承载,IIS承载与自承载。下文描述了如何进行IIS承载服务、服务自承载(自托管)。
1.IIS承载
可以在IIS6.0,IIS7.0中承载WCF服务,区别在于IIS6.0仅支持HTTP协议绑定的WCF服务承载。IIS对WCF服务的承载与部署Asp.net应用程序类似,WCF服务可以利用Asp.net共享宿主模型(HTTP协议),非HTTP协议(如.net.tcp通信协议)绑定可以利用IIS7.0中的WAS即Windows进程激活服务作为宿主承载服务。下面是详细的操作步骤:
a. 确保已激活WCF http激活组件及非http激活组件
http激活组件的激活可以使用命令行ServiceModelReg.exe -i激活,也可以用类似安装IIS的方式安装http激活组件:
图中标记处选中处即是对非http激活组件的安装。
b.发布服务
可以单独新建一个WCF服务应用程序专门用来发布服务,此方法的好处可以单独将项目中的服务集中管理,便于服务的发布及部署:
对于要发布的服务,新建一个WCF服务文件:
在svc文件中不需要使用后台代码,将服务的所需的程序集进行引用后,svc文件注明指定服务:
<%@ ServiceHost Language="C#" Debug="true" Service="ServiceContractImpl.Person.ContactService" %>
接下来,对Web.config进行WCF服务配置:
<system.serviceModel> <services> <service name="ServiceContractImpl.Person.ContactService" behaviorConfiguration="ContactServiceBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8732/AdventureWorks/Person/ContactService/"/> <add baseAddress="net.tcp://localhost:9000/AdventureWorks/Person/ContactService"/> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding" contract="ServiceContractDomain.Person.IContactServie"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <endpoint address="" binding="netTcpBinding" contract="ServiceContractDomain.Person.IContactServie"/> <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/> </service> <service name="WcfServiceLib.TestService" behaviorConfiguration="ContactServiceBehavior"> <host> <baseAddresses> <add baseAddress="http://localhost:8732/TestService/"/> <add baseAddress="net.tcp://localhost:9000/TestService/"/> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding" contract="WcfServiceLib.ITestService"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <endpoint address="" binding="netTcpBinding" contract="WcfServiceLib.ITestService"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="netTcpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="ContactServiceBehavior"> <!-- 为避免泄漏元数据信息, 请在部署前将以下值设置为 false 并删除上面的元数据终结点 --> <serviceMetadata httpGetEnabled="True" /> <!-- 要接收故障异常详细信息以进行调试, 请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息--> <serviceDebug includeExceptionDetailInFaults="True"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>
使用vs调试浏览保证该服务能被正常访问,然后就可以进行发布了,可以使用:
在发布成功后,可以在发布的文件夹中看到WCF发布必须的文件,配置文件、svc文件及bin文件夹下相关引用的程序集。
c.IIS部署发布的WCF服务
跟部署Asp.net应用程序一样,可以新建一个虚拟目录,指定发布WCF服务文件的路径,这里需要注意,我们需要选择的应用程序池是基于Asp.net 4.0的,因为我选择的.net版本为4.0,其他版本可以作相应调整(完全跟部署Asp.net 4.0程序相同):
<system.web> <compilation debug="true" targetFramework="4.0" /> </system.web>
至此,wcf服务IIS部署完毕,通过IIS浏览可以看到熟悉的界面:
另外,对于非http通信如net.tcp绑定的终结点可以进行如下的操作就可以实现WAS承载:
在虚拟目录的高级选项对话框中“已启用的协议”加上net.tcp,以逗号隔开各种协议即可。
证明IIS7.0中的基于net.tcp的终结点服务已被承载其实可以通过浏览WSDL得知:
3.服务自承载
可以通过应用程序托管的形式实现WCF服务的自承载,例如控制台应用程序,Windows服务等。
承载时可以使用编码方式实现服务托管:
class Program { static void Main(string[] args) { Console.WriteLine("Servcie Starting...."); using (ServiceHost host = new ServiceHost(typeof(ServiceContractImpl.Person.ContactService))) { host.AddServiceEndpoint(typeof(ServiceContractDomain.Person.IContactServie), new NetTcpBinding(), "net.tcp://localhost:8003/AdventureWorks/Person/ContactService"); host.AddServiceEndpoint(typeof(ServiceContractDomain.Person.IContactServie), new BasicHttpBinding(), "http://127.0.0.1:8003/ServiceContractImpl/Person/ContactService"); host.Open(); Console.WriteLine("Press <ENTER> to terminate client once the output is displayed."); Console.ReadLine(); } } }