WCF进阶02 服务承载
2011-06-15 00:05 Ecin 阅读(655) 评论(1) 收藏 举报在上篇我介绍了如何对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();
}
}
}










浙公网安备 33010602011771号