WCF进阶02 服务承载

时间:2022-09-01 09:09:45

    在上篇我介绍了如何对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激活组件:

WCF进阶02 服务承载

图中标记处选中处即是对非http激活组件的安装。

b.发布服务

可以单独新建一个WCF服务应用程序专门用来发布服务,此方法的好处可以单独将项目中的服务集中管理,便于服务的发布及部署:

WCF进阶02 服务承载

对于要发布的服务,新建一个WCF服务文件:

WCF进阶02 服务承载

在svc文件中不需要使用后台代码,将服务的所需的程序集进行引用后,svc文件注明指定服务:

WCF进阶02 服务承载

 

<%@ 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进阶02 服务承载

在发布成功后,可以在发布的文件夹中看到WCF发布必须的文件,配置文件、svc文件及bin文件夹下相关引用的程序集。

WCF进阶02 服务承载

 

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进阶02 服务承载

至此,wcf服务IIS部署完毕,通过IIS浏览可以看到熟悉的界面:

WCF进阶02 服务承载

另外,对于非http通信如net.tcp绑定的终结点可以进行如下的操作就可以实现WAS承载:

在虚拟目录的高级选项对话框中“已启用的协议”加上net.tcp,以逗号隔开各种协议即可。

WCF进阶02 服务承载

证明IIS7.0中的基于net.tcp的终结点服务已被承载其实可以通过浏览WSDL得知:

WCF进阶02 服务承载

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();
            }
           
        }
    }