/// <summary> /// Create a response message of the message /// </summary> public HorseMessage CreateResponse(HorseResultCode status) { HorseMessage message = new HorseMessage(); message.HighPriority = Type == MessageType.DirectMessage; message.Type = MessageType.Response; message.ContentType = Convert.ToUInt16(status); message.SetMessageId(MessageId); message.SetTarget(Type == MessageType.QueueMessage ? Target : Source); return(message); }
/// <summary> /// Creates new HorseResult with a model /// </summary> public HorseResult(TModel model, HorseMessage message, HorseResultCode code) : base(code) { Model = model; Message = message; if (code != HorseResultCode.Ok) { if (message.Content != null && message.Length > 0) { Reason = message.GetStringContent(); } } }
public override async Task Execute(HorseClient client, HorseMessage message, object model) { Exception exception = null; IConsumerFactory consumerFactory = null; bool respond = false; try { TRequest requestModel = (TRequest)model; IHorseRequestHandler <TRequest, TResponse> handler; if (_handler != null) { handler = _handler; } else if (_handlerFactoryCreator != null) { consumerFactory = _handlerFactoryCreator(); object consumerObject = await consumerFactory.CreateConsumer(_handlerType); handler = (IHorseRequestHandler <TRequest, TResponse>)consumerObject; } else { throw new ArgumentNullException("There is no consumer defined"); } try { TResponse responseModel = await Handle(handler, requestModel, message, client); HorseResultCode code = responseModel is null ? HorseResultCode.NoContent : HorseResultCode.Ok; HorseMessage responseMessage = message.CreateResponse(code); if (responseModel != null) { responseMessage.Serialize(responseModel, client.JsonSerializer); } respond = true; await client.SendAsync(responseMessage); } catch (Exception e) { ErrorResponse errorModel = await handler.OnError(e, requestModel, message, client); if (errorModel.ResultCode == HorseResultCode.Ok) { errorModel.ResultCode = HorseResultCode.Failed; } HorseMessage responseMessage = message.CreateResponse(errorModel.ResultCode); if (!string.IsNullOrEmpty(errorModel.Reason)) { responseMessage.SetStringContent(errorModel.Reason); } respond = true; await client.SendAsync(responseMessage); throw; } } catch (Exception e) { if (!respond) { try { HorseMessage response = message.CreateResponse(HorseResultCode.InternalServerError); await client.SendAsync(response); } catch { } } await SendExceptions(message, client, e); exception = e; } finally { if (consumerFactory != null) { consumerFactory.Consumed(exception); } } }
/// <summary> /// Creates new HorseResult with no model /// </summary> public HorseResult(HorseResultCode code, string reason) : base(code) { Model = default; Reason = reason; }