監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 簽約案例 | 購買價(jià)格 | 在線試用 | 手機(jī)APP | 產(chǎn)品資料
X 關(guān)閉

如何創(chuàng)建Web服務(wù)

申請免費(fèi)試用、咨詢電話:400-8352-114

文章來源:泛普軟件 .NET最強(qiáng)大的一個(gè)方面之一就是可以利用它創(chuàng)建Web服務(wù)。一個(gè)Web服務(wù)就是一個(gè)網(wǎng)站所提供的供其它網(wǎng)站調(diào)用的外部接口。舉個(gè)例子來說,某個(gè)金融公司可以為與它的貿(mào)易伙伴通過Web服務(wù)提供詳細(xì)的股票報(bào)價(jià),這些信息可以是通過Web頁面進(jìn)行讀取和顯示的,也可以是從客戶的桌面電腦的應(yīng)用程序里讀取的。

 

本文就對Web服務(wù)的其中兩個(gè)方面進(jìn)行說明:一是如何創(chuàng)建Web服務(wù);二是如何使用Web服務(wù)。作為例子,我們以來自ASPFAQs.com(http://www.aspfaqs.com/aspfaqs/)的FAQS(常見問題解答)的Web服務(wù)來解釋如何創(chuàng)建一個(gè)Web服務(wù)。

 

創(chuàng)建Web服務(wù)

 

在你創(chuàng)建一個(gè)Web服務(wù)之前,你首先必須問問自己:“我要向我的用戶提供什么服務(wù)?”。本文的目標(biāo)就是創(chuàng)建這樣一個(gè)Web服務(wù):讓其它的用戶在他們自己的網(wǎng)站上顯示來自ASPFAQs.com的常見問題解答(FAQS)的列表。比較理想的功能是限制其他的網(wǎng)站只能夠查看FAQS分類和按分類排列的FAQS,如果你想查看一個(gè)問題的答案,就讓用戶去訪問提供服務(wù)的網(wǎng)站http://www.aspfaqs.com。本文例子的Web服務(wù)最終向其他網(wǎng)站提供如下的功能:

 

1,瀏覽所有FAQ分類的列表

2,瀏覽某一分類里的所有FAQS。

3,瀏覽某一個(gè)FAQ的問題,但不包含答案。

 

創(chuàng)建一個(gè)Web服務(wù)是很簡單的,首先創(chuàng)建一個(gè).asmx文件(你可以用Visual Studio .NET或你自己喜歡的任何文本編輯器,推薦使用Web Matrix,它有創(chuàng)建Web服務(wù)的模板),Web服務(wù)作為一個(gè)普通的類進(jìn)行創(chuàng)建,在方法的前面有一個(gè)宏,表明這個(gè)方法是通過Web服務(wù)來訪問的。

 

就ASPFAQS.com的Web服務(wù)來說,首先創(chuàng)建三個(gè)通過Web服務(wù)訪問的方法,GetCategories, GetFAQsInCategory和GetFAQ,分別實(shí)現(xiàn)上面提出的任務(wù)1,2,3。并創(chuàng)建一個(gè)私有方法GetDataSet,按傳遞過來的SQL查詢組裝成一個(gè)DataSet。下面就是實(shí)現(xiàn)的代碼:

 

〈%@ WebService Language=“VB“ Class=“ASPFAQs“ %〉

Imports System.Web.Services

Imports System.Data

Imports System.Data.SqlClient

Imports System.Configuration

 

Public Class ASPFAQs

 

  ’ 創(chuàng)建私有功能方法GetDataSet

  Private Function GetDataSet(strSQL as String) as DataSet

’1. 創(chuàng)建一個(gè)SqlConnection連接對象

Dim myConnection as New SqlConnection(ConnectionString)

 

’2. 創(chuàng)建COMMAND對象,傳入SQL參數(shù)

Dim myCommand as New SqlCommand(strSQL, myConnection)

 

myConnection.Open()

 

’3. 創(chuàng)建DataAdapter對象

Dim myDataAdapter as New SqlDataAdapter()

myDataAdapter.SelectCommand = myCommand

 

’4. 生成DataSet并關(guān)閉連接

Dim myDataSet as New DataSet()

myDataAdapter.Fill(myDataSet)

myConnection.Close()

 

’返回DataSet

Return myDataSet

  End Function

 

  ’ 創(chuàng)建實(shí)現(xiàn)實(shí)現(xiàn)三個(gè)任務(wù)的方法

  〈WebMethod()〉 Public Function GetCategories() as DataSet

Return GetDataSet(SQL Query) ’這里的參數(shù)SQL用來得到所有FAQ分類

  End Function

 

  〈WebMethod()〉 Public Function GetFAQsInCategory(catID as Integer) as DataSet

Return GetDataSet(SQL Query) ’這里的參數(shù)SQL用來得到某分類(catID)的所有FAQ

  End Function

 

  〈WebMethod()〉 Public Function GetFAQ(FAQID as Integer) as DataSet

Return GetDataSet(SQL Query) ’這里的參數(shù)SQL用來得到某FAQ(FAQID)的信息

  End Function

End Class

 

正如前面所說的那樣,三個(gè)通過Web服務(wù)訪問的方法都有前導(dǎo)符,在.asmx文件的第一行有一個(gè)@WebService標(biāo)明所使用的語言和類名。這個(gè)Web服務(wù)名為ASPFAQs,和類同名。一旦創(chuàng)建好了.asmx文件,就把它保存到可通過Web訪問的目錄下,然后就可以通過Web瀏覽器進(jìn)行訪問。例如:假如Web服務(wù)文件名字是ASPFAQs.asmx,并保存到/WS目錄下,這樣任何人就可以通過http://aspnet.4guysfromrolla.com/WS/ASPFAQs.asmx進(jìn)行訪問,就可以看到Web服務(wù)使用的所有公共方法,你還可以提供輸入?yún)?shù)看到返回的結(jié)果。

 

需要說明的是:你在進(jìn)行需要參數(shù)的Web服務(wù)的方法的調(diào)用時(shí),不必?fù)?dān)心傳入?yún)?shù)的類型是否正確,Web服務(wù)代碼會(huì)自動(dòng)確保傳入?yún)?shù)類型的正確性,在上面的例子中參數(shù)類型為整型,如果惡意的用戶企圖向Web服務(wù)傳入象0 ’malicious SQL statement這樣的參數(shù),就會(huì)返回錯(cuò)誤的信息:annot convert 0 ’malicious SQL to System.Int32. Parameter name: type --〉 Input string was not in a correct format。然而,如果你傳入字符串類型的參數(shù),你應(yīng)當(dāng)記住把單個(gè)撇號(’)替換成兩個(gè)連續(xù)的撇號(’’)。

 

