程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 面向Microsoft SQL Server 2005的本機XML Web Services概述

面向Microsoft SQL Server 2005的本機XML Web Services概述

編輯:關於SqlServer


  了解如何借助SQL Server 2005(以前稱為“Yukon”)中的SOAP/HTTP來設置和使用XML Web Services。文中還包含了相關的示例。為了從本文最大地受益,應該對Web服務技術具有基本的了解,包括HTTP、SOAP和WSDL。它包含的具體內容有:要求、HTTP終結點、創建HTTP終結點、身份驗證與安全、WSDL、SOAP RPC:方法調用、批處理:即席查詢和管理。

  簡介

  Microsoft® SQL Server™ 2005 提供了一個標准機制,用於使用 SOAP 通過 HTTP 訪問數據庫引擎。通過使用此機制,可將 SOAP/HTTP 請求發送到 SQL Server 以執行以下內容:

  ◆Transact-SQL 批處理語句,帶參數或不帶參數。

  ◆存儲過程,擴展存儲過程以及用戶定義的標量值函數。

  在 SQL Server 2005 之前,可用於連接 SQL Server 的唯一機制就是通過名為 Tabular Data Stream (TDS) 的自定義二進制協議。利用 SOAP/HTTP 訪問,我們提供了一種開放的且具有相關文檔的協議,可以作為後備手段,以連接到 SQL Server。提供 SOAP/HTTP 訪問,可以使更多類型的客戶端訪問 SQL Server,其中包括“無痕跡安裝”客戶端,因為已不再需要在客戶端設備上安裝 Microsoft 數據訪問組件 (MDAC) 棧以嘗試連接到 SQL Server。它方便了與各種平台上的 .Net、SOAP 工具包、Perl 以及更多功能的互操作。由於 SOAP/HTTP 訪問機制基於各種應用廣泛的技術(如 XML 和 HTTP),它能內在地促進異構環境中與 SQL Server 的互操作性及對 SQL Server 的訪問。任何能夠分析 XML 和提交 HTTP 請求的設備現在都能夠訪問 SQL Server。

  很多企業都采用異構的環境,其中運行於 UNIX 和 Linux 平台上的應用程序可能需要連接到 SQL Server。在以前,此類用戶唯一可用的解決方案就是使用 JDBC 或 ODBC 驅動程序。SOAP/HTTP 訪問現在提供另一個低成本的後備方法。對於 DBA 使用 Perl 編寫了運行於 UNIX 上的腳本以管理 SQL Server 資源的場景,這非常有用。在開發使用智能集成開發環境 (IDE)(其中內置了 SOAP/HTTP 支持,如 Microsoft Visual Studio® .Net 或 Jbuilder 就屬於此類 IDE)開發客戶端應用程序時,這也十分有用。這些 IDE 將生成特定的代理代碼,這些代理代碼對 SQL Server 通信進行抽象,並提供客戶端應用程序可以使用的對象。使用 SOAP/HTTP 還實現了隨時隨地對 SQL Server 的訪問,而這使得開發用於移動設備或偶爾連接的設備的應用程序更為容易。一旦建立了連接,並且服務器已開始處理請求,則可以使用 TDS 所基於的客戶端上的現有機制(如使用 SqlClIEnt、ODBC 和 OLEDB)對此進行監視。

  要求

  SQL Server 2005 本機 Web 服務要求使用 Microsoft Windows Server™ 2003 作為操作系統,因為它們依賴於此版本提供的內核模式 http 驅動程序 http.sys。由於 SQL Server 利用內核模式 http.sys 驅動程序,所以不必安裝 IIS 以在 SQL Server 外公開 Web 服務,這就簡化了管理。

  應該根據應用程序要求決定是否安裝 IIS。

  例如,特定的應用程序可能從使用顯式中間層而受益。在這種情況下,IIS 將很有用。

  HTTP 終結點

  為了將 SQL Server 設置為可以本機偵聽 HTTP SOAP 請求的 Web 服務,需要創建 HTTP 終結點並定義該終結點公開的方法。當創建 HTTP 終結點時,必須使用唯一的 URL 進行創建,將使用此 URL 偵聽傳入的 HTTP 請求。例如,如果您使用 URL“http://servername/sql”創建一個終結點,發送到 http://servername/sql 的 SOAP 請求將由 http.sys. 拾取,然後將此 SOAP 請求路由到承載與該 URL 關聯的終結點的 SQL Server 實例。請求將從此處傳遞到 SQL Server 內的 SOAP 處理層。

  SQL Server 實例可以具有多個終結點,每個終結點都可以將任意數量的存儲過程(通過使用 Transact-SQL 或 CLR 實現)公開為終結點上的 WebMethod,且可以通過 SOAP 遠程過程調用 (RPC) 而調用。WebMethod 可以具有與所公開的實際存儲過程不同的名稱。WebMethod 名稱就是在 WSDL 中作為操作名稱向用戶顯示的名稱。

  注意  務必指出,終結點中的 WebMethod 子句是特定於 SQL Server 2005 的,與 ASMX WebMethod 屬性無關。

  用戶可以對終結點執行 AdHoc Transact-SQL 語句。這可以通過使用數據定義語言 (DDL) 中的一個可選子句在終結點上允許進行批處理而實現。允許進行批處理將隱式地將名為“sqlbatch”的 WebMethod 公開給用戶。在接下來的各節中將進一步對這些概念進行說明。


  創建 HTTP 終結點

  HTTP 終結點是使用 Transact-SQL DDL 創建和管理的。創建 HTTP 終結點是允許 HTTP/SOAP 訪問 SQL Server 2005 的第一步。每個終結點都具有名稱和一個選項集合,這些選項一起定義終結點的行為。

  為了演示如何使用“創建 HTTP 終結點”的內容,讓我們看看 Hello World 示例,以了解如何通過 SQL Server Web 服務調用存儲過程。

  首先,使用以下 T-SQL 在主數據庫中創建名為“hello world”的存儲過程。此存儲過程只是顯示輸入參數中提供的字符串。

