分享

WCF元数据交换

 碧海山城 2009-12-21

元数据的配置、交换

WCF服务元数据是WCF服务的核心部分服务地址(Address)、绑定(通信协议Binding)、契约(服务、操作、数据Contract)的原始描述信息。服务所公开的元数据包括 XSD(文档中出现的元素、文档中出现的属性、子元素、子元素的数量、子元素的顺序、元素是否为空、元素和属性的数据类型、元素或属性的默认和固定值)和 WSDL 文档(用于描述服务的方法、参数、参数个数、顺序、返回值、返回值的类型等方法的相关信息)。.Disco文档(描述服务的协议、地址、命名空间等信息)。

元数据的信息除了包括服务、数据、操作等契约的相关的信息外,还有其他的如事物、可靠性、错误处理等相关的信息。

两种发布元数据的方式使用了两种不同的标准网络传输协议,前者为HTTP/GET请求,后者为WS-MetadataExchange(MEXWCF支持的基本绑定HTTPHTTPSTCPIPC等绑定协议)要了解这两种协议的区别,得先了解一下什么事WS-MEX
 

他们的区别可以体现在WS-*上,在使用WS-MEX以后,我们可以使用其他WS-*相关的标准来展示端点的元数据,比如WS-SecyrityWS-MEX默认是使用httpBinding

 

1.HTTP GET方式

 

 
 
配置方式:

 

<behaviors>
      <serviceBehaviors>
        <behavior name="WcfServiceApp.WCFServiceBehavior">
          <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8001/" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

 

在设置httpGetEnabled="true"以后便会在我们的服务帮助页面( 帮助页面可以设置行为的<serviceDebug httpHelpPageEnabled="false"/>关闭)的SvcUtil.exe指令之后带一个?WSDL后缀的活动链接,点击该链接,便会进入该服务的WSDL文档中。

httpGetUrl 属性, 如果httpGetEnabledtrue,这个属性指示使用哪个URL地址发布服务的WSDL

要发布Metadata,需要对外提供一个Http的地址,由HttpGetUrl 属性指定。

如果HttpGetUrl指定了绝对地址,那么对外发布Metadata的地址就为:HttpGetUrl 后加?wsdl

如果HttpGetUrl指定了相对地址,那么对外发布Metadata的地址就为: ServiceHostbaseAddress + HttpGetUrl 后加?wsdl

如果没有设置HttpGetUrl,那么Metadata的地址就是ServiceHostbaseAddress后加?wsdl

不管HttpGetUrl属性怎么设置,ServiceHostbaseAddress总是作为这个ServiceHost提供服务的描述页面的URL
 

<service behaviorConfiguration="NewBehavior" name="Messaging.Host.Service">

<endpoint  address="" binding="basicHttpBinding"   

      contract="Messaging.Host.IService" />

<host

<baseAddresses>

        <add baseAddress="http://localhost:8080/WCFService/Service" />

       </baseAddresses>

     </host>

</service>


那么,他的WSDL就是http://localhost:8080/WCFService/Service?WSDL

代码方式:

ServiceMetadataBehavior metadataBehavior;//定义服务行为变量,
 metadataBehavior 

= host.Description.Behaviors.Find<ServiceMetadataBehavior>();
 //获取宿主的行为列表
 if (metadataBehavior == null)//如果没有服务原数据交换的行为,实例化添加服务原数据交换行为
 {
      metadataBehavior = new ServiceMetadataBehavior();
      Uri httpAddress = new Uri("http://localhost:8001/");
      metadataBehavior.HttpGetUrl =httpAddress;
      metadataBehavior.HttpGetEnabled = true;//设置HTTP方式
      host.Description.Behaviors.Add(metadataBehavior);
}

首先是获得服务行为的列表信息,如果没有设置,我们就进行实例化服务原数据交换行为,并设置http方式可用。 host.Description.Behaviors.Add(metadataBehavior);添加宿主服务的行为。

2.WS-MEX

配置方式:

这里配置了3种方式的元数据交换终结点,分别是HTTPTCPIPC方式。

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
        <endpoint address="mex" binding="mexNamedPipeBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8001/"/>
            <add baseAddress="net.tcp://localhost:8002/"/>
            <add baseAddress="net.pipe://localhost/"/>
          </baseAddresses>
        </host>

元数据的地址就是对应的baseAddress/mes。比如http://localhost:8001/mex

代码方式:
 

//2编程方式实现ws*原数据交,声明三个绑定节点类
 BindingElement tcpBindingElement = new TcpTransportBindingElement();
BindingElement httpBindingElement = new HttpsTransportBindingElement();
 BindingElement pipeBindingElement = new NamedPipeTransportBindingElement();
 //实例化通用绑定类的实例
 Binding tcpBinding = new CustomBinding(tcpBindingElement);
 Binding httpBinding = new CustomBinding(httpBindingElement);
 Binding pipeBinding = new CustomBinding(pipeBindingElement);
 
 Uri tcpBaseAddress = new Uri("net.tcp://localhost:9001/");
 Uri httpBaseAddress = new Uri("http://localhost:9002/");
  Uri pipeBaseAddress = new Uri("net.pipe://localhost/");
                host.AddServiceEndpoint(typeof(WCFService.IWCFService), new NetTcpBinding(), tcpBaseAddress);
                host.AddServiceEndpoint(typeof(WCFService.IWCFService), new WSHttpBinding(), httpBaseAddress);
                host.AddServiceEndpoint(typeof(WCFService.IWCFService), new NetNamedPipeBinding(), pipeBaseAddress);
                
                //ServiceMetadataBehavior metadataBehavior;//定义服务行为变量,
                metadataBehavior = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
                //获取宿主的行为列表
                if (metadataBehavior == null)//如果没有服务原数据交换的行为,实例化添加服务原数据交换行为
                {
                    metadataBehavior = new ServiceMetadataBehavior();

                    host.Description.Behaviors.Add(metadataBehavior);
                }
                //如果没有可用的mex节点,可以使用一下代码判断,添加mex节点
                
                host.AddServiceEndpoint(typeof(IMetadataExchange), tcpBinding, "mex");
                host.AddServiceEndpoint(typeof(IMetadataExchange), httpBinding, "mex");
                host.AddServiceEndpoint(typeof(IMetadataExchange), pipeBinding, "mex");

 

 

参考:

http://www.cnblogs.com/frank_xl/archive/2009/03/30/1421862.html

http://www.cnblogs.com/chnking/archive/2008/01/21/1047754.html

http://www.cnblogs.com/chnking/archive/2008/01/22/1049345.html

http://www.cnblogs.com/jillzhang/archive/2008/01/30/1059169.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多