自訂 SOAP 訊息
使用 ASP.NET 所建立的 XML Web Service,以及使用 SOAP 與 XML Web Service 方法進行通訊的 XML Web Service 用戶端,可使用進階方法來控制傳送給伺服器,且預期從伺服器接收的 SOAP 訊息格式。SOAP 規定傳進或傳出 XML Web Service 的 SOAP 訊息內容必須以 XML 撰寫,但並未嚴格要求 XML 的格式。如果要提供方法使用不同格式的 XML Web Service,您可以使用 ASP.NET 所提供以屬性為基礎的方法,來控制 SOAP 訊息內的 XML 格式。此外,使用以屬性為基礎的方法時,您可以為透過網路傳送的 SOAP 指定特定項目及屬性名稱,更精確地控制 SOAP。
XML Web Service 與用戶端之間的彼此通訊,大部分依循兩大業界標準:SOAP 及 Web 服務描述語言 (WSDL)。SOAP 替 Body 項目下的資料定義格式化配置,也替 Body 項目內參數的格式化方式定義格式化配置。如需前項功能的詳細資訊,請參閱 SOAP 第 7 章,或輸入 RPC 即可。如需 SOAP 規格的詳細資訊,請參閱 W3C 網站 (http://www.w3.org/TR/SOAP)。如需後項功能的詳細資訊,請參閱 SOAP 第 5 章,或輸入 Encoded 即可。WSDL 的用途是描述 XML Web Service 預期的 SOAP 訊息,XML Web Service 可藉此聲明接受具有編碼參數的 RPC 訊息。WSDL 也可定義其他兩個詞:Literal 及 Document。Literal 就像編碼,表示參數格式化的方式。而 Document 就像 RPC,表示整個 Body 項目格式化的方式。
自訂 XML Web Service 用戶端傳送的 SOAP
下列資料表綱要列出使用 ASP.NET 所建立的 XML Web Service,以及用來完成每個特定組合的屬性所支援的格式化樣式。具有 Service 後置字元的屬性可套用至實作 XML Web Service 的類別,設定類別中 XML Web Service 方法的預設格式化樣式。具有 Method 後置字元的屬性僅可套用於 XML Web Service 方法,或是 Proxy 類別中呼叫 XML Web Service 方法的方法。以下段落為您進一步介紹每個組合。
整個 SOAP Body 格式化 | ||
---|---|---|
參數格式化 | 以 Document 為基礎的 SOAP 訊息 | SOAP 第 7 章所規定以 RPC 為基礎的訊息 |
Literal — 根據每個參數的 XSD 結構描述 | SoapDocumentMethod 或 SoapDocumentService Use=Literal 這是預設值。 | 不支援。 |
Encoded - SOAP 第 5 章編碼規則 | SoapDocumentMethod 或 SoapDocumentService Use=Encoded | SoapRpcMethod 或 SoapRpcService |
修改參數格式化
設計 XML Web Service 時,首先要決定如何將 SOAP 要求內的 XML 編碼。尤其要考量 XML 文件該嚴格遵守 XSD 結構描述,或依循 SOAP 規格第 7 章及第 5 章中的格式化規則。 SOAP 規格第 7 章及第 5 章中的格式化規則允許變量。所以,SOAP 要求中使用 SOAP 編碼規則的的接收者必須處理所有可能的變量。如果您將 XML Web Service 方法的 XSD 結構描述加以定義,即可明確定義 SOAP 要求內必須傳送的項目。使用 ASP.NET 建立之 XML Web Service 的預設值,是使用根據結構描述傳遞的文件。
因為傳給 XML Web Service 方法的參數就佔了 SOAP 要求或回應內傳遞的大部分資料,所以參數對應至 XML 項目的方式決定了 XML 文件的外觀。Web 服務描述語言 (WSDL) 定義了兩種參數可使用的格式化樣式:Encoded 及 Literal。使用 Encoded 格式化參數,表示資料使用 SOAP 編碼第 5 章綱要列出的方式進行。使用 Literal 則表示在每個參數使用預先定義的 XSD 結構描述,將參數對應至 XML 項目。
您可以透過 XML Web Service 用戶端,選擇參數對應至 XML 項目的方式,以符合 XML Web Service 的預期。XML Web Service 支援 Literal 和 Encoded 參數格式化樣式。所支援的內容根據您選擇的 XML Web Service 方法的格式化方式而不同。如需詳細資訊,請參閱修改整個 SOAP BODY 格式化。
請注意,雖然 ASP.NET 提供您控制 XML 格式化方式的大型架構,但是不保證參數序列化的順序。
若要指定 Literal 參數格式化
將 SoapDocumentMethod 屬性套用至 Proxy 類別中的方法,並將 Use 屬性設定為 SoapBindingUse.Literal。
SoapBindingUse 列舉型別指定使用 ASP.NET 建立的 XML Web Service 中可用的參數格式化樣式。
[SoapDocumentMethod( "https://www.contoso.com/DocumentLiteral", RequestNamespace="https://www.contoso.com", ResponseNamespace="https://www.contoso.com", Use=SoapBindingUse.Literal)] public string DocumentLiteral(Address1 address, bool useZipPlus4) { [Visual Basic] <SoapDocumentMethod( _ "https://www.contoso.com/DocumentLiteral", _ RequestNamespace:="https://www.contoso.com", _ ResponseNamespace:="https://www.contoso.com", _ Use:=SoapBindingUse.Literal)> _ Public Function DocumentLiteral(ByVal address As Address1, _ ByVal useZipPlus4 As Boolean) As String
傳至
DocumentLiteral
XML Web Service 方法之 SOAP 要求內的XML 部分會跟隨。位在 Body 項目中的參數經過編碼參考至XSD 結構描述,為獨立的 (Self-Contained) XML 文件。<?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="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <DocumentLiteral xmlns="https://www.contoso.com"> <address> <Street>One Microsoft Way</Street> <City>Redmond</City> <Zip>98052</Zip> </address> <useZipPlus4>True</useZipPlus4> </DocumentLiteral> </soap:Body> </soap:Envelope>
若要指定 Encoded 參數格式化
將 SoapDocumentMethod 屬性或 SoapRpcMethod 屬性套用至 Proxy 類別中的方法,並將 Use 屬性設定為 SoapBindingUse.Encoded。
Encoded 參數格式化樣式與 Literal 參數格式化樣式的不同之處,是 Encoded 參數格式化樣式可配合兩種 XML Web Service 方法格式化樣式使用。如需 XML Web Service 方法格式化樣式的詳細資訊,請參閱修改整個 SOAP BODY 格式化。
[SoapDocumentMethod("https://www.contoso.com/DocumentEncoded", RequestNamespace="https://www.contoso.com", ResponseNamespace="https://www.contoso.com", Use=SoapBindingUse.Encoded)] public string DocumentEncoded(Address address, bool useZipPlus4) { [Visual Basic] <SoapDocumentMethod("https://www.contoso.com/DocumentEncoded", _ RequestNamespace:="https://www.contoso.com", _ ResponseNamespace:="https://www.contoso.com", _ Use:=SoapBindingUse.Encoded)> _ Public Function DocumentEncoded(ByVal address As Address, _ ByVal useZipPlus4 As Boolean) As String
傳至
DocumentEncoded
服務方法之 SOAP 要求內的XML 部分會跟隨。請注意,參數表示方式與 Literal 格式化樣式相當不同,因為這些參數使用 SOAP 規格第 5 章內綱要列出的編碼規則進行格式化。請特別注意address
參數,它不是簡單資料型別。<?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:soapenc="https://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="https://www.contoso.com" xmlns:tnsTypes="https://www.contoso.com/encodedTypes" xmlns:wsdl="https://schemas.xmlsoap.org/wsdl/" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body soap:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/"> <tnsTypes:DocumentEncoded> <address href="#1" /> <useZipPlus4>boolean</useZipPlus4> </tnsTypes:DocumentEncoded> <tnsTypes:Address id="1"> <Street id="2">string</Street> <City id="3">string</City> <Zip id="4">string</Zip> </tnsTypes:Address> </soap:Body> </soap:Envelope>
修改整個 SOAP BODY 格式化
根據 WSDL 定義,XML Web Service 方法呼叫作業時,可在 SOAP 要求或 SOAO 回應內的 Body 項目格式化為兩種樣式:RPC 和 Document。ASP.NET 中支援 Document 及 RPC 格式化樣式,Document 為預設值。
RPC 樣式表示根據 SOAP 的 PRC 格式,也就是 SOAP 規格第 7 章格式,將 Body 項目格式化。這個樣式表示所有的參數都封裝在單一項目中,並使用 XML Web Service 方法的名稱,且這個項目中的每個項目都表示根據其對應參數名稱而命名的參數。並描述 SOAP 回應格式化的規則。
Document 樣式表示將 Body 項目格式化為 Body 項目下連續一個或多個訊息部分。至於個別訊息部分形成方式,則由 SoapDocumentMethod 屬性的 Use 及 ParameterStyle 屬性決定。其中,Use 屬性判斷參數格式化為 Encoded 或 Literal。而 ParameterStyle 判斷參數是否封裝在 Body 項目後的單一訊息部分中,還是每個參數都是個別訊息部分。如需設定 ParameterStyle 屬性的詳細資訊,請參閱修改使參數能/不能封裝在一個 XML 項目中。
若要指定 Document 格式化樣式
將 SoapDocumentMethod 屬性套用至呼叫相關 XML Web Service 方法之 Proxy 類別中的方法。
使用 Document 格式化樣式時,使用 ASP.NET 建立之 XML Web Service 可支援 Literal 及 Encoded 參數格式化樣式。下列範例將 Document 方法格式化樣式與 Literal 參數格式化樣式合併。
[SoapDocumentMethod("https://www.contoso.com/DocumentWrappedLiteral", RequestNamespace="https://www.contoso.com", ResponseNamespace="https://www.contoso.com", Use=SoapBindingUse.Literal)] public string DocumentWrappedLiteral(Address MyAddress, bool useZipPlus4) { [Visual Basic] <SoapDocumentMethod("https://www.contoso.com/DocumentWrappedLiteral", _ RequestNamespace:="https://www.contoso.com", _ ResponseNamespace:="https://www.contoso.com", _ Use:=SoapBindingUse.Literal)> _ Public Function DocumentWrappedLiteral(ByVal MyAddress As Address, _ ByVal useZipPlus4 As Boolean)As String
正如 Document 格式化樣式所預期,XSD 結構描述定義在服務描述內,而這個服務描述本身定義了 SOAP 要求及 SOAP 回應。下列為 SOAP 要求的服務描述,摘錄自
DocumentWrappedLiteral
XML Web Service 方法。因為傳至DocumentWrappedLiteral
XML Web Service 方法的第一個參數是一個類別,且 Literal 參數格式化樣式經過指定,所以 XSD 結構描述從address
型別建立。<s:elementname="DocumentWrappedLiteral"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="MyAddress"nillable="true" type="s0:Address" /> <s:element minOccurs="1" maxOccurs="1" name="useZipPlus4" type="s:boolean" /> </s:sequence> </s:complexType> </s:element> <s:complexType name="Address"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="Street"nillable="true" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="City" nillable="true" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="Zip" nillable="true" type="s:string" /> </s:sequence> </s:complexType>
XSD 結構描述定義在服務描述內,傳至
DocumentWrappedLiteral
服務方法之 SOAP 要求內的 XML 部分會跟隨。請注意,SOAP 要求中Body
項目下的 XML 項目,與 XSD 結構描述內定義的項目相符。<?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="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <DocumentWrappedLiteral xmlns="https://www.contoso.com"> <MyAddress> <Street>string</Street> <City>string</City> <Zip>string</Zip> </MyAddress> <useZipPlus4>boolean</useZipPlus4> </DocumentWrappedLiteral> </soap:Body> </soap:Envelope>
若要指定 RPC 格式化樣式
將 SoapRpcMethod 屬性套用至呼叫相關 XML Web Service 方法之 Proxy 類別中的方法。
使用 RPC 格式化樣式時,ASP.NET 僅支援 Encoded 參數格式化樣式。因為 SoapRpcMethod 屬性不具有 Use 屬性,所以下列程式碼範例不會將 Use 屬性指定給參數格式化。
[SoapRpcMethodAttribute("https://www.contoso.com/Rpc", RequestNamespace="https://www.contoso.com", ResponseNamespace="https://www.contoso.com")] public Address Rpc(Address address, bool useZipPlus4) { [Visual Basic] <SoapRpcMethodAttribute("https://www.contoso.com/Rpc", _ RequestNamespace:="https://www.contoso.com", _ ResponseNamespace:="https://www.contoso.com")> _ Public Function Rpc(ByVal address As Address, _ ByVal useZipPlus4 As Boolean) As Address
傳遞給先前範例中的
Rpc
方法的 SOAP 要求或 SOAP 回應,其服務描述中的 XSD 結構描述未經過嚴格定義,而僅是服務描述的一部份。所以,您看看Rpc
方法的 SOAP 要求,會發現參數封裝在一個項目中,並使用 Encoded 參數格式化來編碼。<?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:soapenc="https://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="https://www.contoso.com" xmlns:tnsTypes="https://www.contoso.com/encodedTypes" xmlns:wsdl="https://schemas.xmlsoap.org/wsdl/" xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body soap:encodingStyle="https://schemas.xmlsoap.org/soap/encoding/"> <tns:Rpc> <address href="#1" /> <useZipPlus4>boolean</useZipPlus4> </tns:Rpc> <tnsTypes:Address id="1"> <Street id="2">string</Street> <City id="3">string</City> <Zip id="4">string</Zip> </tnsTypes:Address> </soap:Body> </soap:Envelope>
修改使參數能/不能封裝在一個 XML 項目中
參數所對應的 XML 項目位於 SOAP 訊息的 Body 項目內時,可以將傳遞給 XML Web Service 方法的參數封裝在一個 XML 項目中。您已經知道,RPC 永遠將參數封裝在一個項目中。但是,使用 Document 格式化樣式時,您可以選擇要不要封裝。服務描述中的參數會對應至數個 SOAP 訊息,也就是所謂的訊息部分。參數封裝至一個 XML 項目時,參數會對應至單一訊息部分。相對地,參數未封裝時,可組成多重訊息部分。
若要指定將參數封裝至一個 XML 項目中
將 SoapDocumentMethod 屬性套用至呼叫相關 XML Web Service 方法之 Proxy 類別中的方法,並將 ParameterStyle 屬性設定為 Wrapped。
下列程式碼範例將
ParameterStyle
設定為Wrapped
,並將參數格式化樣式設定為 Literal。[SoapDocumentMethod("https://www.contoso.com/DocumentWrappedLiteral", RequestNamespace="https://www.contoso.com", ResponseNamespace="https://www.contoso.com", Use=SoapBindingUse.Literal, ParameterStyle=SoapParameterStyle.Wrapped)] public string DocumentWrappedLiteral(Address1 address, bool useZipPlus4) { [Visual Basic] <SoapDocumentMethod("https://www.contoso.com/DocumentWrappedLiteral", _ RequestNamespace:="https://www.contoso.com", _ ResponseNamespace:="https://www.contoso.com", _ Use:=SoapBindingUse.Literal, _ ParameterStyle:=SoapParameterStyle.Wrapped)> _ Public Function DocumentWrappedLiteral(ByVal address As Address1, _ ByVal useZipPlus4 As Boolean) As String
SOAP 要求的 XML 部分會將參數封裝至項目中,項目名稱依預設為 XML Web Service 方法名稱。
<?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="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <DocumentWrappedLiteral xmlns="https://www.contoso.com"> <MyAddress> <Street>string</Street> <City>string</City> <Zip>string</Zip> </MyAddress> <useZipPlus4>boolean</useZipPlus4> </DocumentWrappedLiteral> </soap:Body> </soap:Envelope>
SOAP 回應的 XML 部分封裝 XML Web Service 方法的 out 參數,並包括項目內的結果。根據預設,進行封裝的項目名稱為 XML Web Service 方法的名稱加上
Response
。<?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="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <DocumentWrappedLiteralResponse xmlns="https://www.contoso.com"> <DocumentWrappedLiteralResult>string </DocumentWrappedLiteralResult> </DocumentWrappedLiteralResponse> </soap:Body> </soap:Envelope>
若要指定參數直接跟隨 Body 項目
將 SoapDocumentMethod 屬性套用至呼叫相關 XML Web Service 方法之 Proxy 類別中的方法,並將 ParameterStyle 屬性設定為 Bare。
下列範例由 Wsdl.exe 產生,會將 ParameterStyle 設定為 Bare,並將參數格式化樣式設定為 Literal。因為無法將命名空間指定給封裝所有參數的項目,必須為每個參數和傳回值個別指定命名空間。若要這麼做,請將 XmlElementAttribute 套用至每個參數及傳回值,然後設定 Namespace 屬性。
[SoapDocumentMethod( "https://www.contoso.com/DocumentBareLiteral", Use=SoapBindingUse.Literal, ParameterStyle=SoapParameterStyle.Bare)] [return: XmlElement(Namespace="https://www.contoso.com", IsNullable=true)] public string DocumentBareLiteral( [XmlElement(Namespace="https://www.contoso.com", IsNullable=true)] Address1 MyAddress, [XmlElement(Namespace="https://www.contoso.com", IsNullable=false)] bool useZipPlus4) { [Visual Basic] <SoapDocumentMethod( _ https://www.contoso.com/DocumentBareLiteral", _ Use:=SoapBindingUse.Literal, _ ParameterStyle:= SoapParameterStyle.Bare)> _ Public Function DocumentBareLiteral( _ ByVal <XmlElement([Namespace]:="https://www.contoso.com", _ IsNullable:=true)> _ MyAddress As Address1, _ ByVal <XmlElement([Namespace]:="https://www.contoso.com", _ IsNullable:=false)> _ useZipPlus4 As Boolean) _ As <XmlElement([Namespace]:="https://www.contoso.com", _ IsNullable:=true)> _ String
SOAP 要求中,參數對應至的 XML 項目會直接接在 Body 項目後,並個別指定命名空間。
<?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="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <MyAddress xmlns="https://www.contoso.com"> <Street>string</Street> <City>string</City> <Zip>string</Zip> </MyAddress> <useZipPlus4 xmlns="https://www.contoso.com">boolean</useZipPlus4> </soap:Body> </soap:Envelope>
out 參數與傳回值會對應至 XML 項目,後面跟隨 SOAP 回應內的
Body
項目。根據預設,傳回值的項目名稱即等於 XML Web Service 方法的名稱,後面接著Result
。<?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="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <DocumentBareLiteralResult xmlns="https://www.contoso.com"> string</DocumentBareLiteralResult> </soap:Body> </soap:Envelope>
自訂 XML Web Service 方法預期的 SOAP
如果需要變更使用 ASP.NET 建立的 XML Web Service 所預期的 SOAP,可以使用與使用 ASP.NET 所建立的 XML Web Service 用戶端相同的機制。您可以控制對 XML 項目的參數對應,控制表示 XML Web Service 方法的 XML 項目,並控制項目內是否封裝對應項目。您可以使用同一個屬性,只要依照每個方法為基礎 — 也就是 SoapDocumentMethod 和 SoapRpcMethod。此外,您可以將對應的 SoapDocumentService 及 SoapRpcService 屬性套用至 XML Web Service,以 XML Web Service 層級進行預設格式化設定。將 SoapDocumentService 屬性套用至 XML Web Service 時,即可將其 XML Web Service 方法的預設方法格式化樣式設定為 Document。同樣地,SoapRpcService 屬性可將預設值設定為 RPC。
若要設定 XML Web Service 的預設方法格式化樣式
將 SoapRpcService 屬性或 SoapDocumentService 屬性套用至實作 XML Web Service 的類別。
下列程式碼範例將方法格式化樣式設定為 Document,並將預設參數格式化設定為 Literal,同時指定參數必須被封裝在單一項目中。
<%@ WebService Language="C#" Class="SoapDocumentServiceSample" %> using System.Web.Services; using System.Web.Services.Protocols; using System.Web.Services.Description; [SoapDocumentService(Use=SoapBindingUse.Literal, ParameterStyle=SoapParameterStyle.Wrapped)] [WebService(Namespace="https://www.contoso.com")] public class SoapDocumentServiceSample { [ WebMethod ] public string UseDefaultEncoding(Address MyAddress, bool useZipPlus4) { return "Use the default encodings for this XML Web service."; } } [Visual Basic] <%@ WebService Language="VB" Class="SoapDocumentServiceSample" %> Imports System.Web.Services Imports System.Xml.Serialization Imports System.Web.Services.Protocols Imports System.Web.Services.Description < SoapDocumentService(Use := SoapBindingUse.Literal, _ ParameterStyle := SoapParameterStyle.Wrapped)> _ Public Class SoapDocumentServiceSample < WebMethod > _ Public Function UseDefaultEncoding(MyAddress as Address, _ useZipPlus4 As Boolean) As String Return "Use the default formattings for this XML Web service." End Function End Class
UseDefaultEncoding
XML Web Service 方法預期的 SOAP 要求之 XML 部分會跟隨。<?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="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <UseDefaultEncoding xmlns="https://www.contoso.com"> <MyAddress> <Street>string</Street> <City>string</City> <Zip>string</Zip> </MyAddress> <useZipPlus4>boolean</useZipPlus4> </UseDefaultEncoding> </soap:Body> </soap:Envelope>
使用 XML 序列化自訂 SOAP 訊息
您不但可以指定參數格式化、XML Web Service 方法的格式化樣式,以及是否將參數封裝至一個項目中,還可以使用 XML 序列化直接自訂訊息。這在 XmlElement 屬性中已經稍微介紹,但是 System.Xml.Serialization 命名空間還包含許多可操作 XML 的屬性。由於 SOAP 使用 XML 將傳入傳出 XML Web Service 的資料加以編碼,所以 System.Xml.Serialization 命名空間中的屬性相當適於自訂傳入傳出 XML Web Service 的 SOAP。如需詳細資訊,請參閱 System.Xml.Serialization。
若要指定表示參數的 XML 項目名稱
將 XmlElement 屬性套用至參數,替每個項目指定想要的名稱。如果參數格式化設定為 Literal,您可以選擇設定命名空間。如果您將參數格式化設定為 Encoded,請記得將 SoapElement 屬性套用至參數。
下列程式碼範例預期表示參數的項目名稱為
MyAddressElement
、MyZipElement
及ReturnValueElement
。也預期表示傳回值的項目名稱為ReturnValueElement
。範例中 XML Web Service 方法的格式化為 ASP.NET 的預設值 Document。<%@ WebService Language="C#" Class="SoapDocumentServiceSample" %> using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Serialization; [WebService(Namespace="https://www.contoso.com")] public class SoapDocumentServiceSample { [ WebMethod ] [ return: XmlElement("ReturnValueElement",IsNullable=false)] public Address ValidateAddress( [XmlElement("MyAddressElement")] Address MyAddress, [XmlElement("MyZipElement")] bool useZipPlus4) { useZipPlus4 = true; return new Address(); } } [Visual Basic] <%@ WebService Language="VB" Class="SoapDocumentServiceSample" %> Imports System.Web.Services Imports System.Web.Services.Protocols Imports System.Xml.Serialization <WebService(Namespace := "https://www.contoso.com")> _ Public Class SoapDocumentServiceSample < WebMethod > _ Public Function ValidateAddress( _ <XmlElement("MyAddressElement")> MyAddress As Address, _ <XmlElement("MyZipElement")> useZipPlus4 As Boolean) As <XmlElement("ReturnValueElement",IsNullable :=false)> _ Address useZipPlus4 = True Return new Address() End Function End Class
XML Web Service 預期下列SOAP 要求。請注意,由於相對於參數名稱,項目的名稱與 XmlElement 屬性所指定的名稱相符。
<?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="https://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ValidateAddress xmlns="http://tempuri.org/"> <MyAddressElement> <Street>string</Street> <City>string</City> <Zip>string</Zip> </MyAddressElement> <MyZipElement>boolean</MyZipElement> </ValidateAddress> </soap:Body> </soap:Envelope>
請參閱
XML 序列化簡介 | System.Xml.Serialization 命名空間 | 使用 SOAP 擴充功能來變更 SOAP 訊息 | SoapDocumentMethodAttribute | SoapRpcMethodAttribute | SoapDocumentServiceAttribute | SoapRpcServiceAttribute | 使用 ASP.NET 建置 XML Web Service | 建置 XML Web Service 用戶端