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

    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
  HttpTransportBindingElement
BasicHttpContextBinding
  ContextBindingElement
  TextMessageEncodingBindingElement
  HttpTransportBindingElement
NetTcpBinding
  TransactionFlowBindingElement
  BinaryMessageEncodingBindingElement
  WindowsStreamSecurityBindingElement
  TcpTransportBindingElement
NetTcpContextBinding
  ContextBindingElement
  TransactionFlowBindingElement
  BinaryMessageEncodingBindingElement
  WindowsStreamSecurityBindingElement
  TcpTransportBindingElement
WSHttpBinding
  TransactionFlowBindingElement
  SymmetricSecurityBindingElement
  TextMessageEncodingBindingElement
  HttpTransportBindingElement
WSHttpContextBinding
  ContextBindingElement
  TransactionFlowBindingElement
  SymmetricSecurityBindingElement
  TextMessageEncodingBindingElement
  HttpTransportBindingElement
MsmqIntegrationBinding
  MsmqIntegrationBindingElement
NetMsmqBinding
  BinaryMessageEncodingBindingElement
  MsmqTransportBindingElement
NetNamedPipeBinding
  TransactionFlowBindingElement
  BinaryMessageEncodingBindingElement
  WindowsStreamSecurityBindingElement
  NamedPipeTransportBindingElement
NetPeerTcpBinding
  PnrpPeerResolverBindingElement
  BinaryMessageEncodingBindingElement
  PeerTransportBindingElement
WSFederationHttpBinding
  TransactionFlowBindingElement
  SymmetricSecurityBindingElement
  TextMessageEncodingBindingElement
  HttpTransportBindingElement
WS2007FederationHttpBinding
  TransactionFlowBindingElement
  SymmetricSecurityBindingElement
  TextMessageEncodingBindingElement
  HttpTransportBindingElement
WS2007HttpBinding
  TransactionFlowBindingElement
  SymmetricSecurityBindingElement
  TextMessageEncodingBindingElement
  HttpTransportBindingElement
WSDualHttpBinding
  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
  HttpTransportBindingElement
BasicHttpBinding
  MtomMessageEncodingBindingElement
  HttpsTransportBindingElement


 


 


 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章