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