[WCF]使用Visual Studio配置发布服务元数据

      在WCF中,一个客户端应用程序要使用一个已经部署好的WCF服务,它就必须知道几个关于这个服务的数据,称之为服务的元数据。这些元数据包括:1)服务契约的元数据;2)服务的访问地址;3)服务访问方式的配置。在上一篇文章的操作示例中,我使用直接复制代码的方式,把服务契约的元数据公开给客户应用程序,访问地址使用硬编码的方式在客户应用程序代码中编写;服务的访问方式使用标准绑定中的BasicHttpBindng,同样是在客户应用程序中硬编码确定。

 
      综上所说,在上一个操作示例中,我公开服务元数据的方式之所以有效是因为我同时开发服务和客户应用程序。但是在真正的系统开发中,大部分情况里,服务开发商跟客户应用程序开发商是不相同的,团队不一样,甚至开发所使用的技术也不一样。今天我所讲述的主要内容是使用Visual Studio里面的添加服务引用功能来获取服务的元数据,这种方式对于服务开发团队,客户应用开发团队都使用Visual Studio非常有效率。
 
      开始我今天的操作示例,首先编写一个服务契约。在Visual Studio 2008中新建一个解决方案,首个项目选择WCF Service Library。命名为WCFStudy8。创建项目后删除自带的App.config,IService.cs,Service.cs文件。添加接口代码文件ICalculationService.cs,其内容如下:
代码
using System;
 using System.ServiceModel;
 namespace WCFStudy8
{
  [ServiceContract(Namespace="http://www.WCFStudy8.net/2009/08/06")]
   public interface ICalculationService
  {
    [OperationContract]
     int Sum(params int[] numbers);
  }
}
建立了服务契约之后,添加实现该契约的服务,类代码文件CalculationService.cs,其内容如下:
代码
using System;
namespace WCFStudy8
{
  public class CalculationService : ICalculationService
  {
    #region ICalculationService Members
    public int Sum(params int[] numbers)
    {
      int result = 0;
      foreach (int n in numbers)
      {
         result += n;
      }
      return result;
    }
#endregion
  }
}
  新建一个项目,该项目用于寄存这个WCF服务,简单起见,我选择Windows控制台程序项目,命名为Host。(使用比较复杂的应用程序寄存服务的细节,在以后会讲述)
在Host项目的Program.cs文件中编写以下代码:
代码
using System;
 using System.ServiceModel;
 namespace Host
{
  class Program
  {
    static void Main(string[] args)
    {
      using(ServiceHost host = new ServiceHost(typeof(WCFStudy8.CalculationService)))
        {
       host.Open();
       Console.WriteLine("Host is on the run,press any key to close it.");
       Console.ReadLine();
       }
     }
   }
}

然后,为Host项目添加一个应用程序配置文件App.config,在这个文件中,我会配置服务的部署数据,并且使用WCF Configration配置软件来编辑配置。值的一说的是,这个配置软件对于学习如何配置WCF比较有用,但使用这个软件所做的配置,完全是由理由手动输入到配置文件中的(只要往后对WCF的配置够熟悉)。因此,我不打算详细地讲述这个软件的使用。以下图片展示怎样启动该软件。

  这个软件同样可以在.NET Framework SDKs的文件夹中找到,随.NET 3.0一起安装,在我的计算机中的位置是:C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\SvcConfigEditor.exe
对App.config打开该软件后,进入界面如下,选择Create a New Service...,将会引导创建服务:
选择创建新服务后,要求选择新服务实现的服务契约,通过点击Browser按钮,找到ICalculationService所在的程序集,并选择之:
选择好服务实现的服务契约之后,软件要求你选择服务使用的协议类型,这里我选择Http协议,当然其实这个协议只是一个公开端点的使用的协议,千万不要以为这个协议代表服务,协议只是对应于端点,而不是服务,而且我选择基本Http协议:
选择好端点协议之后,软件要求你为端点输入一个地址,它给你的默认文本是“http://”如果你打算在这后面添加地址,那么个端点的地址将会是一个绝对地址。而好的习惯是为服务设置基地址,让端点使用相对地址,这样在修改域名的时候只需要修改服务基地址,而不需要逐个端点地址修改。我为端点设置地址为“Calculation”:
  设置好端点地址之后,创建服务的流程就结束了,但这不意味着配置服务部署结束了。接下来就进入服务部署的配置,同样是使用该软件 
刚开始的时候,在刚才创建服务过程中创建的端点只有地址,没有名字,我使用软件给了它一个名字,不过跟地址相同(当然这个完全不是必要的),端点名字的设置也会反映到整个服务的元数据中。
  现在,我需要为这个服务添加一个服务端行为,什么是服务端行为,在往后讲述,现在你可以先把它理解作属于这个服务特有的功能。
选择软件界面中的节点路径:Advanced -> Service Behaviors ,然后在右边的界面中点击 New Service Behavior Configration...
进入编辑界面,我为这个新增服务端行为 设置名字叫metaBehavior,并为它添加一个serviceMetadata元素:
配置完服务端行为,点击这个新增行为的serviceMetadata元素,设置HttpGetEnabled属性为true,设置了这个属性,才能通过http协议的连接访问行为的这个元素。
 
  终于来到了最后一步,配置获取元数据的服务端点,这里先解释一下。这个获取元数据的端点,就是将会被Visual Studio添加服务引用功能使用的端点,通过这个端点,客户应用程序开发者可以获取服务相关的所有元数据。包括我在文章开篇所提到的三个服务元数据。这个端点之所以可以向客户提供元数据,全因为我刚才设置的服务端行为,更精确地说,是因为serviceMetadata元素。目前为止,读者只需要了解到这个成都。
选择节点 Services -> Endpoints ,右击创建新端点。端点名字我改为mex,地址也设置为mex,公开的服务契约为IMetadataExchange,这个契约定义在System.ServiceModel.dll程序集中,同时我为这个端点选择绑定为mexHttpBinding,所有设置如下图:
到了现在,作最后一个配置,就是为这个服务设置它的服务端行为,很明显这个行为就是我刚才增加的行为:
     
  好了,到了现在我们已经设置了所有服务部署的配置。看似很麻烦,很费时间,其实只要熟练了,一下子就可以配置好了。
配置完成之后保存一下,然后回到Visual Studio 2008的界面,会提示有文件在外部被修改,是否反映修改的部分,当然选择 Yes to all了。
至此,我们已经配置了服务,现在看一下App.config文件的变化,以下是其内容:
代码
<?xml version="1.0" encoding="utf-8" ?>
 <configuration>
  <system.serviceModel>
  <behaviors>
  <serviceBehaviors>
  <behavior name="metaBehavior">
  <serviceMetadata httpGetEnabled="true" />
  </behavior>
  </serviceBehaviors>
  </behaviors>
  <services>
  <service name="WCFStudy8.CalculationService">
<endpoint address="Calculation" binding="basicHttpBinding" bindingConfiguration=""
name="Calculation" contract="WCFStudy8.ICalculationService" />
<endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
name="mex" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
</configuration>
     这个配置文件中的内容会在服务宿主进程启动时被加载,并用于初始化服务,也就是说,通过配置文件,开发人员不需要在程序编码中设置服务宿主的各个属性(当然要设置也是可以的)。配置文件中的属性,往后在讲到相关内容时会讲述。可以看出,已经反映了我刚才在软件中的配置。目前,还需要的就是客户应用获取元数据。我将在下一篇文章中继续这个内容。
posted @ 2010-05-09 19:24  DOF_KL  阅读(2562)  评论(2编辑  收藏  举报