在大多數情況下,開發者只關心數據契約而不必考慮攜帶這些數據的消息,然而某些特殊情況下,需要完全控制SOAP消息 的結構,如提供戶操作性,或者控制消息的某一部分的安全性,此時可以使用WCF中提供的編程模型消息契約,它使用一種可直接序列化爲所需精確SOAP消息 的類型。如果爲某一個數據類型定義了消息契約,我們可以完全控制該類型和SOAP消息之間的映射,如下面的代碼:
[MessageContract ]
public class CustomerMessage
{
[MessageHeader ]
public Guid Id { get ; set ; }
[MessageBodyMember ]
public String Name { get ; set ; }
[MessageBodyMember ]
public String Email { get ; set ; }
}
此處使用MessageContract特性指定CustomerM
essage類型爲消息契約,並用MessageHeader指定Id屬性在 SOAP消息的標頭,用MessageBodyMember指定Name、Email作爲SOAP消息的正文,如果攔截到SOAP消息,可以看到如下所 示:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1"
xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">
http://tempuri.org/ICustomerContract/GetCustomerResponse
</Action>
<h:Id xmlns:h="http://tempuri.org/">
38097c1d-366d-4c58-84a5-93525766630c
</h:Id>
</s:Header>
<s:Body>
<CustomerMessage xmlns="http://tempuri.org/">
<Email>lhj_cauc[@@AT@@]163.com</Email>
<Name>TerryLee</Name>
</CustomerMessage>
</s:Body>
</s:Envelope>
當然,還可以在消息契約中使用數組,對消息的部分進行簽名和加密等操作以及指定標頭和正文部分的命名空間,這些不是本文的重點,將不再闡述。可以看到,消息契約爲開發者完全控制SOAP消息和自定義類型之間的映射,提供了一種非常方便的途徑。
http://tech.ddvip.com/2008-11/122699056193240.html