CREATE PROCEDURE hello_world
(@msg nvarchar(256))
AS BEGIN
select @msg as 'message'
END
  然後,使用以下 T-SQL 創建 HTTP 終結點,此終結點將允許將此存儲過程作為一個 WebMethod 進行訪問:

CREATE ENDPOINT hello_world_endpoint
STATE = STARTED
AS HTTP (
AUTHENTICATION = ( INTEGRATED ),
PATH = '/sql/demo',
PORTS = ( CLEAR )
)
FOR SOAP (
WEBMETHOD
'http://tempuri.org/'.'hello_world'
(NAME = 'master.dbo.hello_world'),
BATCHES = ENABLED,
WSDL = DEFAULT
)
  所有終結點均存儲在主數據庫中,在元數據視圖 master.sys.http_endpoints 中。除非進行定義,否則終結點不會具有任何 SOAP 方法。在上例中,我們將存儲過程 master.dbo.hello_world 作為“hello_world”WebMethod 公開;該 WebMethod 可以使用任何名稱,如可以命名為“http://tempuri.org”命名空間下的“testproc1”。如果將 WSDL 子句的值指定為 DEFAULT,將使終結點使用默認格式對請求 WSDL 生成的 WSDL 進行響應。通過在上面的語句中設置 WSDL=NONE,可以取消 WSDL 生成。在接下來的部分中,我們將對 WSDL 生成的細節進行討論。

  身份驗證與安全

  HTTP 終結點支持以下標准身份驗證機制:基本、摘要、集成(NTLM、Kerberos)以及 SQL 身份驗證。首先會在 HTTP 傳輸層進行身份驗證。一旦這個驗證成功,將使用用戶的 SID 進行 SQL 身份驗證。除了以下情況,這適合於所有選項:通過指定 LOGIN_TYPE = MIXED 啟用了 SQL 身份驗證。SQL 身份驗證憑證將使用 WsSecurity 用戶名稱標記標頭作為 SOAP 數據包的一部分發送。管理員能按每個終結點設置基於 IP 的限制,以通過僅允許特定的 IP 或 IP 范圍訪問 HTTP 終結點來限制對終結點的訪問。從概念上講,“終結點”就是一個“應用程序”,實現單個應用程序的所有方法均映射到終結點,因此安全機制應用到終結點以控制對應用程序的訪問。終結點通過設計進行保護;下面列出一些可以幫助保證終結點安全的事項。

  ◆默認關閉。不映射任何默認終結點或 Web 方法;必須顯式地創建和指定。

  ◆安全檢查也應用到對象,因此,映射的存儲過程僅在用戶對終結點具有連接權限且對存儲過程具有執行權限時才可以執行。

  ◆不支持匿名連接到終結點。所有請求(包括 WSDL 請求)均要通過身份驗證。為了提交任何請求,客戶端必須根據 SQL Server 原則進行身份驗證。

  當創建了終結點後,只有系統管理員角色和終結點所有者的成員才能連接到該終結點。必須向用戶授予訪問終結點的連接權限;此操作是通過執行以下語句實現的:

