運用C#建立一個.Net下的Web Service

來源:互聯網
上載者:User
web|建立 微軟在其.net戰略中,對其主推的Web Service做了大肆的宣揚。現在,Web Service正如火如荼地發展著,相關的各項新技術層出不窮。Web Service的發展正構築著互連網時代美好的明天。在本文中,我將向大家介紹Web Service的一些基本知識、如何用C#建立一個Web Service。通過文章,我們還將對WSDL、UDDI以及未來的Web Service有一個大致的瞭解。

為什麼需要Web Service?
以前,分布式的應用程式邏輯需要使用分布式的物件模型,通過使用DCOM、CORBA、RMI之類的基本結構,開發人員仍可擁有使用本地模型所提供的豐富資源和精確性,並可將服務置於遠程系統中。
當已經有中意的中介軟體平台(RMI、Jini、CORBA、DCOM 等等)時,我們為什麼還要為Web而煩惱呢?中介軟體確實提供了強大的服務實現手段,但是,這些系統有一個共同的缺陷,那就是它們無法擴充到互連網上:它們要求服務用戶端與系統提供的服務本身之間必須進行緊密耦合,即要求一個同類基本結構。然而這樣的系統往往十分脆弱:如果一端的執行機制發生變化,那麼另一端便會崩潰。例如,如果伺服器應用程式的介面發生更改,那麼用戶端便會崩潰。為了能擴充到互連網運用,我們需要一種鬆散偶合的基本結構來解決這個問題。如此的情況下就迎來了Web Service的誕生。

什麼是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的最好方法就是自己動手做一個執行個體。我們都熟悉股票報價服務,納斯達克、道瓊斯都是很著名的例子。它們都提供一個輸入公司代號並取得最新的股票價格的介面。本文我們就設法設計出同樣的功能。

建立Web Service的工具
本文我們通過MS.Net Framework SDK來實現這個程式。
建立Web Service的比較好的整合式開發環境(IDE)是Visual Studio.Net。然而,你也可以很容易的用任何文字編輯器(記事本、寫字板、Visual Studio 6.0)來建立一個Web Service檔案。
還有,你必須熟悉以下概念:
Net平台的基礎知識
C#的基礎知識
物件導向概念的基礎知識

建立一個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;
}

現在我們已經完成所有建立Web Service所需的模組了。因此,所有的代碼如下:

<%@ WebService Language="C#" class="SecurityWebService" %>

using System;
using System.Web.Services;

public struct SecurityInfo
{
public string Code;
public string CompanyName;
public double Price;
}

public class SecurityWebService : WebService
{
private SecurityInfo Security;

public SecurityWebService()
{
Security.Code = "";
Security.CompanyName = "";
Security.Price = 0;
}

private void AssignValues(string Code)
{
// 在這裡使用商業組件
// 方法調用就是用來獲得所需的資料的
// 本程式中我給相應的代碼添加了一個對應的字串以方便顯示
// 同時,我使用了隨機數產生器來產生股票價格

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;
}
}

請記住,這個Web Service能通過Http做任何使用。我們也許會在代碼中涉及到一些很敏感的商業資料,但是卻不想它落入他人之手。那解決的方案就是保護一些邏輯函數,使使用者只能訪問到一些用來顯示資料的函數。為了達到這個目的,我們使用了關鍵字“[Web Method]”。下面就是範例程式碼:
[WebMethod(Description="This......",EnableSession=false)]
public SecurityInfo GetSecurityInfo(string Code)
這個函數的訪問類型是公有型的。標籤“Description”是用來描述這個Web Service的功能的。因為我們不必儲存任何session資料,所以我們將session狀態設定為false。
private void AssignValues(string Code)
這是一個應該被邏輯保護的函數。因為我們不希望我們的商業機密資料能在Web被輕易的獲得,所以我們將函數的訪問類型設為private(註:在這裡,即使你將函數的訪問類型設為public,這個函數還是不能被公用地訪問到,原因是關鍵字“[Web Method]”沒有被用到)。
到此,我們可以用GetSecurityInfo(string)函數來獲得最新的股票價格。同時,為了方便起見,我給公司代碼添加了相應公司的名字。還有,股票的價格是隨機產生的。
最後,我們將該檔案儲存在一個由IIS控制的目錄下,檔案名稱為“SampleService.asmx”。運行後的圖示如下:


