通常定义消息的架构,使用数据协定就够了,但是有时必须将类型精确映射到soap消息,方法两种:1、插入自定义soap标头;2、另一种是定义消息的头和正文的安全属性。消息协定通过MessageContract,成员通过MessageHeader和MessageBodyMember来设定。
消息的操作最多具有一个参数和返回值,且参数和返回值都必须是消息类型。如:
[OperationContract] MessageContrctObject GetInfo(MessageContrctObject mco); [OperationContract] void SendInfo(MessageContrctObject mco); ...... //下面的是错误的 [OperationContract] int GetInfo(MessageContrctObject mco); [OperationContract] void SendInfo(MessageContrctObject mco1,MessageContrctObject mco2); ......
跟前面写过的协定一样,只要应用了MessageContract、MessageHeader和MessageBodyMember,类,方法,字段或属性等等都将忽略修饰,对客户端来讲都是public的。
对于数组的定义有两种:一是直接用MessageHeader,二是用MessageHeaderArray,如下是我写的一个简单的例子:
[MessageContract] public class UserMessageArray { [MessageHeaderArray] public string[] NameList; [MessageBodyMember] public string Remark; } [MessageContract] public class UserMessage { [MessageHeader] public string[] NameList; [MessageBodyMember] public string Remark;
他们的序列化不同之处在于包节点。
对消息加密和签名,是通过MessageHeader和MessageBodyMember的ProtectionLevel,其值为枚举:None,Sign,EncryptAndSign,这个先简单说到这儿,以后再做详细介绍。
控制是否包装soap的正文部分可以通过MessageContract的IsWrapped进行设置,soap的标头通过Actor/Role(1.1为Actor,1.2为Role)给标头添加统一资源标识符,通过MustUnderstand指示处理标头的节点是否必须劣迹该标头,Relay指定要将标头中继到下游节点。WCF不会对soap消息做任何处理(MustUnderstand除外)。消息的Body中也有Order排序,但是基类不排在派生类之前。
在消息中,为了提升性能,建议每个消息中只包含一个标头和和正文,因为每个消息头和正文都是独立的进行序列化。
时间: 2024-11-03 22:22:54