GRANT CONNECT ON HTTP ENDPOINT::hello_world_endpoint TO [DOMAINUSER]
  非 Microsoft 平台上的客戶端可以通過使用基本身份驗證或 SQL 身份驗證連接到 SQL Server。不過使用基本身份驗證或 SQL 身份驗證要求保證通道的安全,以使用戶只能在啟用了 SSL 的端口上進行連接。



  WSDL

  WSDL 是以 XML 編寫的用於描述 Web 服務的文檔。它指定服務的位置和服務公開的操作(或方法)。WSDL 提供了客戶端與 Web 服務交互所必需的信息。

  Visual Studio .Net 和 Jbuilder 一類的工具將使用 WSDL 生成代理代碼,應用程序可使用此代理代碼與 Web 服務進行通信。如果終結點啟用了 WSDL,該終結點將在收到 WSDL 請求時產生 WSDL。當向本文早些時候創建的終結點發送已通過身份驗證的請求時,它將產生 WSDL。WSDL 請求是簡單的窗體 HTTP get 請求。

  服務器將查詢與終結點相關的元數據,並動態生成 WSDL。生成的 WSDL 提供了存儲過程參數的豐富類型說明。服務器可以生成不同風格的 WSDL,根據是使用基元 xsd 類型還是復雜類型來描述請求/響應消息中的參數,我們分別將之稱為簡單 WSDL 和復雜 WSDL。默認使用復雜類型。

  SOAP RPC:方法調用

  在上面創建的終結點中,我們已將此存儲過程 master.dbo.hello_world 作為 Web 方法公開,而 Web 方法可以通過 SOAP RPC 執行。以下是一個 SOAP 消息的示例,該消息通過 HTTP 發送到服務器以通過 SOAP 調用此 SP。

<SOAP-ENV:Envelope
<soap:binding transport="http://schemas.XMLsoap.org/soap/http"
<soap:body use="literal" />
<hello_world XMLns="http://tempuri.org/">
<msg>Hello World!</msg>
</hello_world>
<soap:body use="literal" />
</SOAP-ENV:Envelope>
  結果將為一個包含以下內容的 SOAP 包封:

<SqlRowSet1 XMLns="urn:schemas-microsoft-com:sql:SqlRowSet1">
<row>
<message>Hello World!</message>
</row>
</SqlRowSet1>
  批處理:即席查詢

  當通過使用 T-SQL 命令在終結點上啟用了批處理時,另一個 SOAP 方法(名為“sqlbatch”)將隱式地在終結點上公開。sqlbatch 方法允許通過 SOAP 執行 T-SQL 語句。此方法采用兩個參數。第一個參數名為“<BatchCommands>”,是批量的 T-SQL 語句。第二個參數名為“<Parameters>”;如果 T-SQL 語句使用了任何參數,它將包含一個參數信息的數組。例如,下面是 SOAP 請求的請求體,其中調用了 sqlbatch 方法,並執行一個參數化的查詢。

<sqlbatch XMLns="http://schemas.microsoft.com/SQLServer/2001/12/SOAP">
<BatchCommands>
SELECT EmployeeID, LoginID, Gender
FROM Employee
WHERE EmployeeID=@x
FOR XML AUTO;
</BatchCommands>
<Parameters>
<SqlParameter name="x" sqlDbType="Int" maxLength="20"
XMLns="http://schemas.microsoft.com/SQLServer/2001/12/SOAP/types/SqlParameter">
<Value xsi:type="xsd:string">1</Value>
</SqlParameter>
</Parameters>
</sqlbatch>
  此 SOAP 請求的響應將包括以下內容:

<sqlresultstream:SqlXml xsi:type="sqlsoaptypes:SqlXML">
<SqlXML>
<Employees EmployeeID="1" FirstName="Nancy" LastName="Davolio"/>
</SqlXML>
</sqlresultstream:SqlXML>
  管理

  我們已經了解了創建終結點並根據終結點提交 SOAP 請求非常簡單。由於現在僅須管理一個組件(即 SQL Server),所以管理得到了簡化。我們不需要管理 IIS 組件。終結點抽象為管理員提供了更大的靈活性,他們可以啟用 IP 篩選。這還消除了打開另一個端口的需要,因為我們可以重新使用供 http/https Web 通信使用的端口。通過僅顯式地向特定的個體授予 CONNECT 特權,還可以僅向這些用戶提供對終結點的訪問權限。

  結束語

  通過使用本機 SOAP 訪問,我們已提供了基於應用廣泛並有相應文檔說明的標准(如 SOAP/HTTP)的協議,用以訪問 SQL Server。這樣使得更多類型的客戶端可以連接到 SQL Server,從而加強了互操作性,並更方便擴展。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved