WCF服务编程(6)——基于HTTP-GET的元数据交换



一、引言

WCF中发布服务的元数据具有两种方式:一种是基于HTTP-GET协议提供元数据,它是一种绝大多数平台都能支持的简单的text-based协议;另一种是使用专门的终结点的方式提供元数据

二、基于HTTP-GET的元数据交换

2.1 以管理的方式启用元数据交换

在配置文件中启用元数据交换,应该在服务的behavior配置节中支持基于HTTP-GET协议发布元数据,如下所示,红色字体部分,设置httpGetEnabled为true。

 <system.serviceModel>

        <behaviors>

            <serviceBehaviors>

                <behavior name="">

                    <serviceMetadata httpGetEnabled="true"/>

                    <serviceDebug includeExceptionDetailInFaults="false" />

                </behavior>

                <behavior name="MEXGET">

                    <serviceMetadata httpGetEnabled="true" httpGetUrl="MyMEXAddress"/>

                </behavior>

            </serviceBehaviors>

        </behaviors>

      <protocolMapping>

        <add scheme="http" binding="wsHttpBinding"/>

      </protocolMapping>

</system.serviceModel>

默认情况下,访问元数据的url即为我们配置的基地址,如果需要为元数据指定专有的uri,可参照上面配置中的第二个behavior ,配置httpGetUrl。元数据启用成功后,在浏览器中可通过配置的url进行访问,如果启用成功,就会得到一个类似如下的确认界面:

图片1.png 

2.2 以代码的方式启用元数据交换

 以编程方式启用基于HTTP-GET的交换,首先要将行为添加到集合中。该行为集合是宿主针对服务类型而维持的。ServiceHost类具有一个Description的属性,它是对服务各方面行为的描述。它里面定义了类型为KeyedByTypeColloection<IServiceBehavior>的属性Behaviors,它可以简单理解为是一系列IServiceBehavior接口类型和对象组成键值对,通过它的Find<IServiceBehavior>方法可以找到对应的接口类型对象。


  Uri uri = new Uri(@"http://localhost:8001");
   ServiceHost host = new ServiceHost(typeof(Service1), uri);
   ServiceMetadataBehavior metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
   if (metadataBehavior == null)
   {
    metadataBehavior = new ServiceMetadataBehavior();
    metadataBehavior.HttpGetEnabled = true;
     host.Description.Behaviors.Add(metadataBehavior);
   }
   host.AddDefaultEndpoints();
   host.Open();

 在上面的代码中,我们先定义了一个ServiceMetadataBehavior 对象,并通过Find方法在Behaviors中查找这个对象。如果在配置文件中,我们添加了该服务的serviceMetadata,则查找出来的结果应该为null,此时在重新new一个ServiceMetadataBehavior对象并添加到Behaviors中

 


 

 




评论