使用SQLXML 3.0把存储过程暴露为Web服务
2024-09-05 20:55:49
供稿:网友
最新的技术是web服务。现在出现在所有市场中的类似简单对象访问协议(soap)、web服务描述语言(wsdl)、通用描述、发现和集成(uddi)等术语的基本元素都是xml和internet。
web服务用于建立松散连接的应用程序并实现互操作性。松散连接的应用程序使你能重新配置、重新部署或重新定位它的实现而不影响相关的应用程序。互操作性涉及到建立能够在允许web服务的任何平台上使用的应用程序。通过web服务暴露sql server给予应用程序一个松散的连接接口,使你能够修改数据库的结构和位置而不影响应用程序。另外,web服务使sql server能与更多的编程环境和平台交互操作。
为了达到互操作性,开发者需要在一套开放的工业标准和协议上建立web服务。xml是这些标准中多数的基础,提供了不依赖平台的描述和数据表现。建立在xml上的soap提供了基于标准的向应用程序发送数据和从应用程序接收数据的途径,代表性的是使用http。wsdl描述了位置、方法、参数和web服务使用的数据类型。uddi为注册web服务或查找需要的其它web服务的目录提供了一个接口。通过把这些标准技术和t-sql编程组合在一起,你能把sql server存储过程实现为web服务。
sql server 2000 web release 3(sqlxml 3.0)的焦点是web服务(你能够通过链接http://microsoft.com/sql/default.asp下载sqlxml 3.0)。sqlxml 3.0使你能够从数据库中选择存储过程并从虚拟目录中选择xml模版,把它们暴露为web服务的方法。因为你能够通过web服务和传统方法(例如t-sql exec语句、ole db、ado和odbc)调用存储过程,你可以最大化地重复使用这些组件。简单地说,sqlxml 3.0使你能把数据库编程中的专门技术扩展到web服务中而不需要学习新的语言或工具。下面让我们看看怎样把存储过程转变为web服务。
配置虚拟目录。把存储过程暴露为web服务的第一步是从安装sqlxml 3.0产生的configure iis support(配置iis支持)菜单项中选择microsoft iis virtual directory manager(微软iis虚拟目录管理器)。要建立虚拟目录,从左边的树视图中选择web服务器,接着展开该视图并点击默认的web站点。右击右边面板中的任意区域,选择context-》new-》virtual directory来显示一个new virtual directory properties(新虚拟目录属性)对话框。在“安全和数据源”页面上,输入能够访问northwind示例数据库的sql server登陆许可。注意你在“通用”页面上选择的目录的许可必须给你在“安全和数据源” 页面上为iis配置的默认用户授权(请查看iis文档寻找配置的详细信息)。为了避免许可的问题,为你的虚拟目录选择inetpub/wwwroot的一个子目录,iis默认用户自动拥有访问inetpub/wwwroot下面数据的权限。下一步,在“设置”页面上,选择allow post选项,这样虚拟目录能够接受http post请求。点击“应用”。
配置虚拟名称。在配置虚拟目录后,点击new virtual directory properties(新虚拟目录属性)对话框上的“虚拟名称”页面。从虚拟名称列表中选择新虚拟名称,为该虚拟名称选择一个名字,接着把它的类型设置为soap。列表1显示了把soap字符串作为虚拟名称的vbscript代码。给虚拟名称输入一个路径。该路径包含了当你把修改保存到根目录时从iis虚拟目录管理器中输出的wsdl文件。我通常选择('.'),它选择相同的目录作为虚拟目录。你可以接收对话框中剩余字段的默认值。点击“保存”。当你保存虚拟名称时,sqlxml 3.0给你指定的虚拟名称目录写入两个文件,扩展名为.wsdl。其它的文件扩展名为.ssc,包含iis虚拟目录管理器使用的存储过程的xml描述。现在你选择希望暴露作为web服务方法的存储过程。在本文的例子中,我使用列表2中所示的ordersforcustomer存储过程。这个存储过程返回指定客户id(作为参数传递进的)的订单集合。进行下一步之前,你必须使用查询分析器(query analyzer)把这个存储过程安装在northwind示例数据库中。
列表1:调用一个存储过程的vbscript代码
sub main()
dim xmlhttp
set xmlhttp = createobject("msxml2.xmlhttp.4.0")
dim request
request = "<?xml version='1.0' encoding='utf-8'
standalone='no'?>" & _
"<soap-env:envelope xmlns:
soap-env='http://schemas.xmlsoap.org/soap/envelope/'>" & _
" <soap-env:body>" & _
" <ordersforcustomer xmlns=
'http://localhost/june2002/soap'>" & _
" <cid>bottm</cid>" & _
" </ordersforcustomer>" & _
" </soap-env:body>" & _
"</soap-env:envelope>"
xmlhttp.open "post", "http://localhost/june2002/soap", false
xmlhttp.send (request)
msgbox (xmlhttp.responsexml.xml)
end sub
列表2:建立ordersforcustomer存储过程的代码
create procedure ordersforcustomer @cid nvarchar(50)
as
select * from customers, orders
where customers.customerid = @cid
and customers.customerid = orders.customerid
go
建立web服务。在“新虚拟目录属性”对话框的“虚拟名称”页面上选择刚刚建立的虚拟名称,接着点击“配置”(configure)。这样就显示了soap虚拟名称配置对话框。在这个对话框中,选择你希望暴露作为web服务方法的存储过程。为了选择一个存储过程,点击("..."),它建立你配置虚拟目录访问的一个数据库中可用的存储过程列表。不要选择包含for xml子句查询的存储过程。作为代替,你必须选择返回标准结果集合的存储过程。sqlxml 3.0期望存储过程返回输出参数或标准结果的结果集。接着该结果在中间层中被建立为xml。选择返回标准结果集的存储过程使所有可以用于web服务或传统编程方法(例如t-sql)的存储过程的灵活性最大化了。当你在中间层中建立xml查询结果,要小心避免sqlxml 3.0的限制(你可以查看sqlxml 3.0在线文档查看这些限制的详细信息)。你选择ordersforcustomer存储过程后,点击“确定”(ok),接着点击soap虚拟名称配置对话框的“保存”(save)按钮。这样你就已经建立了第一个web服务了。你可以使用任何文本编辑器检查为虚拟名称选择的目录中的wsdl。该wsdl文件包含余你选择的web服务相对应的方法定义。
为了测试新建立的web服务,使用列表1中显示的vbscript代码。该代码建立一个调用该web服务的soap消息,接着使用xmlhttp对象把该soap请求发送给web服务。soap结果显示在一个消息框中。这个客户端简单演示了soap小心在vbscript和sqlxml 3.0之间的交换。但是,它也显示了现在存储过程调用可以通过在http上使用soap跨平台交互操作,它们通过wsdl和scc文件中的描述提供了到存储过程的松散连接。