コード例 #1
0
        protected async Task TryCacheResult(IHandlerContext handlerContext, object result, HttpRequestMessage request, HttpResponseMessage response)
        {
            if (!Enabled)
            {
                return;
            }

            var context = GetContext(handlerContext);

            var cacheEntry = new CacheEntry(result, request, response, context);

            var requestValidation = context.RequestValidator(context);

            if (requestValidation == RequestValidationResult.OK)
            {
                var validationResult = context.ResponseValidator(context, cacheEntry.Metadata);

                if (validationResult == ResponseValidationResult.OK ||
                    validationResult == ResponseValidationResult.MustRevalidate)
                {
                    await _cacheManager.Put(context, cacheEntry);
                }

                await context.HandlerRegister.OnStore(context, cacheEntry.Value);
            }
            else
            {
                await ExpireResult(context, requestValidation);
            }
        }
コード例 #2
0
        public string ResolveAttributeExpression(string expression, IHandlerContext handlerContext)
        {
            string text = expression;

            int leftMarkerIndex  = text.IndexOf(LEFT_MARKER);
            int rightMarkerIndex = text.IndexOf(RIGHT_MARKER, leftMarkerIndex + LEFT_MARKER.Length);

            while ((leftMarkerIndex != -1) && (rightMarkerIndex != -1))
            {
                string attributeName = text.Substring(leftMarkerIndex + LEFT_MARKER.Length, (rightMarkerIndex) - (leftMarkerIndex + LEFT_MARKER.Length)).Trim();


                try
                {
                    object attribute = handlerContext.GetAttribute(attributeName);
                    if (attribute != null)
                    {
                        string attributeString = attribute.ToString();
                        text             = text.Substring(0, leftMarkerIndex) + attributeString + text.Substring(rightMarkerIndex + RIGHT_MARKER.Length);
                        rightMarkerIndex = rightMarkerIndex + attributeString.Length - attributeName.Length - LEFT_MARKER.Length - RIGHT_MARKER.Length;
                    }
                }
                catch (Exception e)
                {
                    //log.Debug("attribute '" + attributeName + "' could not be resolved in attribute expression '" + expression + "'. Exception: " + e.Message);
                }

                leftMarkerIndex  = text.IndexOf(LEFT_MARKER, rightMarkerIndex + RIGHT_MARKER.Length);
                rightMarkerIndex = text.IndexOf(RIGHT_MARKER, leftMarkerIndex + LEFT_MARKER.Length);
            }

            return(text);
        }
コード例 #3
0
        /// <summary>
        /// 调用。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public override Task Invoke(IHandlerContext context)
        {
            var requestMessage = context.GetRequestMessage();

            //得到消息的唯一标识。
            var identity = GetMessageIdentity(requestMessage);

            #region 删除无效的消息标识以节省资源

            for (var i = 0; i < MessageIdentity.Count; i++)
            {
                var item = MessageIdentity[i];
                //消息处理时间大于30秒则删除该条标识。
                if (item.Value.AddSeconds(30) < DateTime.Now)
                {
                    MessageIdentity.Remove(item);
                }
            }

            #endregion 删除无效的消息标识以节省资源

            //如果消息已经被标识为处理则跳过。
            if (MessageIdentity.Any(i => i.Key == identity))
                return EmptyHandlerMiddleware.Instance.Invoke(context);

            //标识消息正在处理。
            MessageIdentity.Add(new KeyValuePair<string, DateTime>(identity, DateTime.Now));

            return Next.Invoke(context);
        }
コード例 #4
0
ファイル: RoleHandler.cs プロジェクト: lulzzz/Shuttle.Access
        public void ProcessMessage(IHandlerContext <AddRoleCommand> context)
        {
            var message = context.Message;

            if (string.IsNullOrEmpty(message.Name))
            {
                return;
            }

            using (_databaseContextFactory.Create())
            {
                var key = Role.Key(message.Name);

                if (_keyStore.Contains(key))
                {
                    return;
                }

                var id = Guid.NewGuid();

                _keyStore.Add(id, key);

                var role   = new Role(id);
                var stream = _eventStore.CreateEventStream(id);

                stream.AddEvent(role.Add(message.Name));

                _eventStore.Save(stream);
            }
        }
コード例 #5
0
 public void ProcessMessage(IHandlerContext <OrderProcessArchivedEvent> context)
 {
     using (_databaseContextFactory.Create(ProcessManagementData.ConnectionStringName))
     {
         _orderProcessViewQuery.Remove(context.Message.OrderProcessId);
     }
 }
