码迷,mamicode.com
首页 > 其他好文 > 详细

wcf 元数据交换

时间:2014-10-22 19:46:56      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   io   os   ar   使用   

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的元数据交换,在浏览器中输入配置的地址就可以进行访问公开的元数据。

bubuko.com,布布扣

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

            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 元数据交换

标签:des   style   blog   http   color   io   os   ar   使用   

原文地址:http://www.cnblogs.com/someoneHan/p/4043854.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!