コード例 #1
0
        /// <summary>
        /// 通过字段的匹配,找到对应的MessageDescription
        /// </summary>
        /// <param name="recipient"></param>
        /// <param name="fields"></param>
        /// <returns></returns>
        protected virtual MessageDescription GetMessageDescription(MessageReceivingEndpoint recipient, IDictionary <string, string> fields)
        {
            var matches = this.requestMessageTypes.Keys
                          .Where(message => message.CheckMessagePartsPassBasicValidation(fields))
                          .OrderByDescending(message => CountInCommon(message.Mapping.Keys, fields.Keys))
                          .ThenByDescending(message => message.Mapping.Count)
                          .CacheGeneratedResults();
            var match = matches.FirstOrDefault();

            if (match != null)
            {
                if (Logger.Messaging.IsWarnEnabled() && matches.Count() > 1)
                {
                    Logger.Messaging.WarnFormat(
                        "Multiple message types seemed to fit the incoming data: {0}",
                        matches.ToStringDeferred());
                }

                return(match);
            }
            else
            {
                return(null);
            }
        }
コード例 #2
0
        /// <summary>
        /// 转换为IDirectedProtocolMessage
        /// </summary>
        /// <param name="recipient"></param>
        /// <param name="fields"></param>
        /// <returns></returns>
        public virtual IDirectedProtocolMessage GetNewRequestMessage(MessageReceivingEndpoint recipient, IDictionary <string, string> fields)
        {
            MessageDescription matchingType = this.GetMessageDescription(recipient, fields);

            if (matchingType != null)
            {
                return(this.InstantiateAsRequest(matchingType, recipient));
            }
            else
            {
                return(null);
            }
        }
コード例 #3
0
        protected virtual IProtocolMessage Receive(Dictionary <string, string> fields, MessageReceivingEndpoint recipient)
        {
            this.FilterReceivedFields(fields);
            IProtocolMessage message = this.MessageFactory.GetNewRequestMessage(recipient, fields); // 创建对象实例

            if (message == null)
            {
                return(null);
            }
            var directedMessage = message as IDirectedProtocolMessage;

            ErrorUtilities.VerifyProtocol(recipient == null || (directedMessage != null && (recipient.AllowedMethods & directedMessage.HttpMethods) != 0), MessagingStrings.UnsupportedHttpVerbForMessageType, message.GetType().Name, recipient.AllowedMethods);

            var messageAccessor = this.MessageDescriptions.GetAccessor(message); // 简单获取MessageDictionary

            messageAccessor.Deserialize(fields);                                 // 给对象填充参数值

            return(message);
        }
コード例 #4
0
        /// <summary>
        /// 创建对应的实例
        /// </summary>
        /// <param name="messageDescripton"></param>
        /// <param name="recipient"></param>
        /// <returns></returns>
        protected virtual IDirectedProtocolMessage InstantiateAsRequest(MessageDescription messageDescripton, MessageReceivingEndpoint recipient)
        {
            ConstructorInfo ctor = this.requestMessageTypes[messageDescripton];

            return((IDirectedProtocolMessage)ctor.Invoke(new object[] { recipient.Location, messageDescripton.MessageVersion }));
        }