使用 Visual Studio 2005 客户端发送 SOAP 请求 (C#)

后续版本的 Microsoft SQL Server 将删除该功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。

本主题介绍了一个示例应用程序,其中 Visual Studio 2005 客户端向 SQL Server 实例发送 SOAP 请求,并处理 SOAP 响应。这些请求是为用于发送本机 XML Web 服务请求的示例应用程序中创建的端点方法而发送的。

若要使用此应用程序,建议您先熟悉一下设置服务器以侦听本机 XML Web 服务请求编写客户端应用程序中提供的概念和步骤信息。

注意注意

此示例应用程序需要进行一些初始设置。在继续示例应用程序之前,请按照用于发送本机 XML Web 服务请求的示例应用程序中说明的步骤进行操作。

发送 SOAP 请求

在此应用程序中,需要创建一个包含按钮和文本框的窗体,用来向端点发送 SOAP 请求。

发送对 GetCustomerInfo 存储过程的 SOAP 请求后,将作为输入参数传入文本框中提供的客户 ID 值。如果在文本框中未指定任何值,则将假定一个空字符串,并返回其 CustomerID 值为空字符串的客户。如果输入了 NULL(空),则将返回 CustomerID 值为 NULL 的客户。注意,这种情况发生时,xsi:nil = 'true' 属性将自动添加到 SOAP 请求中以指明 NULL 参数值。

GetCustomerInfo 存储过程旨在显示如何处理输入参数、输出参数、错误消息和结果。应用程序也会为用户定义函数发送 SOAP 请求。另外,它还为下列特殊查询发送 SOAP 请求:

  • 检索所有雇员的 SELECT 查询。

  • 检索其 ID 作为输入的雇员的 SELECT 查询。

处理 SOAP 响应

当以一个对象数组的形式返回 SOAP 请求的结果时,客户端应用程序将标识数组中每个对象的类型,然后相应处理对象。然后,应用程序将显示有关每个对象数组元素的下列信息:

  • 数组元素中值的数据类型。

  • 值:结果集、返回代码和输出参数值等。

创建工作示例

因为创建此示例时必须执行许多步骤,所以将应用程序分为下列五个部分:

  • 第一部分:执行 GetCustomerInfo 存储过程

  • 第二部分:执行 SP

  • 第三部分:执行无参数的 SQL 查询

  • 第四部分:执行有参数的 SQL 查询

  • 第五部分:执行用户定义函数

每部分都提供一组说明。在每部分的末尾,可以测试应用程序。

第一部分:执行 GetCustomerInfo 存储过程

  1. 在客户端计算机上,从 Microsoft Visual Studio 2005 程序组启动 Visual Studio 2005。

  2. 单击**“新建项目”**。

  3. 将**“Visual C# 项目”选择为“项目类型”**。

  4. 将 NativeSOAPApp1 指定为项目名

  5. 指定想要保存项目的位置。

  6. 选择**“Windows 应用程序”作为模板,然后单击“确定”**。

  7. 在“解决方案资源管理器”窗口中,右键单击**“引用”,然后选择“添加 Web 引用”。添加 Web 引用的另一种方法是从“项目”菜单中选择“添加 Web 引用”**。

  8. 在**“地址”**框中,键入 https://Server/sql?wsdl,然后按 Enter 键。注意,必须在 URL 中输入服务器名。

  9. 单击**“添加引用”**。这将创建所需的代理类,以便调用 WSDL 文档中的方法。

第二部分:执行 SP

  1. 在“视图”菜单上,单击**“工具箱”**以在“Form1.cs [设计]”窗格中打开工具箱。另外,还可以按 CTRL + ALT + X 打开工具箱。

  2. 在 Form1 中,添加一个文本框 (textBox1)、一个按钮 (button1) 和一个列表框 (listBox1)。

  3. 右键单击文本框,然后选择**“属性”**。将 Text 值从 textBox1 更改为 1。这是默认的 Customer ID 值。

  4. 右键单击 button1,再选择**“属性”**。

    1. Text 属性值从 button1 更改为 ExecSP。

    2. 将 (name) 属性值更改为 ExecSP。

  5. 右键单击列表框 (listBox1),再选择**“属性”**。将 HorizontalScrollbar 属性值更改为 True

  6. 双击 ExecSP

  7. ExecSP 的 C# 代码列表中的代码复制到此函数。

  8. 更新代码。用使用 CREATE ENDPOINT 创建端点时所标识的主机名更改对 server 的引用。

  9. 保存并编译项目。有关详细信息,请参阅前面的“编写代码”一节。

第三部分:不使用参数执行 SQL 查询

本部分的客户端应用程序执行一个特殊查询(FOR XML 查询),该查询会从 AdventureWorks 数据库的 Employee 表中检索雇员。

  1. 在 Form1 的**“[设计]”**选项卡上,添加另一个按钮 (button1)。

  2. 右键单击此新按钮,再选择**“属性”**。

    1. Text 属性值从 button1 更改为 BatchQueryFindAllEmps。

    2. 将(name)属性值更改为 BatchQueryFindAllEmps。

  3. 双击 BatchQueryFindAllEmps

  4. BatchQueryFindAllEmps 的 C# 代码列表中的代码复制到此函数。

  5. 更新代码。用使用 CREATE ENDPOINT 创建端点时所标识的主机名更改对 server 的引用。

  6. 保存并编译项目。有关详细信息,请参阅前面的“编写代码”一节。

第四部分:使用参数执行 SQL 查询

除了即席查询的 SOAP 请求包含查询参数之外,此部分与上一部分类似。FOR XML 查询可检索指定雇员 ID 的雇员信息。

  1. 在 Form1 的**“[设计]”**选项卡上,添加一个按钮 (button1)

  2. 右键单击此新按钮,再选择**“属性”**。

    1. Text 属性值从 button1 更改为 BatchQueryFindAnEmp。

    2. 将**“(名称)”**属性值更改为 BatchQueryFindAnEmp。

  3. 双击 BatchQueryFindAnEmp

  4. BatchQueryFindAnEmp 的 C# 代码列表中的代码复制到此函数。

  5. 更新代码。用使用 CREATE ENDPOINT 创建端点时所标识的主机名更改对 server 的引用。

  6. 保存并编译项目。有关详细信息,请参阅前面的“编写代码”一节。

第五部分:执行用户定义函数

在此部分中,客户端应用程序会发送 SOAP 请求调用 UDFReturningScalar Web 方法。此 Web 方法对应于返回整数值的用户定义函数。

  1. 在 Form1 的**“[设计]”**选项卡上,添加一个按钮 (button1)

  2. 右键单击此新按钮,再选择**“属性”**。

    1. Text 属性值从 button1 更改为 ExecUDFReturningScalar。

    2. 将**“(名称)”**属性值更改为 ExecUDFReturningScalar。

  3. 双击 ExecUDFReturningScalar

  4. ExecUDFReturningScalar 的 C# 代码列表中的代码添加到此函数。

  5. 更新代码。用使用 CREATE ENDPOINT 创建端点时所标识的主机名更改对 server 的引用。

  6. 保存并编译项目。有关详细信息,请参阅前面的“编写代码”一节。

  7. 单击 ExecUDFReturningScalar。用户定义函数中的返回值将显示在列表框中。

由于端点指定集成身份验证,因此代码中将显示以下行:proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;

如果使用 SQL Server 身份验证,我们建议删除此行并用实现 WS-Security 标头的代码替换它,以提供基于 SQL Server 的身份验证凭据。有关详细信息,请参阅 通过 SOAP 的 SQL Server 身份验证

注意注意

如果正在使用 SQL Server 身份验证或基本身份验证,则 SQL Server 要求您使用安全套接字层 (SSL) 对用户凭据进行安全加密传输,否则会以可见的明文形式传输。有关使 SSL 能与 HTTP 端点一起使用的详细信息,请参阅配置 SSL 使用的证书

编译代码

SQL Server 在其安装过程中将安装 .NET Framework 2.0。这些编写指令使用最新的 .NET Framework。(这是 \WINDOWS\Microsoft.NET\Framework 文件夹中的最大编号)。

编写示例代码

  1. 保存整个项目。

  2. 打开命令提示,找到保存项目的文件夹。

  3. 在此文件夹中,从 Web Reference\Server 子文件夹中复制文件 Reference.cs。(例如,复制“Web Reference\Server\Reference.cs”。)Form1.cs 文件和 Reference.cs 文件应该在同一文件夹中。

  4. 编译代码,并指定可执行 (.exe) 文件的名称。例如,如果可执行文件的名称为 NativeSOAPApp1.exe,则命令行将显示为:

    \WINDOWS\Microsoft.NET\Framework\v2.0.xxxxx\csc.exe /out:NativeSOAPApp1.exe Form1.cs Reference.cs

    xxxxx 是与 .NET Framework 版本对应的文件夹编号。

    这样就在当前目录中创建了可执行文件 (NativeSOAPApp1.exe)。

如果使用的是 .NET Framework 的早期版本,则可能会接收到运行时错误。如果出现此错误,请尝试在 SELECT 语句的结尾处添加 FOR XML AUTO 子句以更新 GetCustomerInfo 存储过程,如下所示:

SELECT TOP 3 SalesOrderID, OrderDate 
FROM   SalesOrderHeader
WHERE  CustomerID = @CustomerID
FOR XML AUTO

该存储过程的执行结果将显示在列表框中。