Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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();
                }
            }
        }
Esempio n. 3
0
        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);
                }
            }
        }
Esempio n. 4
0
 /// <summary>
 /// Creates new HorseResult with no model
 /// </summary>
 public HorseResult(HorseResultCode code, string reason) : base(code)
 {
     Model  = default;
     Reason = reason;
 }