从EndpointAddress创建WCF绑定的简单方法

时间:2011-02-06 22:37:15

标签: wcf wcf-binding

是否有基于给定端点地址创建最基本WCF绑定的快捷方式?

端点:net.tcp:// localhost:7879 / Service.svc

而不是大块的if语句......

Binding binding = null;

if (endpoint.StartsWith("net.tcp"))
{
    binding = new NetTcpBinding();
}
else if (endpoint.StartWith("http"))
{
    binding = new WsHttpBinding();
}

.
.
.

框架库中是否有一个快捷方式可以帮我找到我找不到的快捷方式,或者因为它不公开存在而无法找到它?

3 个答案:

答案 0 :(得分:2)

.NET 4中的WCF会自动为您执行此操作 - 该功能称为默认端点

在此处阅读所有WCF 4的新功能:A Developer's Introduction to WCF 4

默认端点大约是文章中的第二个左右段落。

答案 1 :(得分:2)

虽然WCF 4支持默认服务端点,但它不支持默认客户端端点。不幸的是,框架用于创建默认绑定的方法是内部的,但它背后的逻辑很简单,所以我重新实现它在客户端使用(跳过原始缓存和跟踪逻辑):

private static Binding GetBinding(string scheme)
{
    // replace with ConfigurationManager if not running in ASP.NET
    var configuration = WebConfigurationManager.OpenWebConfiguration(null);
    var sectionGroup = ServiceModelSectionGroup.GetSectionGroup(configuration);
    Debug.Assert(sectionGroup != null, "system.serviceModel configuration section is missing.");
    var mapping = sectionGroup.ProtocolMapping.ProtocolMappingCollection
                              .OfType<ProtocolMappingElement>()
                              .SingleOrDefault(e => e.Scheme == scheme);
    if (mapping == null)
        throw new NotSupportedException(string.Format("The URI scheme {0} is not supported.", scheme));
    var bindingElement = sectionGroup.Bindings.BindingCollections.Single(e => e.BindingName == mapping.Binding);
    var binding = (Binding) Activator.CreateInstance(bindingElement.BindingType);
    var bindingConfiguration = bindingElement.ConfiguredBindings.SingleOrDefault(e => e.Name == mapping.BindingConfiguration);
    if (bindingConfiguration != null) 
        bindingConfiguration.ApplyConfiguration(binding);
    return binding;
}

没有任何配置,此代码等同于问题中的代码,但您可以在system.serviceModel/protocolMapping部分中选择和配置绑定。

答案 2 :(得分:1)

在深入研究问题之后,我并不需要手动阅读配置。相反,我需要发送绑定信息以及地址和合同。

http://www.codeproject.com/KB/WCF/WCFDiscovery.aspx?display=PrintAll

我已经构建了一个序列化绑定信息的简单组件。

http://nardax.codeplex.com/