/// <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); } }
/// <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); } }
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); }
/// <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 })); }