public Task <K> Send <T, K>(Session session, T message, TimeSpan?timeout = null, bool wait = true) { if (timeout == null) { timeout = TimeSpan.FromSeconds(30); } var request = new DuplexRequest() { MessageId = Guid.NewGuid(), Message = SerializeManager.Current.Serialize(message) }; var bytes = SerializeManager.Current.Serialize(request); if (wait) { var waitItem = new DuplexWaitItem <K>(request.MessageId); lock (_Sync) { _WaitDic.Add(waitItem.MessageId, waitItem); } AttachCompletionToWaitItem(session, waitItem, timeout.Value); _CommunicationBase.SendDataInternal(session, bytes); return(waitItem.CompletionSource.Task); } else { _CommunicationBase.SendDataInternal(session, bytes); return(null); } }
private void CreateResponse(Session session, DuplexRequest request) { try { var message = SerializeManager.Current.Deserialize(request.Message); Action <object> sendResponse = (obj) => { var response = new DuplexResponse() { MessageId = request.MessageId, ResponseType = ResponseType.OK, Result = SerializeManager.Current.Serialize(obj) }; SendResponse(session, response); }; var isHandled = _HandlerList .Any(c => c.Handle(session, message, sendResponse)); if (isHandled) { return; } SendUnknownTypeResponse(session, request); } catch (Exception ex) { SendExceptionResponse(session, request, ex); } }
private void SendUnknownTypeResponse(Session session, DuplexRequest message) { var response = new DuplexResponse() { MessageId = message.MessageId, ResponseType = ResponseType.UnknownMethodType }; SendResponse(session, response); }
private void SendExceptionResponse(Session session, DuplexRequest message, Exception ex) { _CommunicationBase.OnException(session, ex, disconnect: false); var response = new DuplexResponse() { MessageId = message.MessageId, ResponseType = ResponseType.Exception, Exception = ex.Message }; SendResponse(session, response); }