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

5 篇文章 0 订阅
    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


 


 


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值