SOAP メッセージのカスタマイズ
ASP.NET を使用して作成した XML Web サービスと、SOAP を使用して XML Web サービス メソッドと通信する XML Web サービス クライアントでは、サーバーとの間で送受信される SOAP メッセージの書式を制御するための高度な機構を使用できます。SOAP では、XML Web サービスとの間で送受信される SOAP メッセージの内容を XML 形式で示す必要があります。ただし、XML の書式は厳密には規定されていません。異なる書式を必要とする XML Web サービスを使用するための機構として、ASP.NET は、SOAP メッセージに含まれる XML の書式を制御できるような属性ベースの機構を提供します。さらに、ネットワーク経由で送信される SOAP の要素名と属性名を指定するための属性ベースの機構によって、SOAP をより詳細なレベルで制御できるようになります。
XML Web サービスとそのクライアント間の通信では、通常、SOAP と Web サービス記述言語 (WSDL: Web Services Description Language) の 2 つの業界標準が使用されます。SOAP では、Body 要素の下に表示されるデータの書式指定スキームや、その Body 要素内でパラメータを書式指定する方法を示す書式指定スキームが定義されています。前者は、SOAP セクション 7 または単に RPC と呼ばれます。SOAP 仕様の詳細については、W3C Web サイト (http://www.w3.org/TR/SOAP) を参照してください。後者は、SOAP セクション 5 または単に Encoded と呼ばれます。WSDL は、XML Web サービスによって要求される SOAP メッセージを記述するために使用し、これにより XML Web サービスがエンコード済みのパラメータを含む RPC メッセージを受け入れるように指定できますが、WSDL では Literal と Document という他の語も定義されています。Literal は、Encoded と同様にパラメータの書式指定の方法を示します。Document は、RPC と同様に、Body 要素全体の書式指定の方法を示します。
XML Web サービス クライアントが送信する SOAP のカスタマイズ
ASP.NET を使用して作成した XML Web サービスでサポートされる書式指定スタイルと、各組み合わせを実現する属性の概要を次の表に示します。Service サフィックスが付いた属性は XML Web サービスを実装するクラスに適用でき、そのクラス内の XML Web サービス メソッドに既定の書式指定スタイルを設定できます。Method サフィックスが付いた属性は XML Web サービス メソッドまたは XML Web サービス メソッドを呼び出すプロキシ クラスのメソッドだけに適用できます。各組み合わせの詳細については、以降で説明します。
SOAP Body 全体の書式指定 | ||
---|---|---|
パラメータの書式指定 | ドキュメント ベースの SOAP メッセージ | SOAP セクション 7 に基づいた RPC ベースの SOAP メッセージ |
Literal 各パラメータの XSD スキーマに基づく | SoapDocumentMethod または SoapDocumentService Use=Literal これは、既定の設定です。 | サポートなし |
Encoded - SOAP セクション 5 エンコーディング規則 | SoapDocumentMethod または SoapDocumentService Use=Encoded | SoapRpcMethod または SoapRpcService |
パラメータの書式指定の変更
XML Web サービスのデザイン時に最初に決定する事項の 1 つとして、SOAP 要求内の XML をエンコードする方法が挙げられます。具体的には、XML ドキュメントを厳密に XSD スキーマに準拠させるか、SOAP 仕様のセクション 5 および 7 で規定されている書式指定の規則に従うかを決定します。SOAP 仕様のセクション 5 および 7 の書式指定の規則では、バリエーションが考慮されます。したがって、SOAP エンコーディング規則を使用する SOAP 要求の受信側では、可能なバリエーションをすべて処理する必要があります。XML Web サービス メソッドに対して XSD スキーマを定義することで、SOAP 要求で送信する必要がある内容を具体的に定義できます。ASP.NET を使用して作成した XML Web サービスの既定では、スキーマに基づくドキュメントが受け渡しされます。
XML Web サービス メソッドに渡すパラメータが、SOAP 要求または SOAP 応答で渡されるデータの大部分を占めるため、XML 要素にパラメータを割り当てる方法によって、XML ドキュメントのスタイルが決まります。Web サービス記述言語 (WSDL) では、パラメータの 2 つの書式指定スタイルとして Encoded および Literal が定義されています。Encoded は、SOAP 仕様のセクション 5 で規定されている SOAP エンコーディングを使用してパラメータの書式を指定することを示します。Literal は、定義済みの XSD スキーマを使用して、各パラメータに対して XML 要素を割り当てることを示します。
XML Web サービス クライアントでは、パラメータを XML 要素に割り当てて、XML Web サービスが要求する内容と一致させる方法を選択できます。XML Web サービスでは、パラメータ書式指定スタイルとして Literal と Encoded がサポートされています。このサポート内容は、XML Web サービス メソッドの書式指定の選択に応じて変わります。詳細については、「SOAP Body 全体の書式指定の変更」を参照してください。
ASP.NET では、XML の書式指定の方法を制御するための拡張アーキテクチャが用意されていますが、パラメータがシリアル化される順序は保証されません。
パラメータ書式指定スタイルとして Literal を指定するには
SoapDocumentMethod 属性をプロキシ クラスのメソッドに適用し、Use プロパティを SoapBindingUse.Literal に設定します。
SoapBindingUse 列挙体は、ASP.NET を使用して作成した XML Web サービスで使用できるパラメータ書式指定スタイルを指定します。
[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 サービス メソッドに対する SOAP 要求の XML 部分を次に示します。これらのパラメータは Body 要素内にあり、XSD スキーマを参照するため、独立した 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 属性をプロキシクラスのメソッドに適用し、Use プロパティを SoapBindingUse.Encoded に設定します。
Literal パラメータ書式指定スタイルとは異なり、Encoded パラメータ書式指定スタイルは、XML Web サービス メソッドの両方の書式指定スタイルと組み合わせて使用できます。XML Web サービス メソッドの書式指定スタイルの詳細については、「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 部分を次に示します。これらのパラメータは、SOAP 仕様のセクション 5 で規定されたエンコーディング規則を使用して書式指定されるため、その表現方法が Literal 書式指定スタイルとは大きく異なります。特に、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 では、SOAP 要求または SOAP 応答の Body 要素内にある、操作を呼び出す XML Web サービス メソッドの書式指定方法として RPC と Document の 2 つのスタイルが定義されています。ASP.NET では、Document と RPC 双方の書式指定スタイルがサポートされます。Document が既定値です。
RPC スタイルは、RPC 用に SOAP を使用するための SOAP 仕様 (SOAP 仕様のセクション 7 とも呼ばれる) に従った Body 要素の書式指定を示します。このスタイルでは、すべてのパラメータが XML Web サービス メソッドに基づいた名前の単一の要素内にカプセル化され、その要素内の各要素が、それぞれ対応するパラメータ名に基づいた名前になります。また、SOAP 応答の書式指定方法の規則も記述されています。
Document スタイルでは、Body 要素の書式として、Body 要素があり、その下に一連の 1 つ以上のメッセージ部分が続くことを示します。個々のメッセージ部分の書式指定方法は、SoapDocumentMethod 属性の Use プロパティと ParameterStyle プロパティによって決定されます。Use プロパティは、パラメータの書式を Encoded または Literal のいずれにするかを決定します。ParameterStyle は、パラメータを Body 要素の下にある単一のメッセージ部分にカプセル化するかどうか、各パラメータを個々のメッセージ部分にカプセル化するかどうかを決定します。ParameterStyle プロパティの設定の詳細については、「パラメータを 1 つの XML 要素にカプセル化するかどうかに関する変更」を参照してください。
Document 書式指定スタイルを指定するには
適切な XML Web サービス メソッドを呼び出すプロキシ クラスのメソッドに SoapDocumentMethod 属性を適用します。
Document 書式指定スタイルを指定すると、ASP.NET を使用して作成した XML Web サービスでは、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 書式指定スタイルで要求されているように、SOAP 要求および SOAP 応答を定義するサービスの説明に XSD スキーマが定義されます。
DocumentWrappedLiteral
XML Web サービス メソッドに対する SOAP 要求について、サービスの説明からの引用部を次に示します。DocumentWrappedLiteral
XML Web サービス メソッドの最初のパラメータがクラスで、Literal パラメータ書式指定スタイルが指定されているため、address
型に対して XSD スキーマが作成されます。<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
XML Web サービス メソッドの 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 書式指定スタイルを指定するには
適切な XML Web サービス メソッドを呼び出すプロキシ クラスのメソッドに SoapRpcMethod 属性を適用します。
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 要求を参照して、パラメータが 1 つの要素内にカプセル化され、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>
パラメータを 1 つの XML 要素にカプセル化するかどうかに関する変更
SOAP メッセージの Body 要素にある XML 要素に XML Web サービス メソッドのパラメータを割り当てると、そのパラメータを 1 つの XML 要素内にカプセル化できます。既に説明したように、RPC では常にパラメータを 1 つの要素内にカプセル化します。ただし、Document 書式指定スタイルの使用時にはカプセル化するかどうかを選択できます。サービスの説明では、パラメータがメッセージ部分と呼ばれる、SOAP メッセージの複数の部分に割り当てられます。パラメータが 1 つの XML 要素内にカプセル化される場合、パラメータは単一のメッセージ部分に割り当てられます。それに対し、パラメータが 1 つの XML 要素内にカプセル化されない場合には、パラメータは複数のメッセージ部分を構成します。
パラメータを 1 つの XML 要素にカプセル化することを指定するには
適切な XML Web サービス メソッドを呼び出すプロキシ クラスのメソッドに SoapDocumentMethod 属性を適用し、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 サービス メソッドに基づいた名前が付いた要素に、パラメータがカプセル化されます。
<?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 サービス メソッドの Out パラメータがカプセル化されます。カプセル化する側の要素の名前は、既定では
Response
が追加された XML Web サービス メソッドの名前になります。<?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 要素の後に直接パラメータを続けることを指定するには
適切な XML Web サービス メソッドを呼び出すプロキシ クラスのメソッドに SoapDocumentMethod 属性を適用し、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 パラメータは、SOAP 応答内にある
Body
要素に続く XML 要素に割り当てられます。戻り値の要素名は、既定ではResult
サフィックスが付いた XML Web サービス メソッドの名前になります。<?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 サービス メソッドによって要求される SOAP のカスタマイズ
ASP.NET を使用して作成した XML Web サービスが要求する SOAP を変更する必要がある場合は、ASP.NET を使用して作成した XML Web サービス クライアントで利用可能な機構を利用できます。これによって、XML 要素へのパラメータの割り当て、XML Web サービス メソッドを表す XML 要素、および割り当てられた要素を 1 つの要素内にカプセル化するかどうかを制御できます。SoapDocumentMethod および SoapRpcMethod などのメソッドごとに、同じ属性を使用できます。さらに、対応する SoapDocumentService 属性と SoapRpcService 属性を XML Web サービスに適用することで、XML Web サービス レベルで既定の書式指定を設定できます。SoapDocumentService 属性を XML Web サービスに適用すると、その XML Web サービス メソッドの既定のメソッド書式指定スタイルが Document に設定されます。同様に、SoapRpcService 属性を適用すると、既定値は RPC に設定されます。
XML Web サービスの既定のメソッド書式指定スタイルを設定するには
XML Web サービスを実装するプロキシ クラスに SoapRpcService 属性または SoapDocumentService 属性のいずれかを適用します。
メソッドの書式指定スタイルを Document に、パラメータの既定の書式指定を Literal に設定し、パラメータを 1 つの要素内にカプセル化するコード例を次に示します。
<%@ 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 サービス メソッドによって要求される 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 サービス メソッドの書式指定スタイル、およびパラメータを 1 つの要素内にカプセル化するかどうかを指定するだけでなく、XML のシリアル化を使用して SOAP メッセージを直接カスタマイズできます。XmlElement 属性については既にある程度説明しましたが、System.Xml.Serialization 名前空間には、XML を操作するための数多くの属性が含まれています。SOAP では XML を使用して XML Web サービスとの間で送受信されるデータをエンコードするため、System.Xml.Serialization 名前空間の属性は、XML Web サービスとの間で送受信される SOAP のカスタマイズに適しています。詳細については、「System.Xml.Serialization」を参照してください。
パラメータを表す XML 要素の名前を指定するには
XmlElement 属性をパラメータに適用し、要素に必要な名前を指定します。パラメータの書式指定が Literal に設定されている場合には、オプションとして名前空間も指定できます。パラメータの書式指定が Encoded に設定されている場合、SoapElement 属性をパラメータに適用します
パラメータを表す要素名として
MyAddressElement
、MyZipElement
、およびReturnValueElement
を要求するコード例を次に示します。また、戻り値を表す要素名としてReturnValueElement
を要求します。次のコード例の XML Web サービス メソッドの書式指定は Document で、この値が ASP.NET の既定です。<%@ 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 サービスは、次の 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 サービスの作成 | XML Web サービス クライアントの作成