protected async Task DispatchMessage( Message messageToDispatch, MessageWriter messageWriter) { Task handlerToAwait = null; if (messageToDispatch.MessageType == MessageType.Request) { Func <Message, MessageWriter, Task> requestHandler = null; if (this.requestHandlers.TryGetValue(messageToDispatch.Method, out requestHandler)) { handlerToAwait = requestHandler(messageToDispatch, messageWriter); } else { // TODO: Message not supported error } } else if (messageToDispatch.MessageType == MessageType.Response) { if (this.responseHandler != null) { this.responseHandler(messageToDispatch); } } else if (messageToDispatch.MessageType == MessageType.Event) { Func <Message, MessageWriter, Task> eventHandler = null; if (this.eventHandlers.TryGetValue(messageToDispatch.Method, out eventHandler)) { handlerToAwait = eventHandler(messageToDispatch, messageWriter); } else { // TODO: Message not supported error } } else { // TODO: Return message not supported } if (handlerToAwait != null) { try { await handlerToAwait; } catch (TaskCanceledException) { // Some tasks may be cancelled due to legitimate // timeouts so don't let those exceptions go higher. } catch (AggregateException e) { if (!(e.InnerExceptions[0] is TaskCanceledException)) { // Cancelled tasks aren't a problem, so rethrow // anything that isn't a TaskCanceledException throw e; } } } }
public MessageDispatcher(ChannelBase protocolChannel) { this.protocolChannel = protocolChannel; this.MessageReader = protocolChannel.MessageReader; this.MessageWriter = protocolChannel.MessageWriter; }
public EventContext(MessageWriter messageWriter) { this.messageWriter = messageWriter; }