コード例 #6
0
ファイル: UserHandler.cs プロジェクト: lulzzz/Shuttle.Access
        public void ProcessMessage(IHandlerContext <SetUserRoleCommand> context)
        {
            var message = context.Message;

            using (_databaseContextFactory.Create())
            {
                if (!message.Active && message.RoleName.Equals("administrator") && _systemUserQuery.AdministratorCount() == 1)
                {
                    return;
                }

                var user   = new User(message.UserId);
                var stream = _eventStore.Get(message.UserId);

                stream.Apply(user);

                if (message.Active && !user.IsInRole(message.RoleName))
                {
                    stream.AddEvent(user.AddRole(message.RoleName));
                }

                if (!message.Active && user.IsInRole(message.RoleName))
                {
                    stream.AddEvent(user.RemoveRole(message.RoleName));
                }

                _eventStore.Save(stream);
            }
        }
コード例 #7
0
        public void ProcessMessage(IHandlerContext <RegisterServerCommand> context)
        {
            var message = context.Message;

            using (_databaseContextFactory.Create())
            {
                var id = _serverQuery.FindId(message.MachineName, message.BaseDirectory);

                if (id.HasValue)
                {
                    _serverQuery.Save(
                        id.Value,
                        message.IPv4Address,
                        message.InboxWorkQueueUri,
                        message.ControlInboxWorkQueueUri);
                }
                else
                {
                    _serverQuery.Add(
                        message.MachineName,
                        message.BaseDirectory,
                        message.IPv4Address,
                        message.InboxWorkQueueUri,
                        message.ControlInboxWorkQueueUri);
                }
            }
        }
コード例 #8
0
 public void ProcessMessage(IHandlerContext <RemoveDataStoreCommand> context)
 {
     using (_databaseContextFactory.Create())
     {
         _dataStoreQuery.Remove(context.Message.Id);
     }
 }
コード例 #9
0
        public void ProcessMessage(IHandlerContext <CancelOrderProcessCommand> context)
        {
            using (_databaseContextFactory.Create(ProcessManagementData.ConnectionStringName))
            {
                var stream       = _eventStore.Get(context.Message.OrderProcessId);
                var orderProcess = new OrderProcess(context.Message.OrderProcessId);
                stream.Apply(orderProcess);

                if (!orderProcess.CanCancel)
                {
                    context.Publish(new CancelOrderProcessRejectedEvent
                    {
                        OrderProcessId = context.Message.OrderProcessId,
                        Status         = orderProcess.Status
                    });

                    return;
                }

                _eventStore.Remove(context.Message.OrderProcessId);
            }

            context.Publish(new OrderProcessCancelledEvent
            {
                OrderProcessId = context.Message.OrderProcessId
            });
        }
コード例 #10
0
        /// <summary>解码</summary>
        /// <param name="context"></param>
        /// <param name="pk"></param>
        /// <returns></returns>
        protected override IList <Packet> Decode(IHandlerContext context, Packet pk)
        {
            var ss = context.Owner as IExtend;
            var pc = ss["Codec"] as PacketCodec;

            if (pc == null)
            {
                ss["Codec"] = pc = new PacketCodec {
                    Expire = Expire, GetLength = p => GetLength(p, Offset, Size)
                }
            }
            ;

            var pks = pc.Parse(pk);

            // 跳过头部长度
            var len = Offset + Math.Abs(Size);

            foreach (var item in pks)
            {
                item.Set(item.Data, item.Offset + len, item.Count - len);
            }

            return(pks);
        }
コード例 #11
0
        public void ProcessMessage(IHandlerContext <EMailSentEvent> context)
        {
            if (!context.TransportMessage.IsHandledHere())
            {
                return;
            }

            var orderProcessId = new Guid(context.TransportMessage.CorrelationId);

            using (_databaseContextFactory.Create(ProcessManagementData.ConnectionStringName))
            {
                var stream = _eventStore.Get(orderProcessId);

                if (stream.IsEmpty)
                {
                    throw new ApplicationException(
                              string.Format("Could not find an order process with correlation id '{0}'.",
                                            context.TransportMessage.CorrelationId));
                }

                var orderProcess = new OrderProcess(orderProcessId);
                stream.Apply(orderProcess);

                stream.AddEvent(orderProcess.ChangeStatus("Dispatched-EMail Sent"));

                _eventStore.Save(stream);
            }

            context.Send(new CompleteOrderProcessCommand
            {
                OrderProcessId = orderProcessId
            }, c => c.Local());
        }
コード例 #12
0
ファイル: MessageCodec.cs プロジェクト: LiveFly/X
        /// <summary>写入数据</summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public override Object Write(IHandlerContext context, Object message)
        {
            if (message is T msg)
            {
                message = Encode(context, msg);
                if (message == null)
                {
                    return(null);
                }

                // 加入队列,忽略请求消息
                if (message is IMessage msg2)
                {
                    if (!msg2.Reply)
                    {
                        AddToQueue(context, msg);
                    }
                }
                else
                {
                    AddToQueue(context, msg);
                }
            }

            return(base.Write(context, message));
        }
