用WSDL與代理類(lèi)創(chuàng)建可編程WEB服務(wù)
發(fā)表時(shí)間:2023-07-27 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在ASP.net中,我們可以創(chuàng)建WSDL文件來(lái)描述當(dāng)前提供的HTML或XML或者任何其他非二進(jìn)制格式)頁(yè),可以使用WSDL來(lái)生成客戶(hù)端代理,并使用Visual Studio.NET或WSDL.exe...
在ASP.net中,我們可以創(chuàng)建WSDL文件來(lái)描述當(dāng)前提供的HTML或XML或者任何其他非二進(jìn)制格式)頁(yè),可以使用WSDL來(lái)生成客戶(hù)端代理,并使用Visual Studio.NET或WSDL.exe命令行工具創(chuàng)建代理類(lèi)。最后通過(guò) RegEx 來(lái)分析已命名的HTML頁(yè)和提取值。以下介紹完整的實(shí)現(xiàn)過(guò)程:
一、為網(wǎng)站編寫(xiě)WSDL文件
我們以訪(fǎng)問(wèn)http://movies.yahoo.com/電影網(wǎng)站中“本周票房排行榜”(Top Box Office)的數(shù)據(jù)為例,檢索出票房排名第一的影片名稱(chēng)。
通過(guò)查看http://movies.yahoo.com/網(wǎng)頁(yè)的HTML源文件,可以看到排名第一影片的鏈接是:Finding Nemo,為此可在 WSDL 的響應(yīng)節(jié)中添加 標(biāo)記。這些標(biāo)記采用一個(gè)稱(chēng)為 pattern 的屬性,這是與頁(yè)面上作為屬性值的文本部分相對(duì)應(yīng)的正則表達(dá)式。這里我們創(chuàng)建的正規(guī)表達(dá)式是:“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類(lèi),指定進(jìn)行檢索的站點(diǎn)http://movies.yahoo.com/,由于是一般的通用網(wǎng)站,此服務(wù)不使用SOAP,而是使用HTTP GET進(jìn)行請(qǐng)求。
二、構(gòu)建WEB服務(wù)代理
在Visual Studio.NET中,右鍵單擊“解決方案資源管理器”中的“引用”,選擇“添加WEB引用”,就可以打開(kāi)“添加WEB引用”對(duì)話(huà)框,
在此對(duì)話(huà)框中,輸入剛才創(chuàng)建好的WSDL文件所在的地址,Visual Studio.NET從指定的位置獲取WSDL并驗(yàn)證它。單擊“添加引用”按鈕,就可以將此WSDL描述的WEB服務(wù)的引用添加到當(dāng)前的工程中。
通過(guò)以上操作,Visual Studio.NET在后臺(tái)自動(dòng)分析WSDL,并創(chuàng)建了代表Web服務(wù)的代理對(duì)象,并高速緩存了WSDL的本地副本。如果WSDL內(nèi)容發(fā)生變化,需要手工“更新WEB引用”。
WEB服務(wù)代理的源代碼如下:
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
如果在“解決方案資源管理器”中展開(kāi)“Web References”部分,可以看出具體表達(dá)方式:
三、在WEB應(yīng)用程序中編寫(xiě)代碼,使用BarnesAndNoble Web服務(wù)。
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
在以上程序中,首先調(diào)用New localhost.BarnesAndNoble(),創(chuàng)建代理的一個(gè)范例bn。bn再調(diào)用GetBookDetails()方法傳入?yún)?shù),最后訪(fǎng)回一個(gè)Rank值(排名第一的影片名稱(chēng))。
通過(guò)編寫(xiě)WSDL,訪(fǎng)問(wèn)由 WSDL 中的功能化名稱(chēng)調(diào)用的 Matches 對(duì)象,就可以將任何 HTML 部分作為屬性來(lái)訪(fǎng)問(wèn),我們可以輕松地將WEB站點(diǎn)轉(zhuǎn)換為WEB服務(wù)。以上程序在Windows2000 Server、Visual Studio.NET中調(diào)試通過(guò)。