引言 使用SQLXML 的Web 服务从你的ASP.NET应用程序中直接访问XML 数据
SQLXML 是扩展SQL 服务器现有的对检索和储存XML 数据的支持的一套附加的工具。 有了SQLXML 3.0,你现在就能使用SQL服务器展示Web 服务了。在SQLXML的Web 服务可以让用户执行存储过程,用户定义的功能,并且它们支持模板。
在这篇文章中,你将看出怎样展示一个作为Web 服务并构建一个简单ASP.NET 基于Web 表单的客户端并访问和测试Web 服务的存储过程。 你应该有对SQL Server 2000和IIS 基本的理解,包括如何在IIS中安装虚拟目录以及怎样在SQL Server中设置用户许可。 你可以在 SQL Server 2000 Books Online 和SQLXML 3.0 Documentation 中找到相关的主题。在此之前,你需要一个SQL Server 2000 的实例,一台运行IIS的Windows 2000 服务器,微软公司的MSXML 4.0 XML 语法分析程序, SQLXML 3.0 工具箱,以及Visual Studio .NET( VS.NET)。
配置Web服务
本文的所使用的示范应用程序是SQL Server服务器默认安装的Northwind 样本数据库。 我们要开始本文要讨论的问题,但是我们必须遵循下载的SQLXML 3.0 installer中所附带的SQLXML 3.0 技术资料里的教学指示。首先,执行在SQLXML 3.0 文献中的标记为Creating the nwind Virtual Directory 的过程程序。 到SQLXML 3.0程序组下的Configure IIS Support MMC 内嵌应用程序。选择默认的服务器的网址,到Action菜单并且选择New,然后点击虚拟目录。 在IIS 下创建一个名为nwind的虚拟目录,支持访问Northwind 数据库的SQLXML应用程序。 配置安全设置来支持虚拟目录应用程序对Northwind 数据库的访问。 在设置选项中,选定AllowPost选项。 这样能够允许HTTP POST请求,以便支持SQLXML 网络。 在虚拟目录下,你可以配置不同类型的SQLXML 应用程序,包括模板, schemas 和dbobjects,支持模板执行, 对映射schema 文件的Xpath查询和不同数据库对象的直接的访问。 在虚拟目录下的这些不同类型的应用程序被称为virtual name(虚拟名称)类型。 还有用来标识使用SOAP消息发送的Web服务的SOAP虚拟名称类型。 创建一个SOAP虚拟名称类型,并把它命名为MyWebService(见图1)。现在你需要按照标记为Step 2的部分中所说的步骤做: Configuring the Virtual Name under the topic Initial Setup for Sending SOAP Requests。
键入MyWebService作为 新的虚拟目录应用程序的名称,并选择虚拟名称类型为SOAP( 见图一)。 这样就建立了一个对Northwind数据库的Web 服务扩展的引用。
配置 MyWebService
为你的Web 服务创建一个WSDL( Web 服务定义语言) 文件和一个SQL 服务器配置(.ssc) 配置文件。 ssc 文件描述了虚拟名称类型配置,并且SQLXML 使用它来生成WSDL 文件。 而WSDL 文件描述了Web 服务以及当使用Web服务时你的应用程序可以调用的方法。
在设置一个SOAP虚拟名称类型之后,选择SQLXML 3.0 的IIS 虚拟目录管理工具下面的虚拟名称选项卡中的配置选项。 为了设置一个存储过程方法映射用于你的SOAP虚拟名称类型,选择SP/Template选项下面的CustOrdersDetail存储过程,然后选择Save选项。在完成这步之后,浏览你的nwind虚拟目录并寻找名为soap.wsdl的文件,这个文件是XML格式的WSDL 文件,描述了你配置的服务。 我们可以在任何一个文本编辑程序里打开,文件可能会象这样:
<xsd:element name="CustOrdersDetail"><xsd:complexType><xsd:sequence><xsd:element minOccurs="0" maxOccurs="1"name="OrderID" type="xsd:int"nillable="true"/></xsd:sequence></xsd:complexType></xsd:element><xsd:element name="CustOrdersDetailResponse"><xsd:complexType><xsd:sequence><xsd:element minOccurs="1" maxOccurs="1"name="CustOrdersDetailResult"type="sqlresultstream:SqlResultStream"/><xsd:element name="returnValue"type="xsd:int" nillable="true"/></xsd:sequence></xsd:complexType></xsd:element>
这段由SQLXML生成的CustOrdersDetail WSDL 文件片段(SOAP.wsdl),向我们展示了CustOrdersDetail 方法的配置,包括输入和输出参数的定义。
构造ASP.NET 客户端
在配置完SQLXML Web 服务之后,你需要开发一个客户应用程序来访问这个服务并且执行它的任何操作。 首先,创建一个新的C # 或VB.Net ASP.NET Web 应用程序并把它命名为WebServiceClient。你需要添加3 个控件到默认的Web表单上去: 一个带有ID btnRequest 的按钮,和两个TextBox 控件,一个是ID txtOrderID ,另一个是ID txtResponse。 设置txtResponse TextBox控件的TextMode属性为 MultiLine 以便支持从Web服务中返回的XML应答。表单应该像图2那样。
在添加控件之后,你将需要给你刚刚建立的Web 服务添加一个引用。 为了做到这一点,在VS. NET中,点击Solution Explorer窗口中的References文件夹,在References文件夹上用右键点击,然后Add Web Reference菜单选项。(见图3)
你选择的URL 参考你以前创建的Web 服务。 注意我使用的服务器名为localhost,参考我的IIS 的本地实例,虚拟目录路径是nwind,对于Northwind数据库虚拟目录,Web 服务名为MyWebService。如果你没有使用一台本地服务器,你将需要在URL 里用你的服务器名或者IP 地址代替。
调用Web服务
在创建ASP.NET工程之后,你需要添加代码来调用Web 服务。 你想要应用程序调用Web 服务,可以调用CustOrdersDetail 方法,并且处理当用户点击按钮以后返回的XML结果集。添加以下的代码到btnRequest_Click事件。
(C# 代码)
private void btnRequest_Click(object sender,System.EventArgs e){int iOrderID;int returnValue = 0;int j = 0;iOrderID = Convert.ToInt32(txtOrderID.Text);localhost.MyWebService proxy =new localhost.MyWebService();object[] results;results = proxy.CustOrdersDetail(iOrderID,out returnValue);System.Xml.XmlElement result;result = (System.Xml.XmlElement) results[j];txtResponse.Text = result.OuterXml.ToString();}(VB.Net code)Private Sub btnRequest_Click _(ByVal sender As System.Object, _ByVal e As System.EventArgs) _Handles btnRequest.ClickDim iOrderID As Int32Dim returnValue As Int16 = 0Dim j As Int16Dim proxy As New localhost.MyWebService()Dim results As New Object()Dim result As System.Xml.XmlElementiOrderID = Convert.ToInt32(txtOrderID.Text)results = proxy.CustOrdersDetail _(iOrderID, returnValue)result = results(j)txtResponse.Text = result.OuterXml.ToString()End Sub
调用Web 服务的CustOrdersDetail 方法执行同名的存储过程。 这个方法返回一个对象数组,那些物体本身可能是XmlElement 或者SqlMessage 类型。 这些类型在你的Web 服务相关的WSDL 文件里定义的。 XmlElement 类型的对象包括从执行存储过程,用户定义的函数或SQLXML服务器上模版的返回的结果。 SqlMessage 对象包括从SQLXML 服务器返回的任何错误信息。 你可以像下面所列的代码一样在对像数组中引用XmlElement类型:
(C# code)
result = (System.Xml.XmlElement) results[j];txtResponse.Text = result.OuterXml.ToString();(VB.Net code)result = results(j)txtResponse.Text = result.OuterXml.ToString()
这段代码检索对象数组中的基础元素并且把它强制转换成XmlElement 对象类型。 然后,它展示了设置在Web表单上的XML结果,是通过把txtResponse控件上Text属性设置为 XmlElement对象的OuterXml属性的值。执行样本代码的时候,在txtOrderID文本框中输入参数10250(Northwind数据库内OrderID键对应的值。)。 . 当你点击按钮时,返回的XmlElement中就包含了下面的XML 数据:
<SqlXml><row ProductName="Jack's New England Clam Chowder"UnitPrice="7.7"Quantity="10" Discount="0"ExtendedPrice="77" /><row ProductName="Manjimup Dried Apples"UnitPrice="42.4" Quantity="35" Discount="15"ExtendedPrice="1261.4" /><rowProductName="Louisiana Fiery Hot Pepper Sauce"UnitPrice="16.8" Quantity="15" Discount="15"ExtendedPrice="214.2" /></SqlXml>
注意在父标签<SqlXML>下的<row>元素包含属性ProductName, UnitPrice,Quantity, Discount和ExtendedPrice,与CustOrdersDetail存储过程的选定的和计算的字段之间对应。如果在使用命令行执行方式CustOrdersDetail ' 10250 ' 在SQL 查询分析器应用程序中测试程序,你将看见那个那些数据 ,这些数据在XmlElement 里包含的数据所对应的结果集里。SQLXML 也能执行模板,让你使用XPath 查询来从一个基本的XML 结果集中检索数据。模板支持能够非常在开发一个有用的应用程序时提供很大的帮助,但是它不能提供有效提升XML 数据所需要的所有的灵活性。
SQLXML:简单但是有限
SQLXML 和完整的VS.Net Web 服务相比还是很有限的。例如,产生SQLXML的Web 服务不能应用一个XSLT样式表到XML数据或编程处理数据来直接输出HTML到你的客户端应用程序中。本质上,SQLXML方法要求你把你的事务层和数据层联系起来,以便有效的从你的客户端应用程序中封装程序逻辑。返回的数据结果可能是很难维护的并且不是非常容易移植到新的工具或者平台上。
不过,就像样本应用程序那样,你只需要遵循构造程序步骤大略的描述,写不到20行的代码行, 你就能调用Web 服务来返回XML 数据到你的客户端应用程序。 SQLXML是一个理想的解决方案,用来创建浏览在线的目录信息,销货定单历史,或者任何可以利用来检索远程原始XML数据的工具。 这项技术将被证明是适合于那些主要事务为集中数据检索和操作的应用程序,而不是用于扩展业务应用程序规则和逻辑。因为返回的数据已经是XML 形式,所以你能使用XSLT排序,格式化提高你的数据的产量。