public async Task Handle(Message message) { if (message == null) { throw new ArgumentNullException("message"); } log.Trace("MessageType: '{0}'", message.MessageType.ToString()); var unwrapper = new MessageUnwrapper(message); Request request = unwrapper.GetRequest(); RequestHandler handler = null; ErrorResponse errorResponse = null; try { var factory = new RequestHandlerFactory(containerManager, jobManager, message.MessageType, request); handler = factory.GetHandler(); } catch (Exception ex) { log.ErrorException(ex); errorResponse = new ErrorResponse { Message = ex.Message }; } if (errorResponse != null) { await messageWriter.WriteAsync(errorResponse); return; } try { var streamingHandler = handler as IStreamingHandler; if (streamingHandler != null) { Response finalResponse = await streamingHandler.HandleAsync(messageWriter, cancellationToken); if (finalResponse == null) { string errorMessage = String.Format("Null final response from streaming handler '{0}'", streamingHandler.GetType()); log.Error(errorMessage); finalResponse = new ErrorResponse { Message = errorMessage }; } await messageWriter.WriteAsync(finalResponse); return; } else { Response response = await handler.HandleAsync(); await messageWriter.WriteAsync(response); } } catch (Exception ex) { if (ex is WardenException) { throw; } else { throw new WardenException(String.Format("Exception in request handler '{0}'", handler.ToString()), ex); } } log.Trace("Finished handling message: '{0}'", message.MessageType.ToString()); }