控制SOAP訊息編碼格式(SOAP Encoding Styles)
整個 SOAP Body格式設定 |
|||
Document 基於WSDL中對應方法的XML SCHEMA對整個方法(即訊息體)進行編碼 |
RPC 基於SOAP規範第7節RPC編碼規則對整個方法(即訊息體)進行編碼 |
||
引數格式設定 |
Literal 基於WSDL中每個引數的XML SCHEMA對引數進行編碼 |
l可使用的屬性: [SoapDocumentService] 為整個Web services 指定預設的方法格式設定,置於[Webservice]屬性之前 [SoapDocumentMethod] 為指定的Web Method設定方法格式,置於[Webmethod]屬性之前或之後 l上述屬性使用的屬性項: Use= 注:ASP.NET中預設的引數編碼格式為Literal l應用舉例: 1)處理簡單資料型別見應用例1 2)處理複雜資料型別見應用例2 lSOAP訊息舉例: 1)處理簡單資料型別見訊息例1 2)處理複雜資料型別見訊息例2 |
不支援Literal引數編碼格式 |
Encoded 基於SOAP規範第5節資料型別編碼規則對引數進行編碼 |
l可使用的屬性: [SoapDocumentService] 為整個Web services指定預設的方法格式設定,置於[Webservice]屬性之前 [SoapDocumentMethod] 為指定的Web Method設定方法格式,置於[Webmethod]屬性之前或之後 l上述屬性使用的屬性項: Use= l應用舉例: 1)處理簡單資料型別見應用例3 2)處理複雜資料型別見應用例4 lSOAP訊息舉例: 1)處理簡單資料型別見訊息例3 2)處理複雜資料型別見訊息例4 |
l可使用的屬性: [SoapRpcService] 為整個Web services 指定預設的方法格式設定,置於[Webservice]屬性之前 [SoapRpcMethod] 為指定的Web Method設定方法格式,置於[Webmethod]屬性之前或之後 l上述屬性使用的屬性項: 以上屬性只支援 Encoded引數格式,因此不具有Use屬性項 l應用舉例: 1)處理簡單資料型別見應用例5 2)處理複雜資料型別見應用例6 lSOAP訊息舉例: 1)處理簡單資料型別見訊息例5 2)處理複雜資料型別見訊息例6 |
注:以下例子中Address的定義如下:
public Class Address
{
PublicStringCity;
Public
String Street;Public String Zip;
}
[ 應用例1 ]
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<Add xmlns="http://www.abedon.net">
<a>1</a>
<b>2</b>
</Add>
</soap:Body>
</soap:Envelope>
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<PostInfoxmlns="http://www.abedon.net">
<addr>
<Street>aaa</Street>
<City>bbb</City>
<Zip>123456</Zip>
</addr>
<useZip>True</useZip>
</PostInfo>
</soap:Body>
[ 應用例4]
[ 訊息例3 ]
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:types="http://tempuri.org/encodedTypes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<q1:Add xmlns:q1="http://www.abedon.net">
<a xsi:type="xsd:int">1</a>
<b xsi:type="xsd:int">2</b>
</q1:Add>
</soap:Body>
</soap:Envelope>
[ 訊息例4]
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:types="http://tempuri.org/encodedTypes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<q1:PostInfo xmlns:q1="http://www.abedon.net">
<addr href="#id1" />
<usezip xsi:type="xsd:boolean">true</usezip>
</q1:PostInfo>
<types:Address id="id1" xsi:type="types:Address">
<City xsi:type="xsd:string">aaa</City>
<Street xsi:type="xsd:string">bbb</Street>
<Zip xsi:type="xsd:string">123456</Zip>
</types:Address>
</soap:Body>
</soap:Envelope>
[ 應用例5 ]
public int Add(int a, int b){…}
[ 應用例6 ]
[ 訊息例5 ]
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:types="http://tempuri.org/encodedTypes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<q1:Add xmlns:q1="http://www.abedon.net">
<a xsi:type="xsd:int">1</a>
<b xsi:type="xsd:int">2</b>
</q1:Add>
</soap:Body>
</soap:Envelope>
[ 訊息例6 ]
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:types="http://tempuri.org/encodedTypes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<q1:PostInfo xmlns:q1="http://www.abedon.net">
<addr href="#id1" />
<usezip xsi:type="xsd:boolean">true</usezip>
</q1:PostInfo>
<types:Address id="id1" xsi:type="types:Address">
<City xsi:type="xsd:string">aaa</City>
<Street xsi:type="xsd:string">bbb</Street>
<Zip xsi:type="xsd:string">123456</Zip>
</types:Address>
</soap:Body>
</soap:Envelope>
另外,在文件樣式的SOAP中還可通過指定SoapDocumentService或者SoapDocumentMethod屬性的ParameterStyle屬性項的值為Bare來使用空引數,此時請求和響應的資料緊跟在Body元素後面,下面是個例子:
l應用舉例:
lSOAP訊息舉例:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://tempuri.org/" xmlns:types="http://tempuri.org/encodedTypes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<xsd:int xsi:type="xsd:int">1</xsd:int>
<xsd:int xsi:type="xsd:int">2</xsd:int>
</soap:Body>
</soap:Envelope>
// 可以看到Add方法元素不見了,包含引數的元素名(原來是a和b。如果使用Literal格式編碼引數,則元素名保持不變,還是a和b)也變了,而且引數緊跟在Body元素後面。
另外,如果對Web services應用了SoapDocumentService屬性,則ParameterStyle=SoapParameterStyle.Default
這條語句用來指定引數編碼風格使用
Web services的預設值,這個預設值可以通過SoapDocumentService屬性來設定;如果沒有對Web services應用該屬性,則ParameterStyle
的
預設值自動設為Wrapped,即引數被封裝在 Body元素之後的單個XML元素(即方法元素)中,這一點與Bare(沒有方法元素)剛好相反。一般來說Wrapped這個引數用不上,因為它是預設值。
理論上文件(Document)樣式的SOAP訊息體(Body)內可以包含任何有效的XML文件,它可以通過Schema進行定義(Schema可能來自WSDL),這樣Web Services可以接收或返回一個XML文件,然後根據Schema定義對文件進行並行化(Deserialize)操作,得到需要的物件,同樣,編碼訊息時也是基於該Schema定義。而RPC風格的SOAP訊息是根據SOAP規範第5節和第7節的編碼規則來編碼,遵循該規範的Web Services的服務端和客戶端都知道如何按此規則進行序列和並行化操作,以便編碼訊息以及獲取資料。
以上是對SoapDocumentService、SoapDocumentMethod、SoapRpcService和SoapRpcMethod四個屬性與自定義SOAP訊息相關的主要應用的講解。SOAP的Encoding部分就介紹到這裡,實際上從上面的一些例子不難看出,目前SOAP規範中對於編碼格式的規定還很不完善,存在一些問題,不過我相信在SOAP規範的後續版本中這些問題能夠得到妥善解決。如果您還需要更加深入地剖析編碼格式對SOAP訊息更多更具體的影響,可以利用第四部分講述的SOAP擴充套件的一個具體應用——日誌擴充套件來跟蹤和分析由不同的編碼格式產生的包含不同資料型別的各種SOAP訊息。