Пример #1
0
        public void BeforeSendReply(ref Message reply, object correlationState)
        {
            var message = reply as AmfGenericMessage;

            if(message == null)
                throw new InvalidOperationException("AmfGenericMessage is expected.");

            var packet = new AmfPacket();

            foreach (var header in message.AmfHeaders)
                packet.Headers[header.Key] = header.Value;

            packet.Messages.Add(message.AmfMessage);

            var ms = new MemoryStream();

            try
            {
                //Serialize packet into AMFX data
                var output = AmfxWriter.Create(ms);
                _context.AmfSerializer.WriteObject(output, packet);
                output.Flush();
                ms.Seek(0, SeekOrigin.Begin);

                reply = Message.CreateMessage(MessageVersion.None, null, AmfxReader.Create(ms, true));
            }
            catch
            {
                ms.Dispose();
                throw;
            }
        }
Пример #2
0
        /// <summary>
        /// Deserialize an AMFX packet.
        /// </summary>
        /// <exception cref="SerializationException">Error during deserialization.</exception>
        private static object DeserializePacket(XmlReader reader, SerializationContext context)
        {
            if (reader == null) throw new ArgumentNullException("reader");
            if (context == null) throw new ArgumentNullException("context");

            var packet = new AmfPacket();

            while (reader.Read())
            {
                if (reader.NodeType != XmlNodeType.Element) continue;

                #region Read packet header
                if (reader.Name == AmfxContent.PacketHeader)
                {
                    var header = new AmfHeader
                                     {
                                         Name = reader.GetAttribute(AmfxContent.PacketHeaderName),
                                         MustUnderstand =
                                             (reader.GetAttribute(AmfxContent.PacketHeaderMustUnderstand) ==
                                              AmfxContent.True)
                                     };

                    while (reader.Read())
                    {
                        //Skip until header content is found, if any
                        if (reader.NodeType != XmlNodeType.Element || reader.Name == AmfxContent.PacketHeader)
                            continue;

                        header.Data = Deserialize(reader, context);
                        break;
                    }

                    packet.Headers[header.Name] = header;
                    continue;
                }
                #endregion

                #region Read packet body
                if (reader.Name == AmfxContent.PacketBody)
                {
                    var message = new AmfMessage
                                      {
                                          Target = reader.GetAttribute(AmfxContent.PacketBodyTarget),
                                          Response = reader.GetAttribute(AmfxContent.PacketBodyResponse)
                                      };

                    while (reader.Read())
                    {
                        //Skip until body content is found, if any
                        if (reader.NodeType != XmlNodeType.Element || reader.Name == AmfxContent.PacketBody)
                            continue;

                        message.Data = Deserialize(reader, context);
                        break;
                    }

                    packet.Messages.Add(message);
                    continue;
                }
                #endregion
            }

            return packet;
        }