SOAP 响应消息结构

本主题介绍 SOAP 响应消息结构,用它可以分析 SOAP 响应,而不用使用 Visual Studio 2005 提供的代理类。

SQL Server 2005 实例返回的 SOAP 响应消息可能包含下列一项或多项:

  • 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> 包含存储过程返回的输出参数(如果有)。

&lt;MethodNameResult&gt; 元素

操作的结果在 <MethodNameResult> 元素中返回,其中 MethodName 是存储过程或用户定义函数的名称,或者是即席批处理查询的 sqlbatchsqlbatch 是用来运行即席查询的方法。

在 <MethodNameResult> 元素中,结果按如下所示进行序列化:

  • SELECT 语句的结果包装在 <SqlRowSet> 元素中。在 <SqlRowSet> 元素中序列化的结果使用 DiffGram 序列化格式。DiffGram 格式是在 Microsoft .NET Framework 的 DataSet 组件中引入的。在这种情况下,响应还在数据前包含一个 XSD 架构(如果创建端点时已启用架构)。在 Visual Studio 2005 客户端,结果作为 System.Data.DataSet 对象返回。

    ms189558.note(zh-cn,SQL.90).gif注意:
    若要在使用 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 错误消息、警告和其他信息性消息包装在 <SqlMessage> 元素中,如以下 SOAP 响应片段所示:

    <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>
    

    以下 SOAP 响应片段是通过运行 GetCustomerInfo 存储过程返回的。有关此存储过程的信息,请参阅用于发送本机 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 类型对象返回。

&lt;OutputParameter&gt; 元素

每个输出参数值在返回时都包装在一个元素中。元素名称就是输出参数的名称。请注意,此元素作为 <MethodNameResponse> 元素的最后一个子元素显示在 <MethodNameResult> 元素之后,如以下 SOAP 响应片段所示。返回了两个输出参数。

<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 服务的指导原则和限制

其他资源

编写客户端应用程序

帮助和信息

获取 SQL Server 2005 帮助