羅海濤
摘 要: Web服務(wù)基于標準的數(shù)據(jù)格式和協(xié)議,如XML、SOAP和HTTP,不同平臺和操作系統(tǒng)的客戶和服務(wù)端可以基于同樣的協(xié)議,沒有障礙地通信,Web服務(wù)客戶端只需標識Web服務(wù)的位置及其可以調(diào)用的方法,就可以簡單地使用Web服務(wù)。微軟公司的.NET框架針對Web服務(wù)提供了廣泛的支持。因此研究了.NET環(huán)境下Web Services的構(gòu)建、處理流程,舉例說明了Web服務(wù)的典型應(yīng)用。
關(guān)鍵詞: .NET框架; Web服務(wù); 服務(wù)構(gòu)建; 應(yīng)用
中圖分類號:TP311.11 文獻標志碼:A 文章編號:1006-8228(2014)11-22-02
Construction and application research of Web Services
Luo Haitao
(School of Informatics, Guangdong University of Foreign Studies, Guangzhou, Guangdong 510420, China)
Abstract: Web Service is based on standard protocols such as XML, SOAP and HTTP. Client and server with different OS can communicate freely based on the same protocols. The client simply identifies the location and method of Web Service when it uses the services. The .NET Framework of Microsoft Company provides wide support to Web Services. The construction and processing of Web Services under .NET Framework are analyzed. Typical examples of Web Services are proposed.
Key words: .NET framework; Web Services; service construction; application
0 引言
隨著Internet的發(fā)展和深入普及,基于Internet的Web應(yīng)用得到了快速發(fā)展。從早期使用HTML標記語言設(shè)計的靜態(tài)網(wǎng)頁,到使用CGI、ASP、JSP、PHP、ASP.NET開發(fā)設(shè)計的動態(tài)網(wǎng)站,實現(xiàn)的功能越來越復雜[5]。2002年微軟開發(fā)出了.NET框架(.NET Framework),提供了一種開發(fā)Web應(yīng)用程序,包括Web服務(wù)的全新模式,其底層用類實現(xiàn),是一種面向?qū)ο蟮膶崿F(xiàn)方法。十幾年來.NET框架幾經(jīng)發(fā)展,已可以在這個框架下利用VB.NET、C#、C++或JScript.NET等程序語言,進行WEB應(yīng)用程序設(shè)計(即通常說的動態(tài)網(wǎng)頁/網(wǎng)站)、Web服務(wù)應(yīng)用、Windows應(yīng)用程序設(shè)計、控制臺應(yīng)用程序設(shè)計等。
Web服務(wù)又叫XML Web Service,Web服務(wù)基于“簡單對象訪問協(xié)議”(Simple Object Access Protocol,簡稱SOAP)。Web服務(wù)提供在一個使用標準協(xié)議(如HTTP、XML、XSD、SOAP和WSDL)的松耦合環(huán)境中交換信息的能力,先由服務(wù)開發(fā)方開發(fā),并發(fā)布能夠完成特別應(yīng)用需求的在線應(yīng)用服務(wù),其他用戶或者應(yīng)用軟件能夠通過Internet來訪問并使用這項在線應(yīng)用服務(wù)。XML Web Services基礎(chǔ)結(jié)構(gòu)建立在基于XML的消息通信之上,這些消息遵循服務(wù)開發(fā)方根據(jù)具體服務(wù)發(fā)布的服務(wù)說明。服務(wù)說明是用名為WSDL(Web 服務(wù)描述語言)的XML語法編寫的XML文檔,它定義XML Web Services要求的消息格式,起協(xié)議的作用,它定義XML Web Services的行為和功能,并指示潛在客戶端如何與該服務(wù)進行交互。Web服務(wù)返回給客戶端的是數(shù)據(jù),而不是網(wǎng)頁。Web服務(wù)技術(shù)規(guī)范仍然在飛速發(fā)展中,各種新的Web服務(wù)技術(shù)規(guī)范和定義層出不窮。各個主要的軟件平臺廠商如微軟、IBM和SUN等公司也都不遺余力地推出各類操作系統(tǒng)和開發(fā)平臺對Web服務(wù)提供廣泛的支持。微軟公司的.NET平臺針對Web服務(wù)提供了廣泛的支持,是一個比較適合于構(gòu)建Web服務(wù)的平臺。
1 Web Services的構(gòu)建及處理流程
在.NET框架下,構(gòu)建Web Services大致有三個步驟。第一步,建立一個包含Web Services的擴展名為.asmx的Web服務(wù)文件,文件中定義一個類,在類中定義提供Web Services的方法或者函數(shù)。第二步,用.NET框架提供的工具wsdl對Web服務(wù)文件進行處理,處理時可以指定名稱空間(Namespace)的名字,生成SOAP代理類文件;文件中定義一個剛剛處理時指定名字的Namespace,在Namespace中定義類,類中定義提供Web服務(wù)的相應(yīng)的方法和函數(shù);如果前面的.asmx的Web服務(wù)文件指定語言為VB,則代理類為“.vb”類型文件,如果.asmx的Web服務(wù)文件指定語言為C#,則代理類為“.cs”類型文件。第三步,用vbc(對“.vb”文件)或者csc(對“.cs”文件)工具對上一步生成的SOAP代理類文件進行編譯,生成“.dll”文件,再把它部署到應(yīng)用程序根目錄下的bin文件夾。之后,客戶就可以通過該代理類調(diào)用這個Web服務(wù)。如果是Visual Studio.NET,這些工作是自動完成的,基本的步驟一樣。
客戶端通過代理類訪問服務(wù)端的Web服務(wù),代理類使用XML序列化技術(shù)把請求序列化成SOAP消息。代理類發(fā)出的服務(wù)請求可以采用HTTP GET、HTTP POST或者HTTP SOAP協(xié)議。當客戶端請求服務(wù)端的Web服務(wù)時,服務(wù)器的IIS把被請求的.asmx文件映射到Aspnet_isapi.dll,后者則通過請求處理管道把請求轉(zhuǎn)發(fā)給ASP.NET工作進程,之后.NET框架就會通過HttpRuntime來處理這個請求。首先,該請求被送入HttpApplication實例,進入HttpModule,HttpModule完成身份驗證、授權(quán)和緩沖等工作;然后HttpRuntime核實.asmx文件,注冊到WebServiceHandlerFactory Handler并創(chuàng)建一個HTTP handler,它是WebServiceHandler的對象實例,負責處理Web服務(wù)請求。HTTP handler再把SOAP消息翻譯成Web方法調(diào)用。
2 Web Services典型應(yīng)用
⑴ Web服務(wù)返回DataSet對象[4]
假設(shè)一個搜索引擎專門從各網(wǎng)站搜索體育消息,對各類消息分門別類,例如足球消息、籃球消息、田徑消息等等,保存在數(shù)據(jù)庫sportsnews.mdb的表“sports_news”中,每類消息設(shè)置了相應(yīng)的關(guān)鍵字,以便查詢。該搜索引擎向Internet用戶提供免費查詢各類消息的服務(wù),客戶端界面如圖1所示。
圖1 體育新聞搜索服務(wù)的客戶端界面
服務(wù)器端的.asmx服務(wù)文件主要代碼如下:
Public Class SportsNews :Inherits WebService
string) As DataSet
Dim connection1 As New OleDbConnection("Provider=
Microsoft.Jet.OLEDB.4.0; Data Source=" & Server
.Mappath("sportsnews.mdb"))
Dim StrSql As String
StrSql="Select * From sportsnews Where newsType
='" & NewsType & "'"
Dim adptr As New OleDbDataAdapter(StrSql, connection1)
Dim ds1 As New DataSet()
adptr.Fill(ds1, "sportsnews")
Return(ds1)
End Function
End Class
該服務(wù)文件由wsdl工具轉(zhuǎn)換為“.vb“文件,轉(zhuǎn)換時指定名稱空間myService1,則轉(zhuǎn)換后的“.vb“文件自動產(chǎn)生一行代碼“Namespace myService1”,后面的代碼則根據(jù).asmx文件規(guī)定,生成相應(yīng)的類及相關(guān)的服務(wù)方法和函數(shù)。之后用vbc工具進行編譯,生成dll文件,并將該文件部署到應(yīng)用程序根目錄的bin文件夾即可。
客戶端通過代理類調(diào)用Web服務(wù),主要代碼如下:
Sub Enter_Click(Sender As Object, E As EventArgs)
Dim ds As New DataSet()
Dim mn As New myNews()
ds=mn.SelectNews(keyword.Text)
MyDataGrid.DataSource=DS.Tables(0).DefaultView
MyDataGrid.DataBind()
End Sub
以下僅列出html部分中的表單form部分:
⑵ 利用SoapHeader傳遞用戶憑據(jù)[3]
如果是有償服務(wù),服務(wù)器端可以要求客戶端提供憑據(jù),憑據(jù)驗證通過后才提供服務(wù)。下面的例子假設(shè)Web服務(wù)提供了求兩個整數(shù)的平方和計算,返回整數(shù),客戶端可以通過SoapHeader傳遞用戶名和密碼,并假設(shè)用戶名為Luo,密碼為123才能通過驗證,實際應(yīng)用中可以根據(jù)客戶端傳遞的用戶憑據(jù)到數(shù)據(jù)庫中查找,服務(wù)程序文件如下所示:
namespace theNamespace {
public class theHeader : SoapHeader {
public string Username, Password;
}
public class theService {
public theHeader sHeader;
[WebMethod][SoapHeader("sHeader")]
public int theSquare(int a, int b) {
if (sHeader==null) return -1;
string usr=sHeader.Username;
string pwd=sHeader.Password;
if (AuthenticateUser(usr, pwd)) return a*a+b*b;
else return -1;
}
private bool AuthenticateUser(string usr, string pwd) {
if ((usr=="Luo")&&(pwd=="123")) return true;
return false;
}
}
}
客戶端程序主要代碼如下:
theService s1=new theService();
theHeader myHeader=new theHeader();
myHeader.Username="Luo";
myHeader.Password="123";
s1.theHeaderValue=myHeader;
Response.Write(s1.theSquare(3,4));
除了上述兩種典型的方法實現(xiàn)Web服務(wù)應(yīng)用外,還有很多其他方法應(yīng)用Web服務(wù)。例如,利用WSE技術(shù)傳遞UsernameToken令牌以及加密SOAP消息,這是一種更加安全的應(yīng)用方法。Web Services Enhancements(WSE)是微軟公司發(fā)布的一種針對Web Service的增強技術(shù),通過WSE技術(shù)可以把安全、路由、附件等技術(shù)同Web Service完美地結(jié)合在一起,通過在SOAP消息中添加一個或多個安全性憑據(jù),對SOAP消息進行數(shù)字簽名和加密SOAP消息來實現(xiàn)SOAP消息級別的安全性[1]。
而異步Web服務(wù)調(diào)用也是一種可以考慮的選擇。在異步調(diào)用中,向Web服務(wù)發(fā)出請求后,客戶端不必等待請求結(jié)束,可以繼續(xù)執(zhí)行其他任務(wù)。服務(wù)器端不用特別的設(shè)置,就像普通Web服務(wù)一樣即可。.NET Framework的異步調(diào)用方法的設(shè)計模式指定每個同步方法都有兩個異步方法。對于每個同步方法,都有一個Begin異步方法和一個End異步方法[2]。
3 結(jié)束語
Web服務(wù)因為客戶端和服務(wù)器端通信消息采用XML文本格式,便于不同平臺系統(tǒng)之間的通信,因此在一個基于Web服務(wù)的模型中,客戶不需要考慮服務(wù)器端使用的語言和操作系統(tǒng),不同平臺和操作系統(tǒng)的客戶端和服務(wù)器端可以基于同樣的協(xié)議,沒有障礙地通信??蛻舳酥恍铇俗RWeb服務(wù)的位置及其可以調(diào)用的方法,就可以簡單地使用Web服務(wù)。微軟公司的.NET框架針對Web服務(wù)提供了廣泛的支持。為了提高服務(wù)的安全性,微軟的.NET框架同時提供了WSE技術(shù)(Web Services Enhancements)。WSE提供對Web服務(wù)技術(shù)規(guī)范的支持,包括WS-Routing、WS-Security和WS-Attachment。總體而言,其.NET框架是實現(xiàn)Web服務(wù)的簡單而且便利的平臺。本文舉例說明了.NET環(huán)境下,Web服務(wù)的構(gòu)建及其典型的應(yīng)用,以供讀者參考。
參考文獻:
[1] Peter Thorsteinson,G. Gnana Arun Ganesh著,梁志敏,蔡建譯,
.NET安全性與密碼術(shù)[M].清華大學出版社,2004.
[2] J.D. Meier, Srinath Vasireddy, Ashish Babbar, Alex Mackman,
Improving Web Services Performance. http://msdn2.microsoft.com/en-us/library/ms998562.aspx,2004.
[3] 石志國等.ASP.NET應(yīng)用教程[M].清華大學出版社,2005.
[4] 尚俊杰.ASP.NET程序設(shè)計[M].清華大學出版社,2004.
[5] 崔淼等.ASP.NET程序設(shè)計教程(C#版)(第2版)[M].機械工業(yè)出版社,
2011.