请求/应答通道:IRequestChannel和IReplyChannel
在请求/应答消息交换模式里,消息的参与者都要发送和接收消息。发送者发送消息给接收者,然后等待回复;接收者接收请求消息,然后发送一个回复消息。
public interface IRequestChannel : IChannel, ICommunicationObject
{
EndpointAddress RemoteAddress { get; }
Uri Via { get; }
IAsyncResult BeginRequest(Message message, AsyncCallback callback, object state);
IAsyncResult BeginRequest(Message message, TimeSpan timeout, AsyncCallback callback, object state);
Message EndRequest(IAsyncResult result);
Message Request(Message message);
Message Request(Message message, TimeSpan timeout);
}
Request方法接收Message类型的参数,然后返回Message类型的实例。
public interface IReplyChannel : IChannel, ICommunicationObject
{
EndpointAddress LocalAddress { get; }
IAsyncResult BeginReceiveRequest(AsyncCallback callback, object state);
IAsyncResult BeginReceiveRequest(TimeSpan timeout, AsyncCallback callback, object state);
IAsyncResult BeginTryReceiveRequest(TimeSpan timeout, AsyncCallback callback, object state);
IAsyncResult BeginWaitForRequest(TimeSpan timeout, AsyncCallback callback, object state);
RequestContext EndReceiveRequest(IAsyncResult result);
bool EndTryReceiveRequest(IAsyncResult result, out RequestContext context);
bool EndWaitForRequest(IAsyncResult result);
RequestContext ReceiveRequest();
RequestContext ReceiveRequest(TimeSpan timeout);
bool TryReceiveRequest(TimeSpan timeout, out RequestContext context);
bool WaitForRequest(TimeSpan timeout);
}
IReplyChannel里没有直接返回一个Message实例的成员。相反,IReplyChannel接口支持通过RequestContext类型访问接收到的Message实例。
RequestContext类型包装了请求消息,而且提供了发送应答消息给发送者的方法。在RequestContext中,可以通过RequestMessage属性查看请求信息。RequestContext的Reply方法提供了发送应答消息的途径。
public abstract class RequestContext : IDisposable
{
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
protected RequestContext();
public abstract Message RequestMessage { get; }
public abstract void Abort();
public abstract IAsyncResult BeginReply(Message message, AsyncCallback callback, object state);
public abstract IAsyncResult BeginReply(Message message, TimeSpan timeout, AsyncCallback callback, object state);
public abstract void Close();
public abstract void Close(TimeSpan timeout);
protected virtual void Dispose(bool disposing);
public abstract void EndReply(IAsyncResult result);
public abstract void Reply(Message message);
public abstract void Reply(Message message, TimeSpan timeout);
}