瞭解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


 


 


 


 

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