在ASP.net中,我們可以創建WSDL文件來描述當前提供的HTML或XML或者任何其他非二進制格式)頁,可以使用WSDL來生成客戶端代理,并使用Visual Studio.NET或WSDL.exe命令行工具創建代理類。最后通過 RegEx 來分析已命名的HTML頁和提取值。以下介紹完整的實現過程:
一、為網站編寫WSDL文件
我們以訪問http://movies.yahoo.com/電影網站中“本周票房排行榜”(Top Box Office)的數據為例,檢索出票房排名第一的影片名稱。
通過查看http://movies.yahoo.com/網頁的HTML源文件,可以看到排名第一影片的鏈接是:Finding Nemo,為此可在 WSDL 的響應節中添加 標記。這些標記采用一個稱為 pattern 的屬性,這是與頁面上作為屬性值的文本部分相對應的正則表達式。這里我們創建的正規表達式是:“pattern="d=hv&cf=info&id=[0-9]*">(.*?) <?xml version="1.0" encoding="gb2312"?> <definitions xmlns:s="http://www.w3.org/2000/10/XMLSchema" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s0="http://tempuri.org/" targetNamespace="http://tempuri.org/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:msType="http://microsoft.com/wsdl/mime/textMatching/"> <types/> <message name="GetBookDetailsHttpGetIn"> <part name="isbn" type="s:string"/> </message> <message name="GetBookDetailsHttpGetOut"/> <portType name="BarnesAndNobleHttpGet"> <operation name="GetBookDetails"> <input message="s0:GetBookDetailsHttpGetIn"/> <output message="s0:GetBookDetailsHttpGetOut"/> </operation> </portType> <binding name="BarnesAndNobleHttpGet" type="s0:BarnesAndNobleHttpGet"> <http:binding verb="GET"/> <operation name="GetBookDetails"> <http:operation location=""/> <input> <http:urlEncoded/> </input> <output> <msType:text> <msType:match name="Rank" pattern="d=hv&cf=info&id=[0-9]*">(.*?) </"ignoreCase="true"/> </msType:text> </output> </operation> </binding> <service name="BarnesAndNoble"> <port name="BarnesAndNobleHttpGet" binding="s0:BarnesAndNobleHttpGet"> <http:address location="http://movies.yahoo.com/"/> </port> </service> </definitions>
在上面的WSDL中,定義了BarnesAndNoble類,指定進行檢索的站點http://movies.yahoo.com/,由于是一般的通用網站,此服務不使用SOAP,而是使用HTTP GET進行請求。
二、構建WEB服務代理
在Visual Studio.NET中,右鍵單擊“解決方案資源管理器”中的“引用”,選擇“添加WEB引用”,就可以打開“添加WEB引用”對話框,
在此對話框中,輸入剛才創建好的WSDL文件所在的地址,Visual Studio.NET從指定的位置獲取WSDL并驗證它。單擊“添加引用”按鈕,就可以將此WSDL描述的WEB服務的引用添加到當前的工程中。
通過以上操作,Visual Studio.NET在后臺自動分析WSDL,并創建了代表Web服務的代理對象,并高速緩存了WSDL的本地副本。如果WSDL內容發生變化,需要手工“更新WEB引用”。
WEB服務代理的源代碼如下:
Public Class BarnesAndNoble Inherits System.Web.Services.Protocols.HttpGetClientProtocol '<remarks/> Public Sub New() MyBase.New Me.Url = "http://movies.yahoo.com/" End Sub '<remarks/> <System.Web.Services.Protocols.HttpMethodAttribute(GetType (System.Web.Services.Protocols.TextReturnReader), GetType (System.Web.Services.Protocols.UrlParameterWriter))> _ Public Function GetBookDetails(ByVal isbn As String) As GetBookDetailsMatches Return CType(Me.Invoke("GetBookDetails", (Me.Url + ""), New Object() {isbn}),GetBookDetailsMatches) End Function '<remarks/> Public Function BeginGetBookDetails(ByVal isbn As String, ByVal callback As System.AsyncCallback, ByVal asyncState As Object) As System.IAsyncResult Return Me.BeginInvoke("GetBookDetails", (Me.Url + ""), New Object() {isbn}, callback, asyncState) End Function '<remarks/> Public Function EndGetBookDetails(ByVal asyncResult As System.IAsyncResult) As GetBookDetailsMatches Return CType(Me.EndInvoke(asyncResult),GetBookDetailsMatches) End Function End Class Public Class GetBookDetailsMatches <System.Web.Services.Protocols.MatchAttribute("d=hv&cf=info&id=[0-9]*""> (.*?)</", lgnoreCase:=true)> _ Public Rank As String End Class
如果在“解決方案資源管理器”中展開“Web References”部分,可以看出具體表達方式:
三、在WEB應用程序中編寫代碼,使用BarnesAndNoble Web服務。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim bn As New localhost.BarnesAndNoble() Dim match As localhost.GetBookDetailsMatches match = bn.GetBookDetails("") rank.Text = match.Rank End Sub 在以上程序中,首先調用New localhost.BarnesAndNoble(),創建代理的一個范例bn。bn再調用GetBookDetails()方法傳入參數,最后訪回一個Rank值(排名第一的影片名稱)。
通過編寫WSDL,訪問由 WSDL 中的功能化名稱調用的 Matches 對象,就可以將任何 HTML 部分作為屬性來訪問,我們可以輕松地將WEB站點轉換為WEB服務。以上程序在Windows2000 Server、Visual Studio.NET中調試通過。
|