什麼是Web Service?
Web Service 是一種新的Web應用程式分支,他們是自包含、自描述、模組化的應用,發行就緒、定位、通過Web調用。Web Service可以執行從簡單的請求到複雜商務處理的任何功能。一旦部署以後,其他Web Service應用程式可以發現並調用它部署的服務。
Web Service是一種應用程式,它運用了Web網路技術和基於組件開發的精華成分。可以使用標準的互連網協議,像超文字傳輸通訊協定 (HTTP)(HTTP)和XML,將功能綱領性地體現在互連網和企業內部網上。像DCOM、RMI、IIOP等基於組件的物件模型已經流行了較長一段時間了。然而這些模型都是依賴於一個特定的物件模型協議。Web Service擴充了這些模型,使之可以和簡易物件存取通訊協定 (SOAP)(Simple Object Access Protocol,SOAP)以及XML通訊以根除特定物件模型協議帶來的障礙。可將WebService視作Web上的組件編程。(參見如圖1)
Web Service基本上是利用超文本傳送協議(HTTP)和SOAP來使商業資料可以在網上獲得。它將商業對象(COM對象、Java Beans等)顯露給在HTTP上的SOAP調用並執行遠端函式呼叫。因此,Web Service的使用者可以在遠程對象上通過SOAP和HTTP在Web上進行方法調用。
圖1
SOAP調用是一類能引起在位置B上的Web Service組件程式執行的調用。之後,程式執行的結果就以XML文檔的形式返回給在位置A上的使用者。
在圖1中,在位置A的使用者怎麼知道在位置B的使用者的一些情況的呢?這個就要涉及到一個通用標準。服務描述語言(Service Description Language, SDL),SOAP契約語言(SOAP Contract Language,SCL)以及網路可訪問性規格語言(Network Accessible Specification Language,NASSL)都是為了這個目的而建立的XML類語言。然而,IBM和微軟最近同意將Web服務描述語言(Web Service Description Language,WSDL)作為Web Service的標準。
Web Service組件的結構是通過Web服務描述語言來顯露的。WSDL1.1是一個用來描述Web Service的屬性以及介面的XML文檔。目前已經有了新的規格書,該規格書可以在http://msdn.microsoft.com/xml/general/wsdl.asp上獲得。
建立一個Web Service
下面,我們將用C#建立一個名為“SecurityWebService”的Web Service。一個Web Service檔案將含有形式為.asmx的副檔名。(就像Asp.net的副檔名為.aspx)
<%@ WebService Language="C#" class="SecurityWebService" %>
這條語句將告訴編譯器程式將運行在Web Service模式下以及C#類的名稱。同時我們要訪問Web Service的名字空間。還有,最好添加一個對System名字空間的引用。
using System;
using System.Web.Services;
該SecurityWebService的類應該繼承Web Service類的功能。因此,我們添加了下面這行代碼:
public class SecurityWebService : WebService
現在我們來運用我們的物件導向的技巧編寫一個C#類。C#的類和C++、Java的類非常相象,如果你有C++和Java的基礎,這個就是小菜一碟了。
.Net下的Web Service能夠設定一些基本的資料類型。因此,如果我們返回“int”、“float”或是“string”等資料類型的話,它能自動將它們轉化為標準的XML輸出。然而不巧的是在大多數的情況下,我們需要同一個實體的一類資料集。下面我先舉個例子。我們的SecurityWebService股票報價服務需求使用者輸入一個公司的代號,然後它會給出公司的全名以及當前的股票價格。由此,我們需要一個公司的三條資訊:
公司代號(資料類型:string)
公司全名(資料類型:string)
股票價格(資料類型:double)
我們需要將單個股票報價的資料資訊分解開。可以有很多方法完成此項工作,我們這裡用了最好的列舉資料型別。我們在C#中用了“structs”,和C++中的structs一樣。代碼如下:
public struct SecurityInfo
{
public string Code;
public string CompanyName;
public double Price;
}
Security.Code = Code;
Security.CompanyName = Code + " Pty Ltd";
Random RandomNumber = new System.Random();
Security.Price = double.Parse(new System.Random(RandomNumber.Next(1,10)).NextDouble().ToString("##.##"));
}
[WebMethod(Description="This method call will get the company name and the price for a given security code.",EnableSession=false)]
public SecurityInfo GetSecurityInfo(string Code)
{
AssignValues(Code);
SecurityInfo SecurityDetails = new SecurityInfo();
SecurityDetails.Code = Security.Code;
SecurityDetails.CompanyName = Security.CompanyName;
SecurityDetails.Price = Security.Price;
return SecurityDetails;
}
}