コード例 #13
0
        /// <summary>解码</summary>
        /// <param name="context"></param>
        /// <param name="pk"></param>
        /// <returns></returns>
        protected override IList <IMessage> Decode(IHandlerContext context, Packet pk)
        {
            var ss = context.Owner as IExtend;

            if (ss["Codec"] is not PacketCodec pc)
            {
                ss["Codec"] = pc = new PacketCodec
                {
                    GetLength = DefaultMessage.GetLength,
                    Tracer    = (context.Owner as ISocket)?.Tracer
                };
            }

            var pks  = pc.Parse(pk);
            var list = pks.Select(e =>
            {
                var msg = new DefaultMessage();
                if (!msg.Read(e))
                {
                    return(null);
                }

                return(msg as IMessage);
            }).ToList();

            return(list);
        }
コード例 #14
0
ファイル: HttpCodec.cs プロジェクト: zy850580380/X
        /// <summary>读取数据</summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public override Object Read(IHandlerContext context, Object message)
        {
            if (!(message is Packet pk))
            {
                return(base.Read(context, message));
            }

            // 解码得到消息

            var msg = new HttpMessage();

            msg.Read(pk);

            // 匹配输入回调,让上层事件收到分包信息
            context.FireRead(msg);

            //if (pk.ToStr(null, 0, 4) == "HTTP")
            //{
            //    var response = new HttpResponse();
            //    if (!response.ParseHeader(pk)) return base.Read(context, message);

            //    // 匹配输入回调,让上层事件收到分包信息
            //    context.FireRead(response);
            //}
            //else
            //{
            //    var request = new HttpRequest();
            //    if (!request.ParseHeader(pk)) return base.Read(context, message);

            //    // 匹配输入回调,让上层事件收到分包信息
            //    context.FireRead(request);
            //}

            return(null);
        }
コード例 #15
0
        Boolean TryDecodePacket(Packet buffer, IHandlerContext context, out DataPacket packet)
        {
            if (!buffer.IsReadable(2)) // packet consists of at least 2 bytes
            {
                packet = null;
                return(false);
            }

            Int32 signature = buffer.ReadByte();

            if (!TryDecodeRemainingLength(buffer, out var remainingLength) || !buffer.IsReadable(remainingLength))
            {
                packet = null;
                return(false);
            }

            packet = DecodePacketInternal(buffer, signature, ref remainingLength, context);

            if (remainingLength > 0)
            {
                throw new DecoderException($"Declared remaining length is bigger than packet data size by {remainingLength}.");
            }

            return(true);
        }
