Ryan Pedersen
Ryan Pedersen

Reputation: 3207

Simple way to create a WCF Binding from an EndpointAddress

Is there a shortcut for creating the most basic WCF Binding based on the address of a given Endpoint?

Endpoint: net.tcp://localhost:7879/Service.svc

Instead of a big block of if statements...

Binding binding = null;

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

.
.
.

Is there a shortcut in the Framework library that will do this for me that I just can't find or can I not find it because it doesn't publicly exist?

Upvotes: 1

Views: 1042

Answers (3)

Dark Daskin
Dark Daskin

Reputation: 1474

While WCF 4 supports default service endpoints, it does not support default client endpoints. Unfortunately the methods used by the framework to create default bindings are internal, but the logic behind it is simple, so I have reimplemented it to use on the client side (skipping original caching and tracing logic):

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;
}

Without any configuration this code is equivalent to the code in the question, but you can select and configure your bindings inside the system.serviceModel/protocolMapping section.

Upvotes: 2

Ryan Pedersen
Ryan Pedersen

Reputation: 3207

After looking at the issue deeper I don't really need to read the configuration in manually. Instead I need to send the binding information along with the address and contract.

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

I have built a simple component that serializes the binding information.

http://nardax.codeplex.com/

Upvotes: 1

marc_s
marc_s

Reputation: 754538

WCF in .NET 4 does that automatically for you - the feature is called default endpoints.

Read about all of WCF 4's new features here: A Developer's Introduction to WCF 4

Default endpoints is about the second or so paragraph into the article.

Upvotes: 2

Related Questions