使用Web服務(wù)

 

上面,我們創(chuàng)建了Web服務(wù),下面就看看別的網(wǎng)站如何使用這個(gè)Web服務(wù)。為了方便起見,我們把使用Web服務(wù)的客戶網(wǎng)站叫做“消費(fèi)者”,把提供Web服務(wù)網(wǎng)站就“生產(chǎn)者”。最本質(zhì)的東西就是消費(fèi)者必須知道要調(diào)用生產(chǎn)者的什么方法。如果需要參數(shù)的話,這些參數(shù)必須轉(zhuǎn)換成XML格式進(jìn)行傳入,消費(fèi)者向生產(chǎn)者發(fā)送HTTP請求,并指明要調(diào)用的方法和參數(shù),參數(shù)可以是通過QueryString形式的SOAP請求或者是以POST的請求頭的形式進(jìn)行傳遞。

 

生產(chǎn)者收到發(fā)送過來的請求后,對輸入?yún)?shù)進(jìn)行解包,并調(diào)用指定類的適當(dāng)?shù)姆椒āH绻{(diào)用完成,就把結(jié)果返回,進(jìn)行打包,然后發(fā)送回消費(fèi)者。消費(fèi)者收到響應(yīng)結(jié)果,進(jìn)行解包,就完成了Web服務(wù)的調(diào)用。

 

很明顯,其實(shí)我們在使用Web服務(wù)時(shí)一點(diǎn)也不用擔(dān)心發(fā)送的HTTP信息的語義,為了達(dá)到這樣的目的,我們可以使用一個(gè)叫做Proxy的類,Proxy的作用是充當(dāng)消費(fèi)者應(yīng)用程序或Web頁面和生產(chǎn)者實(shí)際Web服務(wù)之間的中間過程。對生產(chǎn)者Web服務(wù)的每一個(gè)方法來說,同時(shí)也在Proxy類里有一個(gè)相同的方法,Proxy的職責(zé)就是處理所有傳送的復(fù)雜消息,這種復(fù)雜性在Proxy類里被隱藏起來的,我們只需要簡單地調(diào)用該類的方法即可,不必關(guān)心語義的事情。

 

此時(shí)你也許很迷惑,但這種迷惑也是可以理解的,這本身就是一個(gè)很令人迷惑的話題。要理解的最基本的事情就是:當(dāng)調(diào)用Web服務(wù)時(shí)消費(fèi)者和生產(chǎn)者之間的HTTP通信可能是復(fù)雜的,而且可能會(huì)需要編寫不少的代碼。我們更愿意看到的是,使用Web服務(wù)的頁面調(diào)用Web服務(wù)時(shí)就象使用一個(gè)本地的組件一樣方便,為了實(shí)現(xiàn)這一目標(biāo),我們使用Proxy類,它的公用接口與Web服務(wù)的方法相對應(yīng)。如果你此時(shí)還感到迷惑的話,請看看這個(gè)演示文檔http://aspnet.4guysfromrolla.com/code/ConsumeWS.ppt,它將向你解釋如何使用Web服務(wù)。

 

利用 Visual Studio .NET 創(chuàng)建 Proxy 類

 

在Visual Studio .NET里創(chuàng)建Web服務(wù)使用的Proxy類是件輕而易舉的事情,在ASP.NET Web項(xiàng)目里,在“引用”上單擊右鍵,選擇“添加Web引用”,這時(shí)會(huì)彈出一個(gè)對話框,要你輸入一個(gè)URL地址,請輸入http://aspnet.4guysfromrolla.com/ws/ASPFAQs.asmx,然后你就會(huì)看到這個(gè)Web服務(wù)的描述(就象你在Web瀏覽器里直接看到的那樣),最后單擊“添加引用”按鈕,Visual Studio .NET會(huì)自動(dòng)為你創(chuàng)建一個(gè)Proxy類,并且進(jìn)行編譯。當(dāng)你把它添加進(jìn)你的工程里時(shí),Proxy類的名稱空間可能就是你的網(wǎng)站地址,比如:com.4guysfromrolla.aspnet,當(dāng)然你還可以任意改成其他的任何名字。從你的Web頁面里通過Proxy類調(diào)用Web服務(wù)就象你使用本地組件進(jìn)行調(diào)用一樣方便。假設(shè)你想顯示ASP.NET類別(category ID為22)FAQS的列表,我們可以通過調(diào)用Web服務(wù)的GetFAQsInCategory方法,在參數(shù)里傳入22,并把返回的DataSet綁定到一個(gè)DataGrid,代碼可能象如下的寫法那樣:

 

’.aspx 頁面中的其他HTML內(nèi)容......

〈asp:datagrid id=“dgCategoryFAQs“ runat=“server“ /〉

 

Private Sub Page_Load(sender as Object, e as EventArgs)

  ’創(chuàng)建Proxy類的實(shí)例

  Dim consumeWebService as com._4guysfromrolla.aspnet.ASPFAQs

  Set consumeWebService = New com._4guysfromrolla.aspnet.ASPFAQs

 

  ’把GetFAQsInCategory結(jié)果綁定到dgCategoryFAQs

  dgCategoryFAQs.DataSource = consumeWebService.GetFAQsInCategory(22)

  dgCategoryFAQs.DataBind()

End Sub

 

檢查一下上面的代碼,你可能不明白對com._4guysfromrolla.aspnet.ASPFAQs Proxy類的調(diào)用實(shí)際上就是遠(yuǎn)程Web服務(wù)的調(diào)用,當(dāng)調(diào)用Proxy類的GetFAQsInCategory方法時(shí),會(huì)進(jìn)行復(fù)雜的數(shù)據(jù)通訊(HTTP的請求/響應(yīng))。

 

結(jié)論

 

在本文里,我們講述了如何創(chuàng)建Web服務(wù),并如何在ASP.NET頁面里使用它。微軟公司實(shí)際上在.NET里已經(jīng)簡化了創(chuàng)建和使用Web服務(wù)的過程。創(chuàng)建一個(gè)Web服務(wù)簡單到只需創(chuàng)建.asmx文件,然后為Web服務(wù)的方法寫一點(diǎn)代碼,并添加宏,那些代碼看上去就和本地組件代碼一樣。使用Web服務(wù)也是很簡單,這還要?dú)w功于Proxy類的使用。如前所述,利用諸如Visual Studio .NET那樣的工具來創(chuàng)建一個(gè)Proxy類也是非常簡單的。(techtarget)

發(fā)布:2007-04-22 09:58    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
南昌OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號1層9號

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢

泛普南昌OA信息化其他應(yīng)用

南昌OA軟件 南昌OA新聞動(dòng)態(tài) 南昌OA信息化 南昌OA快博 南昌OA行業(yè)資訊 南昌軟件開發(fā)公司 南昌門禁系統(tǒng) 南昌物業(yè)管理軟件 南昌倉庫管理軟件 南昌餐飲管理軟件 南昌網(wǎng)站建設(shè)公司