コード例 #16
0
        protected override void Decode(IHandlerContext context, Packet input, List <Object> output)
        {
            try
            {
                switch (this.State)
                {
                case ParseState.Ready:
                    if (!TryDecodePacket(input, context, out var packet))
                    {
                        this.RequestReplay();
                        return;
                    }

                    output.Add(packet);
                    this.Checkpoint();
                    break;

                case ParseState.Failed:
                    // read out data until connection is closed
                    input.SkipBytes(input.ReadableBytes);
                    return;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }
            catch (DecoderException)
            {
                input.SkipBytes(input.ReadableBytes);
                this.Checkpoint(ParseState.Failed);
                throw;
            }
        }
コード例 #17
0
 public void ProcessMessage(IHandlerContext <OrderProcessRegisteredEvent> context)
 {
     using (_databaseContextFactory.Create(ProcessManagementData.ConnectionStringName))
     {
         _orderProcessViewQuery.Add(context.Message);
     }
 }
コード例 #18
0
 public void ProcessMessage(IHandlerContext <OrderProcessCompletedEvent> context)
 {
     using (_databaseContextFactory.Create(ProcessManagementData.ConnectionStringName))
     {
         _orderProcessViewQuery.SaveStatus(context.TransportMessage.OrderProcessId(), "Completed");
     }
 }
コード例 #19
0
ファイル: StandardCodec.cs プロジェクト: qkb/OrderRedisSample
 /// <summary>加入队列</summary>
 /// <param name="context"></param>
 /// <param name="msg"></param>
 /// <returns></returns>
 protected override void AddToQueue(IHandlerContext context, IMessage msg)
 {
     if (!msg.Reply)
     {
         base.AddToQueue(context, msg);
     }
 }
コード例 #20
0
 /// <summary>加入队列</summary>
 /// <param name="context"></param>
 /// <param name="msg"></param>
 /// <returns></returns>
 protected virtual void AddToQueue(IHandlerContext context, T msg)
 {
     if (msg != null && context["TaskSource"] is TaskCompletionSource <Object> source)
     {
         Queue.Add(context.Owner, msg, Timeout, source);
     }
 }
コード例 #21
0
        public void ProcessMessage(IHandlerContext <ArchiveOrderProcessCommand> context)
        {
            using (_databaseContextFactory.Create(ProcessManagementData.ConnectionStringName))
            {
                var orderProcess = _repository.Get(context.Message.OrderProcessId);

                if (!orderProcess.CanArchive())
                {
                    context.Publish(new ArchiveOrderProcessRejectedEvent
                    {
                        OrderProcessId = context.Message.OrderProcessId,
                        Status         = orderProcess.Status().Status
                    });

                    return;
                }

                _repository.Remove(orderProcess);
            }

            context.Publish(new OrderProcessArchivedEvent
            {
                OrderProcessId = context.Message.OrderProcessId
            });
        }
コード例 #22
0
        /// <summary>
        /// 调用。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public override Task Invoke(IHandlerContext context)
        {
            var dependencyResolver    = context.GetDependencyResolver();
            var requestMessageFactory = dependencyResolver.GetService <IRequestMessageFactory>();

            var content    = context.Content;
            var parameters = context.GetRequestParameters();

            #region Decrypt

            var encryptType = parameters["encrypt_type"];

            if (encryptType != null)
            {
                var nonce     = parameters["nonce"];
                var signature = parameters["msg_signature"];
                var timestamp = parameters["timestamp"];

                var baseInfo       = context.GetMessageHandlerBaseInfo();
                var appId          = baseInfo.AppId;
                var encodingAesKey = baseInfo.EncodingAesKey;
                var token          = baseInfo.Token;

                var wxBizMsgCrypt = new WXBizMsgCrypt(token, encodingAesKey, appId);
                wxBizMsgCrypt.DecryptMsg(signature, timestamp, nonce, content, ref content);
            }

            #endregion Decrypt

            context.SetRequestMessage(requestMessageFactory.CreateRequestMessage(content));

            return(Next.Invoke(context));
        }
コード例 #23
0
        public void ProcessMessage(IHandlerContext <ArchiveOrderProcessCommand> context)
        {
            using (_databaseContextFactory.Create(ProcessManagementData.ConnectionStringName))
            {
                var stream       = _eventStore.Get(context.Message.OrderProcessId);
                var orderProcess = new OrderProcess(context.Message.OrderProcessId);
                stream.Apply(orderProcess);

                if (!orderProcess.CanArchive)
                {
                    context.Publish(new ArchiveOrderProcessRejectedEvent
                    {
                        OrderProcessId = context.Message.OrderProcessId,
                        Status         = orderProcess.Status
                    });

                    return;
                }

                stream.AddEvent(orderProcess.ChangeStatus("Order Archived"));

                _eventStore.SaveEventStream(stream);
            }

            context.Publish(new OrderProcessArchivedEvent
            {
                OrderProcessId = context.Message.OrderProcessId
            });
        }
コード例 #24
0
        /// <summary>读取数据</summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public override Object Read(IHandlerContext context, Object message)
        {
            if (!(message is Packet pk))
            {
                return(base.Read(context, message));
            }

            // 解码得到多个消息
            var list = Decode(context, pk);

            if (list == null)
            {
                return(null);
            }

            foreach (var msg in list)
            {
                // 把数据发送给后续处理器
                var rs = base.Read(context, msg);

                // 匹配输入回调,让上层事件收到分包信息
                context.FireRead(rs);
            }

            return(null);
        }
コード例 #25
0
        /// <summary>
        /// ���á�
        /// </summary>
        /// <param name="context">���������ġ�</param>
        /// <returns>����</returns>
        public override Task Invoke(IHandlerContext context)
        {
            var request = context.Request;
            var dependencyResolver = context.GetDependencyResolver();
            var requestMessageFactory = dependencyResolver.GetService<IRequestMessageFactory>();

            var content = Encoding.UTF8.GetString(request.InputStream.ReadBytes());

            #region Decrypt

            var encryptType = request.QueryString["encrypt_type"];

            if (encryptType != null)
            {
                var nonce = request.QueryString["nonce"];
                var signature = request.QueryString["msg_signature"];
                var timestamp = request.QueryString["timestamp"];

                var baseInfo = context.GetMessageHandlerBaseInfo();
                var appId = baseInfo.AppId;
                var encodingAesKey = baseInfo.EncodingAesKey;
                var token = baseInfo.Token;

                var wxBizMsgCrypt = new WXBizMsgCrypt(token, encodingAesKey, appId);
                wxBizMsgCrypt.DecryptMsg(signature, timestamp, nonce, content, ref content);
            }

            #endregion Decrypt

            context.SetRequestMessage(requestMessageFactory.CreateRequestMessage(content));

            return Next.Invoke(context);
        }
コード例 #26
0
        /// <summary>读取</summary>
        /// <param name="context"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        public override Object Read(IHandlerContext context, Object message)
        {
            var ctx     = context as NetHandlerContext;
            var session = ctx.Session;

            if (message is Packet pk)
            {
                var len = pk.Total;
                if (len > 100)
                {
                    XTrace.WriteLine("Echo {0} [{1}]", session, len);
                }
                else
                {
                    XTrace.WriteLine("Echo {0} [{1}] {2}", session, len, pk.ToStr());
                }
            }
            else
            {
                XTrace.WriteLine("{0}", message);
            }

            session.SendMessage(message);

            return(null);
        }
コード例 #27
0
		public String ResolveAttributeExpression(String expression, IHandlerContext handlerContext)
		{
			String text = expression;

			int leftMarkerIndex = text.IndexOf(LEFT_MARKER);
			int rightMarkerIndex = text.IndexOf(RIGHT_MARKER, leftMarkerIndex + LEFT_MARKER.Length);

			while ((leftMarkerIndex != - 1) && (rightMarkerIndex != - 1))
			{
				String attributeName = text.Substring(leftMarkerIndex + LEFT_MARKER.Length, (rightMarkerIndex) - (leftMarkerIndex + LEFT_MARKER.Length)).Trim();


				try
				{
					Object attribute = handlerContext.GetAttribute(attributeName);
					if (attribute != null)
					{
						String attributeString = attribute.ToString();
						text = text.Substring(0, leftMarkerIndex) + attributeString + text.Substring(rightMarkerIndex + RIGHT_MARKER.Length);
						rightMarkerIndex = rightMarkerIndex + attributeString.Length - attributeName.Length - LEFT_MARKER.Length - RIGHT_MARKER.Length;
					}
				}
				catch (Exception e)
				{
					log.Debug("attribute '" + attributeName + "' could not be resolved in attribute expression '" + expression + "'. Exception: " + e.Message);
				}

				leftMarkerIndex = text.IndexOf(LEFT_MARKER, rightMarkerIndex + RIGHT_MARKER.Length);
				rightMarkerIndex = text.IndexOf(RIGHT_MARKER, leftMarkerIndex + LEFT_MARKER.Length);
			}

			return text;
		}
コード例 #28
0
        public void ProcessMessage(IHandlerContext <RegisterArgumentValueCommand> context)
        {
            var message = context.Message;

            using (_databaseContextFactory.Create())
            {
                var stream = _eventStore.Get(message.ArgumentId);

                if (stream.IsEmpty)
                {
                    return;
                }

                var argument = new Argument(message.ArgumentId);

                stream.Apply(argument);

                if (!argument.ContainsValue(message.Value))
                {
                    stream.AddEvent(argument.AddValue(message.Value));

                    _eventStore.Save(stream);
                }
            }
        }
コード例 #29
0
        public void ProcessMessage(IHandlerContext <InvoiceCreatedEvent> context)
        {
            if (!context.TransportMessage.IsHandledHere())
            {
                return;
            }

            var orderProcessId = new Guid(context.TransportMessage.CorrelationId);

            var orderProcess = new OrderProcess(orderProcessId);

            using (_databaseContextFactory.Create(ProcessManagementData.ConnectionStringName))
            {
                var stream = _eventStore.Get(orderProcessId);

                if (stream.IsEmpty)
                {
                    throw new ApplicationException(
                              string.Format("Could not find an order process with correlation id '{0}'.",
                                            context.TransportMessage.CorrelationId));
                }

                stream.Apply(orderProcess);

                stream.AddEvent(orderProcess.ChangeStatus("Invoice Created"));
                stream.AddEvent(orderProcess.AssignInvoiceId(context.Message.InvoiceId));

                _eventStore.SaveEventStream(stream);
            }

            context.Send(orderProcess.SendEMailCommand());
        }
コード例 #30
0
        public void ProcessMessage(IHandlerContext <RegisterArgumentCommand> context)
        {
            var message = context.Message;

            if (string.IsNullOrEmpty(message.Name) ||
                string.IsNullOrEmpty(message.DataTypeName))
            {
                return;
            }

            using (_databaseContextFactory.Create())
            {
                var key        = Argument.Key(message.Name);
                var existingId = _keyStore.Get(key);

                if (!message.Id.Equals(existingId ?? message.Id))
                {
                    return;
                }

                var stream   = _eventStore.Get(message.Id);
                var argument = new Argument(stream.Id);

                stream.Apply(argument);

                _keyStore.Remove(Argument.Key(argument.Name));

                stream.AddEvent(argument.Register(message.Name, message.DataTypeName));

                _eventStore.Save(stream);
                _keyStore.Add(argument.Id, key);
            }
        }
コード例 #31
0
 public void ProcessMessage(IHandlerContext <ArchiveOrderProcessRejectedEvent> context)
 {
     using (_databaseContextFactory.Create(ProcessManagementData.ConnectionStringName))
     {
         _orderProcessViewQuery.SaveStatus(context.Message.OrderProcessId, context.Message.Status);
     }
 }
コード例 #32
0
ファイル: StandardCodec.cs プロジェクト: qkb/OrderRedisSample
        /// <summary>解码</summary>
        /// <param name="context"></param>
        /// <param name="pk"></param>
        /// <returns></returns>
        protected override IList <IMessage> Decode(IHandlerContext context, Packet pk)
        {
            var ss = context.Owner as IExtend;
            var pc = ss["Codec"] as PacketCodec;

            if (pc == null)
            {
                ss["Codec"] = pc = new PacketCodec {
                    GetLength = DefaultMessage.GetLength
                }
            }
            ;

            var pks  = pc.Parse(pk);
            var list = pks.Select(e =>
            {
                var msg = new DefaultMessage();
                if (!msg.Read(e))
                {
                    return(null);
                }

                return(msg as IMessage);
            }).ToList();

            return(list);
        }
コード例 #33
0
        public void ProcessMessage(IHandlerContext <EMailSentEvent> context)
        {
            if (!context.TransportMessage.IsHandledHere())
            {
                return;
            }

            OrderProcess orderProcess;

            using (_databaseContextFactory.Create(ProcessManagementData.ConnectionStringName))
            {
                orderProcess = _repository.Get(new Guid(context.TransportMessage.CorrelationId));

                if (orderProcess == null)
                {
                    throw new ApplicationException(
                              string.Format("Could not find an order process with correlation id '{0}'.",
                                            context.TransportMessage.CorrelationId));
                }

                var orderProcessStatus = new OrderProcessStatus("EMail Sent");

                orderProcess.AddStatus(orderProcessStatus);

                _repository.AddStatus(orderProcessStatus, orderProcess.Id);
            }

            context.Send(new CompleteOrderProcessCommand
            {
                OrderProcessId = orderProcess.Id
            }, c => c.Local());
        }
コード例 #34
0
ファイル: WeiXinHandler.cs プロジェクト: coderen/WeiXinSDK
        /// <summary>
        /// 执行。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public Task Execute(IHandlerContext context)
        {
            var middlewareItems = (ICollection<KeyValuePair<object, object[]>>)_builder.Properties["Rabbit.Middlewares"];

            var fristMiddleware = GetFirstMiddleware(middlewareItems);

            return fristMiddleware.Invoke(context);
        }
コード例 #35
0
        /// <summary>
        /// 调用。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public override Task Invoke(IHandlerContext context)
        {
            Context = context;

            var requestMessage = context.GetRequestMessage();

            IResponseMessage responseMessage;
            switch (requestMessage.MessageType)
            {
                case RequestMessageType.Event:
                    responseMessage = OnEventRequest(requestMessage as EventMessageBase);
                    break;

                case RequestMessageType.Image:
                    responseMessage = OnImageRequest(requestMessage as RequestMessageImage);
                    break;

                case RequestMessageType.Link:
                    responseMessage = OnLinkRequest(requestMessage as RequestMessageLink);
                    break;

                case RequestMessageType.Location:
                    responseMessage = OnLocationRequest(requestMessage as RequestMessageLocation);
                    break;

                case RequestMessageType.ShortVideo:
                    responseMessage = OnShortVideoRequest(requestMessage as RequestMessageShortVideo);
                    break;

                case RequestMessageType.Text:
                    responseMessage = OnTextRequest(requestMessage as RequestMessageText);
                    break;

                case RequestMessageType.Video:
                    responseMessage = OnVideoRequest(requestMessage as RequestMessageVideo);
                    break;

                case RequestMessageType.Voice:
                    responseMessage = OnVoiceRequest(requestMessage as RequestMessageVoice);
                    break;

                default:
                    throw new NotSupportedException("不支持的请求消息类型:" + requestMessage.MessageType);
            }

            if (responseMessage != null)
            {
                //基本信息初始化。
                responseMessage.CreateTime = DateTime.Now;
                responseMessage.FromUserName = requestMessage.ToUserName;
                responseMessage.ToUserName = requestMessage.FromUserName;
            }

            context.SetResponseMessage(responseMessage);

            return Next.Invoke(context);
        }
コード例 #36
0
        /// <summary>
        /// 调用。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public override Task Invoke(IHandlerContext context)
        {
            var responseMessage = context.GetResponseMessage();

            if (responseMessage == null)
            {
                context.ResponseXml = string.Empty;
            }
            else
            {
                var requestMessage = context.GetRequestMessage();

                //基本信息初始化。
                responseMessage.CreateTime = DateTime.Now;
                responseMessage.FromUserName = requestMessage.ToUserName;
                responseMessage.ToUserName = requestMessage.FromUserName;

                var dependencyResolver = context.GetDependencyResolver();
                var responseMessageFactory = dependencyResolver.GetService<IResponseMessageFactory>();
                var content = responseMessageFactory.GetXmlByReponseMessage(responseMessage);

                #region Encrypt

                if (!string.IsNullOrWhiteSpace(content))
                {
                    var request = context.Request;
                    var encryptType = request.QueryString["encrypt_type"];

                    if (encryptType != null)
                    {
                        var nonce = request.QueryString["nonce"];
                        var timestamp = request.QueryString["timestamp"];

                        var baseInfo = context.GetMessageHandlerBaseInfo();
                        var appId = baseInfo.AppId;
                        var encodingAesKey = baseInfo.EncodingAesKey;
                        var token = baseInfo.Token;

                        var wxBizMsgCrypt = new WXBizMsgCrypt(token, encodingAesKey, appId);
                        wxBizMsgCrypt.EncryptMsg(content, timestamp, nonce, ref content);
                    }
                }

                #endregion Encrypt

                context.ResponseXml = content;
            }

            return Next.Invoke(context);
        }
コード例 #37
0
        /// <summary>
        /// 调用。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public override Task Invoke(IHandlerContext context)
        {
            var request = context.Request;
            var signature = request.QueryString["signature"];
            var timestamp = request.QueryString["timestamp"];
            var nonce = request.QueryString["nonce"];
            var token = context.GetMessageHandlerBaseInfo().Token;

            var dependencyResolver = context.GetDependencyResolver();
            var signatureService = dependencyResolver.GetService<ISignatureService>();
            if (!signatureService.Check(signature, timestamp, nonce, token))
                throw new Exception("非法请求。");

            return Next.Invoke(context);
        }
コード例 #38
0
        /// <summary>
        /// 调用。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public override Task Invoke(IHandlerContext context)
        {
            var request = context.Request;

            //HTTP正文。
            var bytes = context.Request.InputStream.ReadBytes();

            //根据查询字符串变量集合得到一个参数字典表。
            var parameters = request.QueryString.AllKeys.ToDictionary(i => i, i => request.QueryString[i]);
            //得到最终的请求Url。
            var postUrl = AppendParameter(_agentRequestModel.Uri.ToString(), parameters);

            Func<Task<string>> getPostTask =
                () =>
                {
                    var task = Task.Factory.StartNew(() => Encoding.UTF8.GetString(HttpHelper.Post(postUrl, bytes)));
                    //防止出错时程序崩溃。
                    task.ContinueWith(t => { }, TaskContinuationOptions.OnlyOnFaulted);
                    return task;
                };

            string content = null;
            Exception exception = null;
            //开始请求。
            for (var i = 0; i < _agentRequestModel.RetryCount + 1/*重试次数加上一次必需请求的次数*/; i++)
            {
                var task = getPostTask();
                var isTimeout = !task.Wait(_agentRequestModel.Timeout);

                exception = task.Exception;
                //超时或者失败则进行尝试。
                if (isTimeout || task.IsFaulted)
                    continue;

                content = task.Result;
                //结束请求。
                break;
            }

            if (content == null)
                throw new Exception("代理请求次数超过了重试次数并且目标方还是没有正确响应" + (exception == null ? "。" : "错误消息:" + exception.Message));

            context.ResponseXml = content;

            return Next.Invoke(context);
        }
コード例 #39
0
        /// <summary>
        /// 调用。
        /// </summary>
        /// <param name="context">处理上下文。</param>
        /// <returns>任务。</returns>
        public override Task Invoke(IHandlerContext context)
        {
            _sessionCollection = context.GetDependencyResolver().GetService<IUserSessionCollection>();

            var requestMessage = context.GetRequestMessage();
            //设置用户会话。
            context.SetSession(_sessionCollection.GetOrAdd(requestMessage.FromUserName));

            return Next.Invoke(context);
        }
コード例 #40
0
ファイル: WeiXinResult.cs プロジェクト: coderen/WeiXinSDK
 /// <summary>
 /// 初始化一个新的微信结果。
 /// </summary>
 /// <param name="context">处理上下文。</param>
 public WeiXinResult(IHandlerContext context)
     : this(context.ResponseXml)
 {
 }
コード例 #41
0
 /// <summary>
 /// 调用。
 /// </summary>
 /// <param name="context">处理上下文。</param>
 /// <returns>任务。</returns>
 public abstract Task Invoke(IHandlerContext context);
		protected static void TryBuild(IHandlerContext context, IRoutingTable routes)
		{
			Try(() => handler = new DefaultChannelMessageHandler(context, routes));
		}
コード例 #43
0
		private IActor ResolveArgument(IActor resolvedActor, String expression, int index, IHandlerContext handlerContext)
		{
			String argument = null;

			log.Debug("resolving actor expression '" + expression + "',  resolvedActor is " + resolvedActor);
			String whiteSpace = "                                                                                      ".Substring(0, index);
			log.Debug("                            " + whiteSpace + "^");

			String[] parameters = null;

			int argumentEndIndex = expression.IndexOf("->", index);
			if (argumentEndIndex == - 1)
			{
				argumentEndIndex = expression.Length;
			}

			int parametersStartIndex = expression.IndexOf("(", index);
			int parametersEndIndex = - 1;
			if ((parametersStartIndex != - 1) && (parametersStartIndex < argumentEndIndex))
			{
				argument = expression.Substring(index, (parametersStartIndex) - (index)).Trim();
				parametersEndIndex = expression.IndexOf(")", parametersStartIndex + 1);

				if (parametersEndIndex > argumentEndIndex)
				{
					throw new SystemException("can't resolve assigner expression : couldn't find closing bracket for bracket on index '" + parametersStartIndex + "' in expression '" + expression + "'");
				}

				// the next exception happens when a parameter contains a right bracket.
				String shouldBewhiteSpace = expression.Substring(parametersEndIndex + 1, (argumentEndIndex) - (parametersEndIndex + 1));
				if (!"".Equals(shouldBewhiteSpace.Trim()))
				{
					throw new SystemException("can't resolve assigner expression : only whitespace allowed between closing bracket of the parameterlist of an argument and the end of the argument : closing bracket position '" + parametersEndIndex + "' in expression '" + expression + "'");
				}

				String parametersText = expression.Substring(parametersStartIndex + 1, (parametersEndIndex) - (parametersStartIndex + 1));
				ArrayList parameterList = new ArrayList();

				StringTokenizer tokenizer = new StringTokenizer(parametersText, ",");
				IEnumerator tokenEnum = tokenizer.GetEnumerator();
				while (tokenEnum.MoveNext())
				{
					parameterList.Add(tokenEnum.Current.ToString().Trim());
				}

				if (parameterList.Count > 0)
				{
					parameters = new String[parameterList.Count];
					parameters = (String[]) parameterList.ToArray(typeof (String));
				}
				else
				{
					parameters = new String[0];
				}
			}
			else
			{
				argument = expression.Substring(index, (argumentEndIndex) - (index)).Trim();
				parameters = new String[0];
			}

			if ("".Equals(argument))
			{
				throw new SystemException("can't resolve assigner expression : can't resolve empty argument on index '" + index + "' for expression '" + expression + "'");
			}

			String methodName = "ResolveArgument" + argument.Substring(0, 1).ToUpper() + argument.Substring(1);
			try
			{
				MethodInfo method = this.GetType().GetMethod(methodName, (Type[]) RESOLVE_METHOD_ARGUMENT_TYPES);
				Object[] args = new Object[] {resolvedActor, parameters, handlerContext};

				resolvedActor = (IActor) method.Invoke(this, (Object[]) args);
				log.Debug(methodName + " came up with " + resolvedActor);
			}
			catch (Exception t)
			{
				throw new SystemException("can't resolve assigner expression : couldn't resolve argument '" + argument + "' : " + t.Message,t);
			}


			if (argumentEndIndex != expression.Length)
			{
				if (argumentEndIndex < expression.Length)
				{
					argumentEndIndex = expression.IndexOf("->", argumentEndIndex) + 2;
				}
				resolvedActor = ResolveArgument(resolvedActor, expression, argumentEndIndex, handlerContext);
			}

			return resolvedActor;
		}
コード例 #44
0
 /// <summary>
 /// 调用。
 /// </summary>
 /// <param name="context">处理上下文。</param>
 /// <returns>任务。</returns>
 public override Task Invoke(IHandlerContext context)
 {
     return Task.Factory.StartNew(() => { });
 }
コード例 #45
0
		public IActor ResolveArgument(String expression, IHandlerContext handlerContext)
		{
			return ResolveArgument(null, expression, 0, handlerContext);
		}