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. 元数据交换终结点

时间: 2024-10-06 11:07:50

wcf 元数据交换的相关文章

WCF分布式开发步步为赢(3)WCF服务元数据交换、配置及编程开发

今天我们继续WCF分布式开发步步为赢(3)WCF服务元数据交换.配置及编程开发的学习.经过前面两节的学习,我们了解WCF分布式开发的相关的基本的概念和自定义宿主托管服务的完整的开发和配置过程.今天我们来详细学习WCF服务元数据交换的相关内容.WCF服务元数据究竟是什么?为什么WCF服务要暴露元数据交换节点?这些和以前的Web Service有什么关系?WCF服务元数据交换的方式有那些?我们如何实现WCF服务元数据交换,本节我们会详细讲解.全文结构如下:[1]WCF服务元数据的基本概念.[2]WC

[老老实实学WCF] 第六篇 元数据交换

原文:[老老实实学WCF] 第六篇 元数据交换 老老实实学WCF 第六篇 元数据交换 通过前两篇的学习,我们了解了WCF通信的一些基本原理,我们知道,WCF服务端和客户端通过共享元数据(包括服务协定.服务器终结点信息)在两个终结点上建立通道从而进行通信.我们通过手写代码(或配置)的方式为服务端编写了元数据信息,没有借助元数据交换就实现了通信.然而在实际应用中,元数据往往是很多的,而且重复编写元数据的工作也是不值得的,因此必然会用到元数据交换的方式让客户端获取元数据,本篇我们就来进一步了解一下元数

元数据交换绑定的秘密

WCF提供了一种特殊的终结点——元数据交换终结点(MEX终结点),通过它,服务就能够发布元数据.此外,它专门提供了一个元数据交换的服务契约接口IMetadataExchange: [ServiceContract]public interface IMetadataExchange{    [OperationContract]    Message Get(Message request);} 既然要配置终结点,就必须有对应的绑定来支持.MEX终结点可以支持多种不同的传输协议,包括HTTP(S

WCF初探-4:WCF消息交换模式之请求与答复模式

1.请求与答复模式( Request/Reply) 这种交换模式是使用最多的一中,它有如下特征: 调用服务方法后需要等待服务的消息返回,即便该方法返回 void 类型 相比Duplex来讲,这种模式强调的是客户端的被动接受,也就是说客户端接受到响应后,消息交换就结束了. 在这种模式下,服务端永远是服务端,客户端就是客户端,职责分明. 它是缺省的消息交换模式,设置OperationContract便可以设置为此种消息交换模式 接下来我们通过实例来演示一下,参照WCF消息交换模式之单向模式中的例子,

WCF初探-5:WCF消息交换模式之双工通讯(Duplex)

双工通讯Duplex具有以下特点: 1它可以在处理完请求之后,通过请求客户端中的回调进行响应操作 2.消息交换过程中,服务端和客户端角色会发生调换 3.服务端处理完请求后,返回给客户端的不是reply,而是callback请求. 4.Duplex模式对Bindding有特殊的要求,它要求支持Duplex MEP(Message Exchange Pattern),如WSDualHttpBinding和NetTcpBinding 注意:在WCF预定义绑定类型中,WSDualHttpBinding和

WCF初探-3:WCF消息交换模式之单向模式

1.单向模式(One-Way Calls): 在这种交换模式中,存在着如下的特征: 只有客户端发起请求,服务端并不会对请求进行回复 不能包含ref或者out类型的参数 没有返回值,返回类型只能为void 通过设置OperationContract的IsOneWay=True可以将满足要求的方法设置为这种消息交换模式 接 下来,我们通过实例来演示这种模式,首先新建一个WcfDemo1的解决方案,添加名称为Service的类库项目作为服务端,新建IOneWay接口和 OneWay类,由于单向模式中服

WCF消息交换模式之请求-响应模式

WCF的消息交换模式(MEP)有三种:请求/响应.单向模式和双工模式.WCF的默认MEP是请求/响应模式. 请求/响应模式操作签名代码如下,无需指定模式,默认就是. [OperationContractAttribute] string Hello(string greeting,string mesg); [OperationContractAttribute] void SaveMesg(string mesg); 请求/响应模式内容: 客户端可以传递一个或多个参数给服务操作方法,服务操作方

WCF之服务元数据

服务元数据是用来获得服务的EndPoint的信息,也就是它的ABC. 服务有两种方案可以发布自己的元数据. 一种是基于HTTP-GET协议提供元数据: 一种是元数据交换方式,它往往使用一个专门的终结点,称之为元数据交换终结点.元数据交换终结点与其它终结点相似,仍然包含了地址.绑定与契约,但是使用的服务契约为WCF提供的接口ImetadataExchange.实际上是使用了两种协议: 前者为HTTP/GET请求,后者为WS-MetadataExchange(MEX). 以MetadataExcha

C# WCF发布服务的元数据的方式

发布服务元数据的方式有两种:一是基于HTTP-GET协议提供元数据,它是一种绝大多数平台都能支持的简单text-based协议:另一种是元数据交换终结点. 1.基于HTTP-GET协议 <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="HelloW