圖2

以上是一個由.Net Framework產生的Web頁面,我們並沒有建立這個頁面(它是由系統自動產生的,所以我並不需要寫任何代碼來建立該頁面)。這個功能使我們的工作量相對減輕了不少。同樣,你也可以通過運用Asp.net的Pagelets功能或修改網頁檔案使頁面以不同的方式顯示其中的內容。你可以在http://www.ibuyspy.com/store/InstantOrder.asmx獲得一個很好的例子。

如何使用這個Web Service?
現在我們來使用這個Web Service。我們先輸入一些值來獲得股票樣本價格。


圖3

按下Invoke按鈕,我們就可以獲得以下的XML文檔:


圖4

這樣,這個Web Service就給使用者提供了其所需的資訊了。因為是XML格式的文檔,我們需要寫用戶端來析取這個XML文檔。用戶端可以為以下幾類:
1.一個Web頁面
2.一個控制台或是Windows下的運用程式
3.一個用WML語言描述的手機程式
4.一個運用在PDA上的Palm或Win CE程式
你可以直接用Http Get方法來調用這個Web Service。這樣的話就不會出現第一個頁面了,也不需要使用者去點擊Invoke按鈕了。具體方法:
http://server/webServiceName.asmx/functionName?parameter=parameterValue
調用我們的Web Service的方法就是:
http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo?Code=IBM

到此為止,我們已經知道如何用C#建立並使用一個Web Service,但是任務並沒有完全完成。我們需要知道如何在Internet上找到我們的Web Service,我們的Web Service能不能也被收入在個大搜尋引擎。為瞭解決這個問題,我們就需要建立一個“discovery”檔案。

建立發現檔案
在訪問一個已有的Web Service以前,你必須先得找到並整合這個Web Service,這個過程就是Web Service的發現過程。通過這個發現過程,你才知道這個Web Service能為你提供什麼樣的服務以及你怎麼和它實現互動。發現檔案是一個以.DISCO為副檔名的XML檔案。在實際運用中,你是不必為每一個Web Service建立發現檔案的。以下就是一個發現檔案的例子:
<?xml version="1.0" ?>
<disco:discovery xmlns:disco="http://schemas.xmlsoap.org/disco/">
<scl:contractRef ref="http://localhost/work/aspx/SampleService.asmx?SDL"/>
</disco:discovery>
我們先將這個檔案命名為“SampleService.disco”,並將它儲存在該Web Service的目錄下。如果我們是在“/work/aspx”目錄下建立Web Service的話,我們就可以運用更靈活的“動態發現”了。“動態發現”能自動為我們檢測“/work/aspx”目錄以及子目錄下的所有*.DISCO檔案的,這樣就省了我們不少功夫。
<?xml version="1.0" ?>
<dynamicDiscovery xmlns="urn:schemas-dynamicdiscovery:disco.2000-03-17">
</dynamicDiscovery>  
你可以在http://services3.xmethods.net/dotnet/default.disco獲得一份能使用的發現檔案。通過分析發現檔案,我們可以找到所需的Web Service。然而,在得到發現檔案前你必須知道這個發現檔案的確切的URL。否則你還是找不到你要的發現檔案的,那麼你當然就不能找到你要的Web Service了。這樣,我們現在就要用到一項新技術了――通用發現,描述和整合(Universal Description,Discovery,and Integration,UDDI)來為已存在的Web Service做宣傳了。UDDI是公開的,基於Internet的。這項技術目前還處於起初階段,所以正不斷髮展著。你可以在http://uddi.microsoft.com/ 獲得有關UDDI的參考。

發布這個Web Service
發布Web Service是很簡單的。和Asp.net的程式差不多,你只要將.asmx檔案和.disco檔案拷貝到相應的目錄,這樣如果一切正常,這個Web Service就可以工作了。

展望Web Service的未來
Web Service技術的前途是相當光明的。在推動Web Service技術向前發展的道路上,不僅微軟注入了很大的投資,Sun、IBM等也表示很大的興趣。同時,網上還有為Apache和Java Web開發的SOAP工具包。然而,Web Service起步不久,還需要很多的工作要做。特別在國內,Web Service技術起步比國外有晚了一步,所以更要抓緊時間、迎接挑戰。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.