static void PrintInfo()
{
Module[] mods = Assembly.LoadWithPartialName("System.ServiceModel").GetModules();
List<Binding> allBinding = new List<Binding>();
Console.WriteLine("WCF定制的绑定类型:");
foreach (Module mod in mods)
{
foreach (Type type in mod.GetTypes())
{
if (type.Name.EndsWith("Binding"))
{
//此处需把CustomBinding排除在外,因为其建立之后必须制定信道范型
if (type.IsClass && !type.IsAbstract && type.Name != "CustomBinding")
{
//因要调用绑定的无参构造函数,所以必须先判定绑定类型是否存在无参构造函数
var ctor = type.GetConstructor(new Type[] { });
if (ctor != null)
{
allBinding.Add((Binding)Activator.CreateInstance(type));
Console.WriteLine(" " + type.Name);
}
}
}
}
}
Console.WriteLine("各个定制绑定类型对信道范型的支持:");
foreach (Binding binding in allBinding)
{
Console.WriteLine(" " + binding.Name);
Dictionary<string, bool> result = ChannelsOfBinding(binding);
foreach (KeyValuePair<string, bool> KeyValue in result)
{
if (KeyValue.Value)
{
Console.WriteLine(" {0,-8}: {1}", "Listener", KeyValue.Key.ToString());
}
}
Dictionary<string, bool> factoryResult = ChannelsOfBindingFactory(binding);
foreach (KeyValuePair<string, bool> KeyValue in factoryResult)
{
if (KeyValue.Value)
{
Console.WriteLine(" {0,-8}: {1}", "Factory", KeyValue.Key.ToString());
}
}
}
}
/// <summary>
/// 获取绑定类型对各个信道工厂的支持
/// </summary>
/// <param name="binding"></param>
/// <returns></returns>
static Dictionary<string, bool> ChannelsOfBindingFactory(Binding binding)
{
Dictionary<string, bool> channelsList = new Dictionary<string, bool>();
channelsList.Add("IInputChannel", binding.CanBuildChannelFactory<IInputChannel>());
channelsList.Add("IInputSessionChannel", binding.CanBuildChannelFactory<IInputSessionChannel>());
channelsList.Add("IOutputChannel", binding.CanBuildChannelFactory<IOutputChannel>());
channelsList.Add("IOutputSessionChannel", binding.CanBuildChannelFactory<IOutputSessionChannel>());
channelsList.Add("IDuplexChannel", binding.CanBuildChannelFactory<IDuplexChannel>());
channelsList.Add("IDuplexSessionChannel", binding.CanBuildChannelFactory<IDuplexSessionChannel>());
channelsList.Add("IDuplexContextChannel", binding.CanBuildChannelFactory<IDuplexContextChannel>());
channelsList.Add("IReplyChannel", binding.CanBuildChannelFactory<IReplyChannel>());
channelsList.Add("IReplySessionChannel", binding.CanBuildChannelFactory<IReplySessionChannel>());
channelsList.Add("IRequestChannel", binding.CanBuildChannelFactory<IRequestChannel>());
channelsList.Add("IRequestSessionChannel", binding.CanBuildChannelFactory<IRequestSessionChannel>());
return channelsList;
}
/// <summary>
/// 获取绑定类型对各个信道监听器的支持
/// </summary>
/// <param name="binding"></param>
/// <returns></returns>
static Dictionary<string, bool> ChannelsOfBinding(Binding binding)
{
Dictionary<string, bool> channelsList = new Dictionary<string, bool>();
channelsList.Add("IInputChannel", binding.CanBuildChannelListener<IInputChannel>());
channelsList.Add("IInputSessionChannel", binding.CanBuildChannelListener<IInputSessionChannel>());
channelsList.Add("IOutputChannel", binding.CanBuildChannelListener<IOutputChannel>());
channelsList.Add("IOutputSessionChannel", binding.CanBuildChannelListener<IOutputSessionChannel>());
channelsList.Add("IDuplexChannel", binding.CanBuildChannelListener<IDuplexChannel>());
channelsList.Add("IDuplexSessionChannel", binding.CanBuildChannelListener<IDuplexSessionChannel>());
channelsList.Add("IDuplexContextChannel", binding.CanBuildChannelListener<IDuplexContextChannel>());
channelsList.Add("IReplyChannel", binding.CanBuildChannelListener<IReplyChannel>());
channelsList.Add("IReplySessionChannel", binding.CanBuildChannelListener<IReplySessionChannel>());
channelsList.Add("IRequestChannel", binding.CanBuildChannelListener<IRequestChannel>());
channelsList.Add("IRequestSessionChannel", binding.CanBuildChannelListener<IRequestSessionChannel>());
return channelsList;
}