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