了解WCF定制的绑定类型(2)_绑定元素

来源:互联网 发布:闲鱼 淘宝二手官网迈腾 编辑:程序博客网 时间:2024/06/01 08:12
    WCF中绑定是由不同的绑定元素有序组成,其中有负责传输的元素(继承自TransportBindingElement并以TransportBindingElement结尾),有负责消息编码的元素(继成自MessageEncodingBindingElement并以其结尾),有负责安全的元素(继承自SecurityBindingElement并以此结尾),也有一些负责其它的一些元素(例如事务等)。负责传输的绑定元素和负责消息编码的绑定元素一般是一个绑定必备的绑定元素。

    通过反射可以了解系统中所有的绑定元素及其分类:

    程序为(vs 2010 .NET v4.0.30319):

Module[] ChannelMods = Assembly.LoadWithPartialName("System.ServiceModel").GetModules();foreach (Module mod in ChannelMods){    Console.WriteLine("负责传输的绑定元素:");    foreach (Type type in mod.GetTypes())    {        if (type.Name.EndsWith("TransportBindingElement")&&!type.IsAbstract)        {            Console.WriteLine("   "+type.Name);        }    }    Console.WriteLine("负责消息编码的绑定元素:");    foreach (Type type in mod.GetTypes())    {        if (type.Name.EndsWith("MessageEncodingBindingElement") && !type.IsAbstract)        {            Console.WriteLine("   " + type.Name);        }    }    Console.WriteLine("负责安全的绑定元素:");    foreach (Type type in mod.GetTypes())    {        if (type.Name.EndsWith("SecurityBindingElement") && !type.IsAbstract)        {            Console.WriteLine("   " + type.Name);        }    }    Console.WriteLine("负责其它功能的绑定元素:");    foreach (Type type in mod.GetTypes())    {        if (!type.Name.EndsWith("TransportBindingElement") && !type.Name.EndsWith("MessageEncodingBindingElement") && !type.Name.EndsWith("SecurityBindingElement") && type.Name.EndsWith("BindingElement") && !type.IsAbstract)        {            Console.WriteLine("   " + type.Name);        }    }}

结果为:

负责传输的绑定元素:   HttpTransportBindingElement   HttpsTransportBindingElement   NamedPipeTransportBindingElement   TcpTransportBindingElement   MsmqTransportBindingElement   PeerTransportBindingElement负责消息编码的绑定元素:   BinaryMessageEncodingBindingElement   MtomMessageEncodingBindingElement   TextMessageEncodingBindingElement负责安全的绑定元素:   SslStreamSecurityBindingElement   WindowsStreamSecurityBindingElement   AsymmetricSecurityBindingElement   SymmetricSecurityBindingElement   TransportSecurityBindingElement负责其它功能的绑定元素:   ChannelDemuxerBindingElement   ReplyAdapterBindingElement   NetTcpBindingElement   WSHttpBindingElement   ContextBindingElement   NetTcpContextBindingElement   WSHttpContextBindingElement   BasicHttpBindingElement   BasicHttpContextBindingElement   UnrecognizedAssertionsBindingElement   OneWayBindingElement   CompositeDuplexBindingElement   InternalDuplexBindingElement   CustomBindingElement   MexHttpBindingElement   MexHttpsBindingElement   MsmqIntegrationBindingElement   NetPeerTcpBindingElement   NetNamedPipeBindingElement   MexNamedPipeBindingElement   NetMsmqBindingElement   MexTcpBindingElement   PrivacyNoticeBindingElement   WSDualHttpBindingElement   WSFederationHttpBindingElement   UseManagedPresentationBindingElement   WS2007FederationHttpBindingElement   WS2007HttpBindingElement   MsmqIntegrationBindingElement   ReliableSessionBindingElement   SecuritySessionAuthenticatorBindingElement   AcceleratedTokenAuthenticatorBindingElement   PeerCustomResolverBindingElement   PnrpPeerResolverBindingElement   TransactionFlowBindingElement

     每种绑定类型都有默认配置的绑定元素,可以通过无参的默认构造函数建立绑定类型,然后通过绑定类型的CreateBindingElements()方法获取绑定元素集合,然后使用foreach遍历获知其默认的绑定类型。

具体函数如下:

static void DisplayBindingElements(Binding binding){   Console.WriteLine(binding.Name);   foreach (BindingElement be in binding.CreateBindingElements())   {      Console.WriteLine("  " + be.GetType().Name);   }}

获取的结果为:

BasicHttpBinding  TextMessageEncodingBindingElement  HttpTransportBindingElementBasicHttpContextBinding  ContextBindingElement  TextMessageEncodingBindingElement  HttpTransportBindingElementNetTcpBinding  TransactionFlowBindingElement  BinaryMessageEncodingBindingElement  WindowsStreamSecurityBindingElement  TcpTransportBindingElementNetTcpContextBinding  ContextBindingElement  TransactionFlowBindingElement  BinaryMessageEncodingBindingElement  WindowsStreamSecurityBindingElement  TcpTransportBindingElementWSHttpBinding  TransactionFlowBindingElement  SymmetricSecurityBindingElement  TextMessageEncodingBindingElement  HttpTransportBindingElementWSHttpContextBinding  ContextBindingElement  TransactionFlowBindingElement  SymmetricSecurityBindingElement  TextMessageEncodingBindingElement  HttpTransportBindingElementMsmqIntegrationBinding  MsmqIntegrationBindingElementNetMsmqBinding  BinaryMessageEncodingBindingElement  MsmqTransportBindingElementNetNamedPipeBinding  TransactionFlowBindingElement  BinaryMessageEncodingBindingElement  WindowsStreamSecurityBindingElement  NamedPipeTransportBindingElementNetPeerTcpBinding  PnrpPeerResolverBindingElement  BinaryMessageEncodingBindingElement  PeerTransportBindingElementWSFederationHttpBinding  TransactionFlowBindingElement  SymmetricSecurityBindingElement  TextMessageEncodingBindingElement  HttpTransportBindingElementWS2007FederationHttpBinding  TransactionFlowBindingElement  SymmetricSecurityBindingElement  TextMessageEncodingBindingElement  HttpTransportBindingElementWS2007HttpBinding  TransactionFlowBindingElement  SymmetricSecurityBindingElement  TextMessageEncodingBindingElement  HttpTransportBindingElementWSDualHttpBinding  TransactionFlowBindingElement  ReliableSessionBindingElement  SymmetricSecurityBindingElement  CompositeDuplexBindingElement  OneWayBindingElement  TextMessageEncodingBindingElement  HttpTransportBindingElement

这是默认的绑定元素组成,各种绑定类型会随着参数的变化而选择不同的绑定元素,下面的代码生成了两个BasicHttpBinding,但是因为第二个使用不同的安全模式和消息编码格式,使其使用不同的绑定元素。

BasicHttpBinding binding1 = new BasicHttpBinding();BasicHttpBinding binding2 = new BasicHttpBinding();binding2.MessageEncoding = WSMessageEncoding.Mtom;binding2.Security.Mode = BasicHttpSecurityMode.Transport;DisplayBindingElements(binding1);DisplayBindingElements(binding2);

这将导致两个绑定实例采用完全不同的绑定元素:

BasicHttpBinding  TextMessageEncodingBindingElement  HttpTransportBindingElementBasicHttpBinding  MtomMessageEncodingBindingElement  HttpsTransportBindingElement


 


 


 


 

原创粉丝点击