• WCF进阶02 服务承载


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

    image

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

    b.发布服务

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

    01

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

    image

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

    image

    <%@ 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调试浏览保证该服务能被正常访问,然后就可以进行发布了,可以使用:

    image

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

    image

    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>

    image

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

    image

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

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

    image

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

    image

    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();
                }
               
            }
        }
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    学会辨识「漏洞炒作」你就比别人强!
    Java 18 正式发布
    致敬Gif之父,使用Java生成Gif图片
    easyes的出现,江湖不再需要RestHighLevelClient
    机器学习科普摘录一
    RedMonk最新编程语言排行榜;Spring 框架现 RCE 漏洞……|叨资讯
    你该不会也觉得Dubbo参数回调中callbacks属性是用来限制回调次数的吧?
    甲骨文严查Java许可问题;黑客的多合一黑客工具|叨资讯
    Runtime Inline Cache
    Arthas之类操作
  • 原文地址:https://www.cnblogs.com/ecin/p/2081075.html
Copyright © 2020-2023  润新知