Paquetes Nuget: Dotamf (Serializer) y dotamf.wcf (capa de servicio).
.NET serializador y enlaces de WCF para AMF con soporte completo de control remoto.
El formato de mensaje de acción (AMF) es un formato binario utilizado para serializar gráficos de objetos, como objetos de ActionScript y XML, o enviar mensajes entre un cliente Adobe Flash y un servicio remoto, generalmente un servidor de medios flash o alternativas de terceros. El lenguaje ActionScript 3 proporciona clases para codificar y decodificar del formato AMF.
http://en.wikipedia.org/wiki/action_message_format
AMF tiene varias ventajas sobre los formatos de serialización existentes, incluida la capacidad de mantener el gráfico de objetos, una pequeña huella al almacenar un conjunto de objetos idénticos (incluidas las cuerdas) o las referencias al mismo objeto, y una amplia gama de tipos compatibles de forma nativa (como XmlDocument , DateTime y Dictionary ).
Considere los siguientes contratos de servicio:
using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Xml;
namespace ExampleService
{
[ServiceContract]
public interface IMyService
{
[OperationContract]
ProductVo[] GetAllProducts();
[OperationContract(Name = "GetUser")] //Custom procedure name
User GetUserDataContract(int id);
[OperationContract]
int AddUser(User user);
[OperationContract]
Content SendContent(Content content);
[OperationContract]
User[] SendGraph(User[] users);
[OperationContract]
void DoStuff();
[OperationContract]
[FaultContract(typeof(CustomFault))]
void DoFault();
}
[DataContract] //Will have the "ExampleService.User" alias
public class User
{
[DataMember(Name = "id")] //Custom field name
public int Id { get; set; }
[DataMember(Name = "is_active")]
public bool IsActive { get; set; }
[DataMember] //Use explicit name
public string name { get; set; }
[DataMember(Name = "products")]
public ProductVo[] Products { get; set; }
}
[DataContract(Name = "Product")] //Custom alias
public class ProductVo
{
[DataMember(Name = "id")]
public int Id { get; set; }
}
[DataContract]
public class CustomFault
{
[DataMember(Name = "date")]
public DateTime Date { get; set; }
[DataMember(Name = "message")]
public string Message { get; set; }
}
[DataContract]
public class Content
{
[DataMember(Name = "data")]
public byte[] Data { get; set; }
[DataMember(Name = "xml")]
public XmlDocument Xml { get; set; }
}
}
Para agregar un soporte de AMF a un servicio, solo necesita actualizar su configuración:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="amfBehaviorExtension" type="DotAmf.ServiceModel.Configuration.AmfBehaviorExtensionElement, DotAmf.Wcf"/>
</behaviorExtensions>
<bindingElementExtensions>
<add name="amfBindingExtension" type="DotAmf.ServiceModel.Configuration.AmfBindingExtensionElement, DotAmf.Wcf"/>
</bindingElementExtensions>
</extensions>
<behaviors>
<endpointBehaviors>
<behavior name="amfEndpoint">
<amfBehaviorExtension/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="amfServiceBehavior">
<serviceMetadata httpGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="true" httpHelpPageEnabled="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="amfBinding">
<amfBindingExtension/>
<httpTransport/>
</binding>
</customBinding>
</bindings>
<services>
<service name="ExampleService.MyService" behaviorConfiguration="amfServiceBehavior">
<endpoint address="" contract="ExampleService.IMyService" binding="customBinding" bindingConfiguration="amfBinding" behaviorConfiguration="amfEndpoint"/>
</service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<directoryBrowse enabled="false"/>
</system.webServer>
</configuration>
Consulte la carpeta de Examples para obtener un servicio completo e implementaciones de clientes.
Puede usar DataContractAmfSerializer para serializar y deserializar a partir de datos binarios de AMF fuera del WCF.
CustomType objectToWrite;
var knownTypes = new[] {
typeof(KnownType1),
typeof(KnownType2)
};
var serializer = new DataContractAmfSerializer(typeof(CustomType), knownTypes);
using (var stream = new MemoryStream())
serializer.WriteObject(stream, objectToWrite);