حزم nuget: dotamf (serializer) و dotamf.wcf (طبقة الخدمة).
.NET Serializer و WCF Bindings لـ AMF مع دعم كامل Flex عن بعد.
تنسيق رسالة الإجراء (AMF) هو تنسيق ثنائي يستخدم لتسلسل الرسوم البيانية للكائنات مثل كائنات ActionScript و XML ، أو إرسال رسائل بين عميل Adobe Flash وخدمة عن بُعد ، وعادة ما يكون خادم وسائط فلاش أو بدائل طرف ثالث. توفر لغة ActionScript 3 فئات لترميز وفك التشفير من تنسيق AMF.
http://en.wikipedia.org/wiki/action_message_format
لدى AMF العديد من المزايا على تنسيقات التسلسل الحالية ، بما في ذلك القدرة على الحفاظ على الرسم البياني للكائنات ، وصمة صغيرة عند تخزين مجموعة من الكائنات المتطابقة (بما في ذلك السلاسل) أو المراجع إلى نفس الكائن ، ومجموعة واسعة من الأنواع المدعومة أصلاً (مثل XmlDocument ، و DateTime و Dictionary ).
النظر في عقود الخدمة التالية:
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; }
}
}
لإضافة دعم AMF إلى الخدمة ، تحتاج فقط إلى تحديث التكوين الخاص بك:
<?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>
راجع مجلد Examples للحصول على خدمة كاملة وتطبيقات العميل.
يمكنك استخدام DataContractAmfSerializer لتسلسلها وتصلبها من بيانات AMF الثنائية خارج 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);