SOAP 応答メッセージの構造
このトピックでは、Visual Studio 2005 で提供されるプロキシ クラスを使用しないで SOAP 応答を解析する場合の、SOAP 応答メッセージの構造について説明します。
SQL Server 2005 のインスタンスから返される SOAP 応答メッセージには、次のうちの 1 つ以上の情報が含まれます。
- SELECT クエリの結果セット。
- ストアド プロシージャとユーザー定義関数のリターン コード。
- 行数。これはクエリによって処理された行数です。
- 出力パラメータ値。
- エラー メッセージや警告。
ストアド プロシージャが実行された後に SQL Server によって返される SOAP 応答構造の一部を次に示します。
<?xml version="1.0" encoding="utf-8" ?>
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
...>
<SOAP-ENV:Body>
<method:MethodNameResponse>
<method:MethodNameResult
xsi:type="sqlresultstream:SqlResultStream">
<!--
the results are returned here
-->
</method:MethodNameResult>
<method:OutputParam>Value</method:OutputParam>
</method:MethodNameResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
操作の結果は、SOAP 本文の <MethodNameResponse>
要素にラップされます。<MethodNameResponse>
要素には、次の子要素を含めることができます。
<MethodNameResult>
には、結果、行数値、およびエラー メッセージや警告が含まれます。<OutputParameter>
には、ストアド プロシージャによって返される出力パラメータがあれば、その出力パラメータが含まれます。
<MethodNameResult> 要素
操作の結果は、<MethodNameResult> 要素の内部に返されます。ここで、MethodName は、ストアド プロシージャ名かユーザー定義関数名のいずれか、またはアドホック バッチ クエリの sqlbatch です。sqlbatch は、アドホック クエリを実行するために使用されるメソッドです。
<MethodNameResult> 要素内では、結果が次のようにシリアル化されます。
SELECT ステートメントの結果は、<SqlRowSet> 要素にラップされます。<SqlRowSet> 要素にシリアル化される結果では、DiffGram シリアル化形式が使用されます。DiffGram 形式は、Microsoft .NET Framework の DataSet コンポーネントに導入されています。この場合、スキーマが有効な状態でエンドポイントが作成されると、応答のデータの前には XSD スキーマも含まれます。Visual Studio 2005 クライアントでは、結果が System.Data.DataSet オブジェクトとして返されます。
メモ : Visual Studio 2005 を使用しているときに、SOAP の結果を System.Data.DataSet オブジェクトに読み込むには、SQL Server 2005 では、クライアントに返される SOAP 応答にインライン スキーマが含まれている必要があります。エンドポイントでこの動作を有効にするには、エンドポイントを作成するときに SCHEMA キーワードを省略するか、SCHEMA=STANDARD を指定します。詳細については、「CREATE ENDPOINT (Transact-SQL)」を参照してください。 SELECT... FOR XML ステートメントの結果は、<SqlXml> 要素にラップされます。複数の SELECT...FOR XML クエリを含むストアド プロシージャなど、複数の結果セットが返される場合は、各結果セットがそれぞれ <SqlXml> 要素にラップされます。また、各結果の後に <SqlRowCount> 要素が続きます。この要素は、次の応答の例に示すように、クエリによって処理された行数を返します。
<tns:MethodNameResponse> <tns:MethodNameResult xsi:type="sqlsoaptypes:SqlResultStream"> <sqlresultstream:SqlXml xsi:type="sqlsoaptypes:SqlXml" > <SqlXml> <!-- XML result --> </SqlXml> </sqlresultstream:SqlXml> <sqlresultstream:SqlRowCount xsi:type="sqlrowcount:SqlRowCount"> <sqlrowcount:Count>NoOfRowsAffected</sqlrowcount:Count> </sqlresultstream:SqlRowCount> <sqlresultstream:SqlXml xsi:type="sqlsoaptypes:SqlXml" > <SqlXml> <!-- XML Document that maps to XMLElement object in the client--> </SqlXml> </sqlresultstream:SqlXml> <sqlresultstream:SqlRowCount xsi:type="sqlrowcount:SqlRowCount"> <sqlrowcount:Count>NoOfRowsAffected</sqlrowcount:Count> </sqlresultstream:SqlRowCount> <!-- more results ...--> </tns:MethodNameResult> <tns:OutputParam>Value</tns:OutputParam> </tns:MethodNameResponse>
SELECT... FOR XML クエリに XMLSCHEMA オプションを指定して XSD スキーマを要求する場合、要求された XSD スキーマは <SqlXml> 要素の最初の子要素として返されます。
Visual Studio 2005 クライアントでは、結果が System.Xml.XmlElement オブジェクトとして返されます。ストアド プロシージャやユーザー定義関数からのリターン コード値は、次の応答の例に示すように <SqlResultCode> 要素にラップされます。
<tns:MethodNameResponse>
<tns:MethodNameResult xsi:type="sqlsoaptypes:SqlResultStream"> <!-- results --> <sqlresultstream:SqlResultCode xsi:type="sqlsoaptypes:SqlResultCode"> ReturnCodeValue </sqlresultstream:SqlResultCode> </tns:MethodNameResult> <tns:OutputParam>Value</tns:OutputParam> </tns:MethodNameResponse>
Visual Studio 2005 クライアントでは、リターン コードがオブジェクトとして返されます。
SQL Server 2005 エラー メッセージ、警告、およびその他の情報メッセージは、次の SOAP 応答の例に示すように <SqlMessage> 要素にラップされます。
<tns:MethodNameResponse> <tns:MethodNameResult xsi:type="sqlresultstream:SqlResultStream"> <sqlresultstream:SqlMessage> <!-- Error message returned as SqlMessage object in the client --> </sqlresultstream:SqlMessage> ... </tns:MethodNameResult> <!-- followed by one or more return parameters -> ... </tns:MethodNameResponse>
GetCustomerInfo ストアド プロシージャを実行することによって、次の例に示すような SOAP 応答が返されます。このストアド プロシージャの詳細については、「ネイティブ XML Web サービス要求を送信する場合のサンプル アプリケーション」を参照してください。ストアド プロシージャの最初の INSERT ステートメントは失敗します。その結果、次の応答が行われます。
<method:GetCustomerInfoResponse> <method:GetCustomerInfoResult xsi:type="sqlresultstream:SqlResultStream"> <sqlresultstream:SqlMessage> <sqlresultstream:SqlMessage xsi:type="sqlmessage:SqlMessage"> <sqlmessage:Class>16</sqlmessage:Class> <sqlmessage:LineNumber>12</sqlmessage:LineNumber> <sqlmessage:Message>Cannot insert the value NULL into column 'CompanyName', table 'Northwind.dbo.Customers'; column does not allow nulls. INSERT fails. </sqlmessage:Message> <sqlmessage:Number>515</sqlmessage:Number> <sqlmessage:Procedure>GetCustomerInfo</sqlmessage:Procedure> <sqlmessage:Server>SQLServerName</sqlmessage:Server> <sqlmessage:Source>MicrosofTransact- SQL/9.0</sqlmessage:Source> <sqlmessage:State>2</sqlmessage:State> </sqlresultstream:SqlMessage> <sqlresultstream:SqlRowCount xsi:type="sqlrowcount:SqlRowCount"> <sqlrowcount:Count>0</sqlrowcount:Count> </sqlresultstream:SqlRowCount> <sqlresultstream:SqlResultCode xsi:type="sqlsoaptypes:SqlResultCode">-6 </sqlresultstream:SqlResultCode> </method:GetCustomerInfoResult> <!-- followed by one or more output parameters -> </method:GetCustomerInfoResponse> </tns:MethodNameResponse>
Visual Studio 2005 クライアントでは、これらの結果が SqlMessage 型のオブジェクトとして返されます。
<OutputParameter> 要素
各出力パラメータ値は、1 つの要素にラップされて返されます。要素名は、出力パラメータの名前になります。この要素は、<MethodNameResponse> 要素の最後の子要素として、<MethodNameResult> 要素の後に示されます。これを、次の SOAP 応答の例に示します。この例では 2 つの出力パラメータが返されます。
<tns:MethodNameResponse>
<tns:MethodNameResult xsi:type="sqlresultstream:SqlResultStream">
<!-- results, error messages and warnings -->
</tns:MethodNameResult>
<tns:OutputParam1>Value</tns:OutputParam1>
<tns:OutputParam2>Value</tns:OutputParam2>
</tns:MethodNameResponse>
参照
関連項目
Visual Studio 2005 クライアントを使用した SOAP 要求の送信 (C#)
Visual Studio 2005 クライアントを使用した SOAP 要求の送信 (Visual Basic)
ネイティブ XML Web サービス要求をリッスンするためのサーバーの設定
SOAP の要求メッセージと応答メッセージの構造
ネイティブ XML Web サービスのガイドラインと制限事項