Welcome

首页 / 软件开发 / WCF / WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇]

WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇]2012-12-06 cnblogs 蒋金楠对于WCF服务端元数据架构体系来说,通过MetadataExporter将服务的终结点导出成MetadataSet(参考《如何导出WCF服务的元数据》),仅仅是完成了一半的工作。被成功导出的以MetadataSet对象表示的元数据需要最终作为可被访问的网络资源发布出来,才能被服务消费者获取,进而有效地帮助他们进行服务调用。元数据的发布最终是通过ServiceMetadataBehavior这样一个服务行为实现的,我们先来认识一下ServiceMetadataBehavior。

一、 元数据发布的实现者:ServiceMetadataBehavior

ServiceMetadataBehavior是一个实现了IServiceBehavior的服务行为,它实现了基于如下两种协议的元数据发布模式:

HTTP-GET:采用HTTP协议的Get操作,向元数据目标地址发送HTTP请求,并以查询字符串(QueryString)的形式表示相应的查询参数。元数据最终以HTTP回复的形式返回;

WS-MEX:元数据提供者按照WS-MEX规范创建终结点发布元数据,元数据消费者创建同样基于WS-MEX的终结点与之交互,并最终通过SOAP的形式获取元数据。关于WS-MEX,可以参考我的文章《元数据(Metadata)架构体系全景展现[WS标准篇]》

我们首先通过如下得代码来看看ServiceMetadataBehavior的定义,ServiceMetadataBehavior实现IServiceBehavior接口,并将所有发布元数据的行为定义在ApplyDispatchBehavior方法中。

 1: public class ServiceMetadataBehavior : IServiceBehavior
2: {
3:
4: //其他成员
5: void IServiceBehavior.AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters);
6: void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase);
7: void IServiceBehavior.Validate(ServiceDescription description, ServiceHostBase serviceHostBase);
8:
9: public Uri ExternalMetadataLocation { get; set; }
10:
11: //HTTP
12: public bool HttpGetEnabled { get; set; }
13: public Uri HttpGetUrl { get; set; }
14: public Binding HttpGetBinding { get; set; }
15:
16: //HTTPS
17: public bool HttpsGetEnabled { get; set; }
18: public Binding HttpsGetBinding { get; set; }
19: public Uri HttpsGetUrl { get; set; }
20:
21: public MetadataExporter MetadataExporter { get; set; }
22: }
ServiceMetadataBehavior定义了一系列的属性用于控制具体的元数据发布行为,其中绝大部分是基于HTTP-GET发布模式的。ExternalMetadataLocation表示返回给客户端的一个外部元数据地址,可以是绝对地址,也可以是基于HttpGetUrl或者HttpsGetUrl表述的相对地址;基于HTTP-GET的元数据发布同时支持HTTP和HTTPS两种形式,Http(s)GetEnabled是控制是否允许基于HTTP(s)进行元数据发布的开关,Http(s)GetUrl和Http(s)GetBinding这指定了采用的地址和绑定;MetadataExporter属性表示的MetadataExporter对象用于进行元数据的导出,默认为WsdlExporter。

你可以通过配置的方式来设置除MetadataExporter之外的所有ServiceMetadataBehavior的属性,此外,WCF还提供给你一些额外的配型项供你更好地控制元数据的发布行为。对于WCF的开发者或者实施者来说,当你没有一份完备的文档指导你进行基于服务行为或者终结点行为的配置时,你可以查看该行为对应的BehaviorExtensionElement的定义获取与该行为相关的所有配置信息。ServiceMetadataBehavior相关的配置项全部定义在ServiceMetadataPublishingElement中,下面给出了ServiceMetadataPublishingElement的定义:

 1: public sealed class ServiceMetadataPublishingElement : BehaviorExtensionElement
2: {
3: //其他成员
4: public override Type BehaviorType { get; }
5: [ConfigurationProperty("externalMetadataLocation")]
6: public Uri ExternalMetadataLocation { get; set; }
7:
8: //HTTP
9: [ConfigurationProperty("httpGetEnabled", DefaultValue = false)]
10: public bool HttpGetEnabled { get; set; }
11: [ConfigurationProperty("httpGetUrl")]
12: public Uri HttpGetUrl { get; set; }
13: [StringValidator(MinLength=0), ConfigurationProperty("httpGetBinding", DefaultValue="")]
14: public string HttpGetBinding { get; set; }
15: [ConfigurationProperty("httpGetBindingConfiguration", DefaultValue=""), StringValidator(MinLength=0)]
16: public string HttpGetBindingConfiguration { get; set; }
17:
18: //HTTPS
19: [ConfigurationProperty("httpsGetEnabled", DefaultValue = false)]
20: public bool HttpsGetEnabled { get; set; }
21: [ConfigurationProperty("httpsGetUrl")]
22: public Uri HttpsGetUrl { get; set; }
23: [StringValidator(MinLength=0), ConfigurationProperty("httpsGetBinding", DefaultValue="")]
24: public string HttpsGetBinding { get; set; }
25: [StringValidator(MinLength=0), ConfigurationProperty("httpsGetBindingConfiguration", DefaultValue="")]
26: public string HttpsGetBindingConfiguration { get; set; }
27:
28: [ConfigurationProperty("policyVersion", DefaultValue="Default"), TypeConverter(typeof(PolicyVersionConverter))]
29: public PolicyVersion PolicyVersion { get; set; }
30: }