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