Структура сообщения-ответа SOAP
Этот подраздел описывает структуру сообщений-ответов SOAP, если необходимо проанализировать ответ SOAP вместо использования классов учетной записи-посредника, предоставленных средой Visual Studio 2005.
Сообщение-ответ SOAP, возвращенное экземпляром SQL Server 2005, может включать одно или более из следующего:
- Результирующий набор запросов SELECT.
- Код возврата хранимых процедур и пользовательских функций.
- Число строк таблицы. Это число строк таблицы, затронутых запросом.
- Значения параметров выходных данных.
- Сообщения об ошибках или предупреждениях.
Ниже приведен фрагмент структуры ответов SOAP, возвращаемой SQL Server после выполнения хранимой процедуры:
Результаты операции упакованы в элемент <MethodNameResponse>
в теле SOAP. Элемент <MethodNameResponse>
может включать следующие дочерние элементы:
- Элемент
<MethodNameResult>
включает результаты, значения подсчета строк таблицы, сообщения об ошибках и предупреждения. - Элемент
<OutputParameter>
включает параметры выходных данных (при их наличии), возвращенных хранимыми процедурами.
Элемент <MethodNameResult>
Результаты операции возвращаются внутри элемента <MethodNameРезультат>, где MethodName является либо названием хранимой процедуры или пользовательской функции, либо методом sqlbatch для нерегламентированных пакетных запросов. sqlbatch — метод, используемый для выполнения нерегламентированных запросов.
Внутри элемента <MethodNameРезультат> результаты сериализуются следующим образом:
Результаты инструкции SELECT упаковываются в элемент <SqlRowSet>. Результаты, упорядоченные в элементе <SqlRowSet>, используют формат сериализации DiffGram. Формат DiffGram вводится в компонент DataSet в среде Microsoft .NET Framework. В этом случае ответ также включает XSD-схему (если схема включена для созданной конечной точки) перед данными. В клиенте Visual Studio 2005 результаты возвращаются как объекты System.Data.DataSet.
Примечание. Для загрузки результатов SOAP в объекты System.Data.DataSet при использовании клиента Visual Studio 2005 SQL Server 2005 должен включать встроенные схемы в ответы SOAP, возвращаемые клиентам. Такое поведение включается для конечных точек либо исключением ключевого слова SCHEMA, либо указанием SCHEMA=STANDARD при создании конечной точки. Дополнительные сведения см. в разделе CREATE ENDPOINT (Transact-SQL). Результат инструкции SELECT... FOR XML упаковывается в элемент <SqlXml>. Если возвращается несколько результирующих наборов (например, хранимая процедура с несколькими запросами SELECT...FOR XML), каждый результирующий набор упаковывается в свой элемент <SqlXml>. Кроме того, за каждым результатом следует элемент <SqlRowCount>. Элемент возвращает число строк таблицы, затронутых запросом, как показано в следующем фрагменте ответа:
<?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>
Если запрос SELECT... FOR XML запрашивает XSD-схему, указывая параметр XMLSCHEMA, XSD-схема возвращается, как первый дочерний элемент элемента <SqlXml>.
В клиенте Visual Studio 2005 результаты возвращаются как объекты System.Xml.XmlElement.Значения кода возврата из хранимых процедур и пользовательских функций упаковываются в элемент <SqlResultCode>, как показано в следующем фрагменте ответа:
<tns:MethodNameResponse>
<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>
В клиенте Visual Studio 2005 код возврата возвращается как объект.
Сообщения об ошибках, предупреждения и другие информационные сообщения SQL Server 2005 упаковываются в элемент <SqlMessage>, как показано в следующем фрагменте ответа SOAP:
<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>
Следующий фрагмент ответа SOAP возвращается запуском хранимой процедуры GetCustomerInfo. Дополнительные сведения об этой хранимой процедуре см. в разделе Образцы приложений, отправляющих запросы к собственным веб-службам с поддержкой XML. Первая инструкция INSERT в хранимой процедуре завершается неуспешно. Это приводит к следующему ответу:
<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>
В клиенте Visual Studio 2005 эти результаты возвращаются как объекты типа SqlMessage.
Элемент <OutputParameter>
Каждое значение параметра выходных данных возвращается упакованным в элемент. Название элемента является названием параметра выходных данных. Обратите внимание, что этот элемент появляется после элемента <MethodNameРезультат> как последний дочерний элемент элемента <MethodNameResponse>; это показано в следующем фрагменте ответа SOAP. Возвращаются два параметра выходных данных.
<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>
См. также
Справочник
Отправка SOAP-запросов с использованием клиента Visual Studio 2005 (C#)
Отправка запросов SOAP с помощью клиента Visual Studio 2005 (Visual Basic)
Настройка сервера на прослушивание запросов собственных веб-служб с поддержкой XML
Структура запроса и ответного сообщения SOAP
Правила и ограничения собственных веб-служб с поддержкой XML
Другие ресурсы
Написание клиентских приложений