What is the WCF channel stack? The WCF channel stack is a layered communication stack with one or more channels that process messages. At the bottom of the stack is a transport channel that is responsible for adapting the channel stack to the underlying transport (e.g. TCP, HTTP, SMTP etc.). Above the transport channel there are 0 or more protocol channels (also known as layered channels) that implement a SOAP-based protocol.
Why write a custom WCF channel? Custom channels are a powerful and versatile extensibility point. You'd write a custom protocol channel if you want to implement a wire protocol. Examples of wire protocols include the WS-ReliableMessaging protocol (WCF already implements that one for you as a channel) and a chunking protocol (see the chunking channel sample below). You'd write a custom transport if you want to send/receive WCF messages over a transport other than the ones we ship in the box (we ship TCP, HTTP, Named Pipes, MSMQ, and PeerChannel). For example, you could write a UDP transport (there's a sample of that in the WCF SDK) or an SMTP transport. Another reason to write a WCF transport is to integrate with an existing system that's not exposed as a Web service. In this case your transport acts as an adapter adapting WCF messages to the existing system's message format or API allowing a WCF client to talk directly to the existing system. An example of that is the WSE 3.0 TCP transport sample below.
WSE 3.0 TCP Interop: This sample demonstrates how to write custom WCF transports. This particular example shows a duplex sessionful transport using TCP that interoperates with WSE 3.0. The sample shows a client calling a WSE 3.0 TCP sample. You can download WSE 3.0 here.
Service activation over custom transport: Did you know that Windows Vista supports service activation over custom WCF transports? This sample shows you how to make service activation work over a custom transport. In this case the sample transport is UDP. This requires Windows Vista
One-Way sessions over TCP/NP: This is an example of a layered channel showing how to transform a duplex session channel to one way session channels. Besides being a good example of how to write a shape-changing channel, it is useful for doing one-way sessions over TCP and Named Pipes.
Chunking channel: Another example of a layered channel this one showing how to implement a message-based protocol that alters the messages as they are sent/received. This channel is useful for sending large amounts of data over channel stacks that require buffering e.g. when reliable messaging and/or message-based security are used.
HTTP with binary binding: An example of writing a custom binding using existing transports and encoders. This sample consists of a binding that uses HTTP (or HTTPS) with the WCF binary encoder. This is especially useful in scenarios where you have WCF on both ends but your network or hosting infrastructure requires you to use HTTP rather than TCP. For example if you want to use IIS 6 for hosting and activation.
Custom channel builder: This sample shows how to build a channel stack and dispatching messages from that stack in a custom way. It does this by implementing a custom service host that derives from ServiceHostBase. This sample requires IIS.
Config code generator: Adding config support for your custom channel requires writing a lot of boiler plate code that can be tedious to write. This tool automatically generates that code for you from your custom binding element or binding. It's really fabulous!
Basic channel tester: Once you've written all those custom channels you'll want a way to test them. This tool is a general framework for testing channels. It works by taking the binding you provide and creating a channel factory/channel listener and testing send/receive. A real handy way to test basic channel functionality without writing any test code.
Documentation, Talks, etc.
WCF Channels mini book: A short book of eight chapters that explains the channel model and shows how to build custom channels. The chapters are:
PDC 2005 custom channels talk: An overview of building custom protocol and transport channels.
Nicholas Allen's blog: Nicholas has been blogging regularly since he joined Microsoft. He has a blog category dedicated to channels.