2013年6月16日 星期日

IIS 建置 Web Service 伺服器範例 - ASP.NET(VB)

Web Service 是一種網頁服務,主要目的是提供不同平台同時存取,簡單來說就是自己定義的 Function 放在網路上讓人存取。

至於何時會用到 Web Service 呢?

舉例來說,假設許多客戶透過應用程式連上伺服器存取資料,如果直接將存取資料的語法還有判斷的邏輯架構寫在客戶的應用程式端,哪天發現問題的時候,例如判斷邏輯沒有寫好,導致於資料顯示不正確。

此時,每一個客戶端都必須強制更新程式,才能取得正確的資料,也就是只有很小的問題修改,都需要客戶端去做更新的動作,這樣的架構是非常有問題的。

而我們透過 Web Service 的仲介服務,作為客戶端和伺服端兩者之間的橋樑,客戶端只要了解需要呼叫哪一個 Web Service 的名稱及參數,送至伺服器端做好運算之後,再將結果傳回去。這樣一來,幾乎所有的邏輯判斷及資料庫的資料擷取都是在伺服器端完成,不需要去針對每一個客戶端的程式更新,維護上絕對是比較容易省時。

一般來說我們在呼叫 Web Service 時,都是透過 SOAP 協定去做存取的動作,而 Web Service 回傳的資料格式為通用的 XML 格式,由於不同平台都透過相同的協定去存取資源,也實現了跨平台的優點。

此外通常伺服器端會提供 WSDL 給客戶端參考,此檔案描述提供了那些 Web Service 及呼叫時需要提供的參數等資訊。

詳細的 Web Service 架構可以參考 WIKI

了解了基本的概念,準備開始架設 Web Service 伺服器吧!

建置環境:
伺服器:IIS 7
開發工具:Visual Studio 2010
關於IIS的架設可以參考:

然後我們開啟 Visual Studio 2010,撰寫一個測試的 Web Service 程式。

檔案 -> 新增專案

點選 Web -> ASP.NET 空白 Web 應用程式,並指定專案的名稱及位置


然後在右側的方案總管中,點選該方案後按右鍵 -> 加入 -> 新增項目


從左上角「已安裝的範本」中點選 Web,然後再選擇「Web 服務」,並設定名稱後按下「新增」


然後就可以看到範例的程式檔,此範例非常簡單,就是呼叫後會傳回 Hello World 字串


接下來我們來測試該服務是否正常,按下F5執行程式,可以看到以下頁面,目前只有提供一個服務 HelloWorld


點選後可以看到該服務的詳細資訊,因為該服務沒有提供輸入參數,所以在這邊只能直接點選「叫用」(呼叫的意思)


可以看到回傳了XML格式的資訊,內容就是 Hello World。


基本上程式沒問題了,可以將檔案發佈到 IIS伺服器。

先將整個專案做「建置」的動作


建置完成後,進行「發行」


因為我們是在本機環境做測試,所以設定發行方法設定為檔案系統,並且設定目標位置後點選發行。


如此一來就可以看到 Visual Studio 只把運行中必要的檔案複製該目錄中。
(此處的目標位置 C:\WebSites 是筆者 IIS 的根目錄,請依照您自己的環境設定)

一般來說有 asmx 檔案及 Web.config 檔案,還有 bin 目錄底下的檔案(dll, pdb, xml),這樣的發行模式,原始碼是被保護隱藏起來的,也是比較建議的模式。

現階段如果直接根據該目錄結構在網址上輸入 http://localhost/WebService/WebService.asmx 會出現以下錯誤訊息:

'/' 應用程式中發生伺服器錯誤。



剖析器錯誤

描述: 當剖析服務此要求所需的資源時發生錯誤。請檢閱下列的特定剖析錯誤詳細資訊,並且適當地修改您的原始程式檔。

剖析器錯誤訊息: 無法建立型別 'WebService.WebService'。

原始程式錯誤:


行 1:  <%@ WebService Language="vb" CodeBehind="WebService.asmx.vb" Class="WebService.WebService" %>

原始程式檔: /WebService/WebService.asmx    行: 1


版本資訊: Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.272

但是如果將檔案放置在跟目錄底下則無此問題。

如果要解決這個問題,請在 IIS 管理員中,將該目錄設定「轉換成應用程式」



選擇應用程式集區,筆者目前的環境是設置為 ASP.NET v4.0,請根據您當初架設 IIS 的環境而定。

按下確定後,再回去網址列輸入該網址,應該就不會再出現以上錯誤訊息了!



由於預設範本中的例子並沒有提供輸入參數,我們自己試著新增一個有提供參數的 Web Service 試試看!

在原本的 asmx 檔案中,新增以下程式
    
<webmethod> _
    Public Function Test(ByVal a As Integer, ByVal b As Integer) As String
        Return a + b
    End Function
</webmethod>


存檔後,一樣「建置」後「發行」網頁,並且在瀏覽器上開啟網頁測試寫好的程式

可以看到我們自己定義名稱為 Test 的 Web Service

點選進去後,可以看到這裡列出了該 Web Service 需要輸入的參數 a 和 b,並且自動產生表單提供我們輸入參數,假設我輸入 3 和 5。


根據伺服器程式的定義,就是將兩數相加後顯示,因此「叫用」後的結果就是回傳 8。
P.S 要注意的是因為當初定義的參數型別為 Integer 如果輸入非 Integer 型別的資料(例如:字串),則會出現錯誤,必須在程式中做改善(例如:例外處理)。


基本上 Web Service 的使用就是如此,是否簡單好用,此文中的測試都是透過 Visual Studio 產生的網頁來測試,而實際的狀況是要讓其他程式去呼叫此服務,所以接下來另一篇文章將要介紹如何透過程式去呼叫此 Web Service。

ASP.NET(VB) 呼叫 Web Service
http://shaocian.blogspot.tw/2013/06/aspnetvb-web-service.html

4 則留言: