首页 > 代码库 > wcf 元数据交换

wcf 元数据交换

1. 什么是元数据

    WCF服务元数据是WCF服务的核心部分服务地址(Address)、绑定(通信协议Binding)、契约(服务、操作、数据Contract)的原始描述信息。那么暴露元数据的目的就很明确了,客户端要了解这些特性来与WCF服务进行通信。

2. 元数据发布

    1. 基于HTTP_GET的元数据

        在默认的情况下wcf是不会发布元数据的,但是我们可以在配置文件中配置来公开元数据:      

    <behaviors>      <serviceBehaviors>        <behavior name="commonService">          <serviceMetadata httpGetEnabled="true"/>        </behavior>      </serviceBehaviors>    </behaviors>

<service name="PciService.ImagePathService" behaviorConfiguration="commonService">

        默认情况下,为了使用HTTP_GET客户端的地址必须注册服务的HTTP基地址。如果宿主没有配置HTTP基地址装载服务就会抛出异常。

        如果启用的基于HTTP_GET的元数据交换,在浏览器中输入配置的地址就可以进行访问公开的元数据。

    以编程的方式启用元数据交换:

            using(ServiceHost host = new ServiceHost(typeof(ImagePathService)))            {                ServiceMetadataBehavior metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();                if (metadataBehavior == null)                {                    metadataBehavior = new ServiceMetadataBehavior();                    metadataBehavior.HttpGetEnabled = true;                    host.Description.Behaviors.Add(metadataBehavior);                }                host.Open();

    以编程的方式和使用配置文件的方式公开元数据的效果是一样。同样在浏览器中也能查看到公开的元数据。

   1。 要将行为添加到行为集合中。这个行为集合是宿主针对服务类型维持的,在ServiceHostBase中定义了Description属性

        //        // 摘要:        //     获取所承载服务的说明。        //        // 返回结果:        //     所承载服务的 System.ServiceModel.Description.ServiceDescription。        public ServiceDescription Description { get; }

          这个description就是对服务各个方面的描述,在ServiceDescription中定义了属性Behaviors属性:

        // 摘要:        //     获取与该服务关联的行为。        //        // 返回结果:        //     包含服务关联行为的类型为 System.ServiceModel.Description.IServiceBehavior 的 System.Collections.Generic.KeyedByTypeCollection<TItem>。        public KeyedByTypeCollection<IServiceBehavior> Behaviors { get; }
    public class KeyedByTypeCollection<TItem> : KeyedCollection<Type, TItem>    {        // 摘要:        //     返回集合中第一个具有指定类型的项。        //        // 类型参数:        //   T:        //     要在集合中查找的项的类型。        //        // 返回结果:        //     如果为引用类型,则返回类型 T 的对象;如果为值类型,则返回类型 T 的值。如果集合中不包含类型 T 的对象,则返回类型的默认值:如果是引用类型,默认值为        //     null;如果是值类型,默认值为 0。        [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]        public T Find<T>();    }

在宿主代码中使用了防御编程,首先在代码中调用KeyedByTypeCollection<T>方法中的find负责判断在配置文件中是否提供了MEX终结点的行为。如果返回的是null表示在配置文件中不包含元数据的行为。   

2. 元数据交换终结点

  

wcf 元数据交换