Рассматривать WCF Messaging нужно точно с таких же позиций как и обычные сетевые стеки. Существует общее понятие соединения (endpoint) которое нисходит к сокетам операционной системы. Между двумя эндпойтами можно построить канал передачи сообщений. Эти каналы в первую очередь разделяются на односторонние и двусторонние. По односторонним каналам можно реализовать ремоутинг вызовов с сигнатурой void, по двусторонним можно реализовать операции которые возвращают ответ. Различают еще сессийные и несессийные каналы. В мире IP протоколов это аналоги UDP и TCP. В WCF это делается посредством установки SessionMode=SessionMode.Required в метаинформацию контракта и <reliableSession ordered="true"/> в <customBinding> канала, это фактически включит использование WS-ReliableMessaging OASIS протокола (при дефаултном использовании SOAP форматеров). Кроме того существуют дуплексные каналы для реализации колбеков и ивентов (естественно это все в рамках сессий, который в общем случае могут иметь неограниченное время жизни).
// Datagram Messages
[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface ISimplexDatagramRouter
{
[OperationContract(IsOneWay = true, Action = "*")]
void ProcessMessage(Message message);
}
[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface IRequestReplyDatagramRouter
{
[OperationContract(IsOneWay = false, Action = "*", ReplyAction = "*")]
Message ProcessMessage(Message message);
}
// Session (Reliable) Messages
[ServiceContract(SessionMode=SessionMode.Required)]
public interface ISimplexSessionRouter
{
[OperationContract(IsOneWay = true, Action = "*")]
void ProcessMessage(Message message);
}
[ServiceContract(SessionMode=SessionMode.Required, CallbackContract = typeof(ISimplexSessionRouter))]
public interface IDuplexSessionRouter
{
[OperationContract(IsOneWay = true, Action = "*")]
void ProcessMessage(Message message);