WCF初探-9:WCF服务承载 (下)

WCF初探-8:WCF服务承载 (上)中,我们对宿主的概念、环境、特点做了文字性的介绍和概括,接下来我们将通过实例对这几种寄宿方式进行介绍。为了更好的说明各寄宿环境特点,本实例采用Http和net.tcp两种服务通讯方式,同时寄宿在不同的宿主中。程序结构如下:

服务契约的接口和实现代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace Service
{
    [ServiceContract]
    public interface IServiceCalculator
    {
        [OperationContract]
        double Add(double n1, double n2);
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace Service
{
    [ServiceContract]
    public interface IServiceMessage
    {
        [OperationContract]
        string ReturnMessage();
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Service
{
    public class ServiceCalculator:IServiceCalculator
    {
        public double Add(double n1, double n2)
        {
            return n1 + n2;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Service
{
    public class ServiceMessage:IServiceMessage
    {
        public string ReturnMessage()
        {
            return "调用服务计算结果如下";
        }
    }
}

IIS 中承载 WCF 服务和WAS 中承载 WCF 服务

  1. 完成IISHost代码
  • 引用Service程序集
  • 添加ServiceCalculator.svc新文件,代码如下
<%@ ServiceHost Language="C#" Debug="true"  Service="Service.ServiceCalculator" %>
  • 添加ServiceCalculator.svc新文件,代码如下
<%@ ServiceHost Language="C#" Debug="true" Service="Service.ServiceMessage" %>

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
      <services>
        <service name="Service.ServiceMessage" behaviorConfiguration="mexBehavior">
          <endpoint address="" binding="wsHttpBinding" contract="Service.IServiceMessage" />
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>

        <service name="Service.ServiceCalculator" behaviorConfiguration="mexBehavior">
          <endpoint address="" binding="netTcpBinding" bindingConfiguration="PortSharingBinding" contract="Service.IServiceCalculator" />
          <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
        </service>
      </services>

      <bindings>
        <netTcpBinding>
          <binding name="PortSharingBinding" portSharingEnabled="true">
            <security mode="None" />
          </binding>
        </netTcpBinding>
      </bindings>

      <behaviors>
          <serviceBehaviors>
              <behavior name="mexBehavior">
                  <serviceMetadata httpGetEnabled="true" />
                  <serviceDebug includeExceptionDetailInFaults="false" />
              </behavior>
          </serviceBehaviors>
      </behaviors>

    </system.serviceModel>
</configuration>

  2.  寄宿服务

  • 生成IISHost程序,将bin文件目录、ServiceCalculator.svc、ServiceMessage.svc、Web.config拷贝到新建的WCFHost文件夹中
  • 新建网站配置该程序以便承载服务。
  • 点击IIS菜单的应用程序池,找到WCFHost程序池,将.net framework版本设置为v4.0,托管管道模式设置为集成
  • 在浏览器中输入http://localhost:1234/ServiceMessage.svc可以看到服务发布成功
  • 在浏览器中输入http://localhost:1234/ServiceCalculator.svc可以看到服务寄宿失败

  这是因为ServiceCalculator.svc启用的是net.tcp通讯,而在IIS中启用net.tcp通讯就必须依靠Windows 进程激活服务(也称为 WAS)

  • 要使用WAS寄宿程序,就需要配置几个地方

    在控制面板->程序和功能->打开或关闭windows功能勾选以下几个功能,安装WCF 激活组件

        

    配置承载服务的WCFHost网站,添加net.tcp通讯。

    

    点击网站的高级设置,在已启用的协议后追加net.tcp协议

    

  3. 客户端验证服务

  • 启动Visual Studio 命令提示(2010)命令行工具,输入wcftestclient命令调用WCF服务测试客户端

在托管应用程序中承载 WCF 服务

  1. 完成AppHost代码

  • 添加对service程序集的引用,配置文件App.config代码如下

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Service.ServiceMessage" behaviorConfiguration="mexBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:2234/ServiceMessage/"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" contract="Service.IServiceMessage" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>

      <service name="Service.ServiceCalculator" behaviorConfiguration="mexBehavior">
        <host>
            <baseAddresses>
              <add baseAddress="http://localhost:1235/ServiceCalculator/"/>
              <add baseAddress="net.tcp://localhost:1234/ServiceCalculator"/>
            </baseAddresses>
          </host>
         <endpoint address="" binding="netTcpBinding" bindingConfiguration="PortSharingBinding" contract="Service.IServiceCalculator" >
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <bindings>
      <netTcpBinding>
        <binding name="PortSharingBinding" portSharingEnabled="true" >
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="mexBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>
</configuration>

  • Program.cs代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Service;
using System.ServiceModel;

namespace AppHost
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                ServiceHost MessageHost = new ServiceHost(typeof(ServiceMessage));
                ServiceHost CalculatorHost = new ServiceHost(typeof(ServiceCalculator));

                MessageHost.Open();
                CalculatorHost.Open();
                Console.WriteLine("服务已经启动。。。");
                Console.ReadLine();
                MessageHost.Close();
                CalculatorHost.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.Read();
            }

        }
    }
}

  2.  寄宿服务

  • 生成AppHost工程,找到bin目录下的AppHost.exe,点击运行,查看到服务寄宿成功

  3.  客户端验证服务

  • 启动Visual Studio 命令提示(2010)命令行工具,输入wcftestclient命令调用WCF服务测试客户端。分别添加服务地址:

    http://localhost:2234/ServiceMessage/

    http://localhost:1235/ServiceCalculator/

  

在托管 Windows 服务中承载 WCF 服务  

  1. 完成NTHost代码
  • 添加windows服务程序services1.cs,在设计界面上单击右键添加安装程序ProjectInstaller.cs,在ProjectInstaller.cs设计界面上有serviceProcessInstaller1和serviceInstaller1两个安装组件,分别设置他们的属性
  • 添加配置文件App.config代码,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Service.ServiceMessage" behaviorConfiguration="mexBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:2234/ServiceMessage/"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" contract="Service.IServiceMessage" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>

      <service name="Service.ServiceCalculator" behaviorConfiguration="mexBehavior">
        <host>
            <baseAddresses>
              <add baseAddress="http://localhost:1235/ServiceCalculator/"/>
              <add baseAddress="net.tcp://localhost:1234/ServiceCalculator"/>
            </baseAddresses>
          </host>
         <endpoint address="" binding="netTcpBinding" bindingConfiguration="PortSharingBinding" contract="Service.IServiceCalculator" >
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <bindings>
      <netTcpBinding>
        <binding name="PortSharingBinding" portSharingEnabled="true" >
          <security mode="None" />
        </binding>
      </netTcpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="mexBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>
</configuration>

  • Service1.cs代码如下:

using System.ServiceProcess;
using Service;
using System.ServiceModel;

namespace NTHost
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        ServiceHost MessageHost = null;
        ServiceHost CalculatorHost = null;

        protected override void OnStart(string[] args)
        {
            MessageHost = new ServiceHost(typeof(ServiceMessage));
            CalculatorHost = new ServiceHost(typeof(ServiceCalculator));

            MessageHost.Open();
            CalculatorHost.Open();
        }

        protected override void OnStop()
        {
            MessageHost.Close();
            CalculatorHost.Close();

            MessageHost = null;
            CalculatorHost = null;
        }
    }
}

  2.  寄宿服务

  • 生成NTHost工程,安装windows服务程序NTHost.exe,在命令行中输入

  Cd C:\Windows\Microsoft.NET\Framework\v4.0.30319,回车后输入installutil.exe 程序生成的bin目录绝对地址\NTHost.exe –i,回车后安装服务程序,程序注册成功后启动服务。

在开始菜单输入services.msc命令,打开服务管理程序将NTServiceHost服务设置为启动

  

  3.  客户端验证服务

  •  启动Visual Studio 命令提示(2010)命令行工具,输入wcftestclient命令调用WCF服务测试客户端。分别添加服务地址:

    http://localhost:2234/ServiceMessage/

    http://localhost:1235/ServiceCalculator/

  

  

时间: 2024-12-18 19:02:22

WCF初探-9:WCF服务承载 (下)的相关文章

WCF服务承载 (转载)

我们对宿主的概念.环境.特点做了文字性的介绍和概括,接下来我们将通过实例对这几种寄宿方式进行介绍.为了更好的说明各寄宿环境特点,本实例采用Http和net.tcp两种服务通讯方式,同时寄宿在不同的宿主中.程序结构如下: 服务契约的接口和实现代码如下: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;namespace Servic

WCF初探-13:WCF客户端为双工服务创建回调对象

前言: 在WCF初探-5:WCF消息交换模式之双工通讯(Duplex)博文中,我讲解了双工通信服务的一个应用场景,即订阅和发布模式,这一篇,我将通过一个消息发送的例子讲解一下WCF客户端如何为双工服务创建回调对象. 双工服务指定一个回调协定,客户端应用程序必须实现该协定以便提供一个该服务能够根据协定要求调用的回调对象.虽然回调对象不是完整的服务(例如,您无法使用回调对象启动一个通道),但是为了实现和配置,这些回调对象可以被视为一种服务. 双工服务的客户端必须: 实现一个回调协定类. 创建回调协定

WCF初探-10:WCF客户端调用服务

创建WCF 服务客户端应用程序需要执行下列步骤: 获取服务终结点的服务协定.绑定以及地址信息 使用该信息创建 WCF 客户端 调用操作 关闭该 WCF 客户端对象 WCF客户端调用服务存在以下特点: 服务和客户端使用托管属性.接口和方法对协定进行建模. 若要连接客户端应用程序中的服务,则需要获取该服务协定的类型信息.通常,我们使用Svcutil.exe(ServiceModel Metadata Utility Tool)来完成,也可以直接在客户端项目上引用服务地址完成.它们会从服务中下载元数据

WCF初探-11:WCF客户端异步调用服务

前言: 在上一篇WCF初探-10:WCF客户端调用服务 中,我详细介绍了WCF客户端调用服务的方法,但是,这些操作都是同步进行的.有时我们需要长时间处理应用程序并得到返回结果,但又不想影响程序后面代码部分的执行,这时我们就需要考虑使用异步的方式来调用服务.注意这里的异步是完全针对客户端而言的,与WCF服务契约的方法是否异步无关,也就是在不改变操作契约的情况下,我们可以用同步或者异步的方式调用WCF服务. WCF客户端异步调用服务方式: 通过代理类异步调用服务.就需要通过使用事件驱动的异步调用模型

WCF初探-14:WCF服务协定

前言: 在前面的文章中,我们定义的服务协定上都会有一个ServiceContract的特性来修饰,这是因为服务契约的实现要靠ServiceContractAttribute 属性定义,然后使用一个或多个类(或接口)方法中的 OperationContractAttribute 属性定义协定的服务操作. 实现服务协定后并将其与WCF 绑定和 EndpointAddress 对象一起使用时,此服务协定将公开以供客户端使用. 公开的信息由 ServiceContractAttribute 表示,其接口

Windows服务承载WCF

Source文件 ------------------------- 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using System.ComponentModel; 7 using System.ServiceModel; 8 using System.ServiceProcess; 9 using System.Configuration

WCF初探-15:WCF操作协定

前言: 在前面的文章中,我们定义服务协定时,在它的操作方法上都会加上OperationContract特性,此特性属于OperationContractAttribute 类,将OperationContract应用于方法,以指示该方法实现作为服务协定(由 ServiceContractAttribute 属性指定)一部分的服务操作.OperationContractAttribute 属性声明方法是服务协定中的操作. 只有具有 OperationContractAttribute 属性的方法可

WCF初探-26:WCF中的会话

理解WCF中的会话机制 在WCF应用程序中,会话将一组消息相互关联,从而形成对话.会话”是在两个终结点之间发送的所有消息的一种相互关系.当某个服务协定指定它需要会话时,该协定会指定所有调用(即,支持调用的基础消息交换)必须是同一对话的一部分.如果某个协定指定它允许使用会话但不要求使用会话,则客户端可以进行连接,并选择建立会话或不建立会话.如果会话结束,然后在同一个通道上发送消息,将会引发异常. WCF中的会话机制通过设置服务协定(ServiceContract)上的SessionMode的枚举值

WCF初探-22:WCF中使用Message类(上)

前言 从我们学习WCF以来,就一直强调WCF是基于消息的通信机制.但是由于WCF给我们做了高级封装,以至于我们在使用WCF的时候很少了解到消息的内部机制.由于WCF的架构的可扩展性,针对一些特殊情况,WCF为我们提供了Message类来深度定制消息结构,以便我们拓展WCF的通信机制. 在之前的文章中,我们针对一些常用的WCF传递数据的方式进行了说明,比如数据协定和消息协定等.他们传递的数据最终都会转化为消息的实例.具体参照:        WCF初探-16:WCF数据协定之基础知识