In order to understandBindings in details, it’s important to understand the Channel Stack as part ofWCF runtime.WCF bindingis composed of binding elements and each binding element is corresponding to a specific channel in Channel Stack. The Channel Stackcan be categorized into two major areas i.e. Protocol Channels and Transport Channels.Protocol Channels are Transaction Protocol, Reliable Messaging Protocol and Security Protocol while Transport Channels includes Message Encoding and Transport Protocol.is the optional element that controls the incoming transactions flow.is also the optional binding element specifies that reliable messaging is supported or not.

Security is another element that specifies that how security concepts like authentication, authorization, confidentiality and integrity will work.

Encoding is the required message encoding element that specifies which encoding method will be used i.e. text, binary, or MTOM.

Transport is also required binding element that specifies which transport protocol will be used i.e. TCP, NamedPipes, HTTP, HTTPS, MSMQ, or Peer-to-Peer or we can define our own custom one.

Each request coming from the client will go through Channel Stack from top to bottom and then encoded byte stream message will travels over wire. On the other end, message travel from bottom to top and reaches the service as shown in above diagram.

A complete picture of WCF runtime with Service Instance, Dispatcher and Channel Stack is as follows:

WCF is extensible, so we can defined our own bindings but there are different built-in bindings available in WCF, each designed to fulfill some specific needs.

basicHttpBinding wsHttpBinding netNamedPipeBinding netTcpBinding netPeerTcpBinding

You can find difference between basicHttpBinding and wsHttpBinding in another WCF Tutorial on this blog.

For example, We should go for basicHttpBinding or wsHttpBinding, if interoperability is our concern and we need to communicate with non-WCF systems. In some case, our service can reside on a single system, In such scenario netNamedPipeBinding will be the most efficient option.

netTcpBinding or netPeerTcpBinding might be best options, if we need to communicate across multiple computers.

And if the service needs support for disconnected or queued calls, netMsmqBinding or msmqIntegrationBinding will be the candidate options.

Finally an important thing to note is, if at all possible, tries to customize an existing standard binding rather than creating a custom binding because creating new one will add the complexity to our solution.