監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價咨詢管理系統(tǒng) | 工程設(shè)計管理系統(tǒng) | 甲方項目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

微軟.NET中比較受關(guān)心的技術(shù)-Web Services

申請免費試用、咨詢電話:400-8352-114

AMTeam.org

微軟.NET中比較受關(guān)心的技術(shù)-Web Services


 
為什么需要Web Service

在通過internet網(wǎng)購買商品后,你可能對配送方式感到迷惑不解。經(jīng)常的情況是因配送問題找配送公司而消耗你的大量時間,對于配送公司而言這也不是一項增值服務(wù)。

為了解決這種問題,配送公司需要在不降低安全級別的情況下了解更多的遞送信息,然而安全公司設(shè)計的安全系統(tǒng)卻非常復(fù)雜。那么我們能不能只使用80端口(web服務(wù)器端口)并且只通過web服務(wù)器提供信息呢?所以,我們建立了一個全新的web應(yīng)用程序以便從核心商業(yè)應(yīng)用程序中獲得數(shù)據(jù)。配送公司將為些東西付money,所有的公司都希望能夠?qū)⒆⒁饬性诤诵纳虡I(yè)應(yīng)用上。

什么是Web Service?

Web Service是一種構(gòu)建應(yīng)用程序的普通模型,并能在所有支持internet網(wǎng)通訊的操作系統(tǒng)上實施。Web Service令基于組件的開發(fā)和web的結(jié)合達到最佳,基于組件的對象模型,象: Distributed Component Object Model (DCOM), Remote Method Invocation (RMI), 和 Internet Inter-Orb Protocol (IIOP) 都已經(jīng)發(fā)布很長時間了,不幸的是這些模型都依賴于特殊對象模型協(xié)議。Web Service利用soap和Xml對這些模型在通訊方面作了進一步的擴展以消除特殊對象模型的障礙。

Web Service主要利用http和soap協(xié)議使商業(yè)數(shù)據(jù)在web傳輸, saop通過http調(diào)用商業(yè)對象執(zhí)行遠程功能調(diào)用,web用戶能夠使用soap和http通過web調(diào)用的方法來調(diào)用遠程對象。

那么怎樣使在位置a的用戶明白位置b的Web Service的意思呢?這個問題可以通過和一個一致的共同標準來回答。描述性服務(wù)語言(Service Description Language (SDL)),soap訂約語言(SOAP Contract Language (SCL) )和網(wǎng)絡(luò)訪問規(guī)范語言(Network Accessible Specification Language (NASSL) )都是為這個目的建立的相似語言,然而IBM和微軟都同意Web Service Description Language (WSDL)作為Web Service 的標準語言。

Web Service部件的結(jié)構(gòu)由Web Service Description Language.描述,wsdl1.1是一份Xml文檔,描述了Web Service的屬性和接口。新的規(guī)范可以在msdn.microsoft.com/Xml/general/wsdl.asp了解到。

當前的任務(wù)

最好的學習方法是創(chuàng)建一個Web Service,我們以一個股票報價系統(tǒng)為例,納斯達克和澳大利亞股票交易系統(tǒng)都是非常有名的例子,他們都提供了一個接口,用于輸入公司代碼和接受最終成交的股票價格。

我們復(fù)制一個相同的功能的Web Service。

我們的Web Service的輸入?yún)?shù)是股票代碼,Web Service通過調(diào)用中間層商業(yè)邏輯函數(shù)獲得股票價格,商業(yè)邏輯函數(shù)保持以最小的部分集中在Web Service上。

Web Service開發(fā)工具

實現(xiàn)這個應(yīng)用程序的核心部件將是微軟 .net framework sdk,不過他現(xiàn)在還是一個試用版,你可以在微軟站點下載,我的配置是:操作系統(tǒng) windows 2000 server,pIII300,300mb內(nèi)存。

創(chuàng)建Web Service的首選集成開發(fā)環(huán)境(IDE)是visual studio.net, 然而,你可以用任何一種文本編輯器(wordpad,notepad,visual studio6.0)輕易創(chuàng)建一個Web Service文件。

創(chuàng)建Web Service

我將用c#創(chuàng)建一個Web Service 叫SecurityWebService。一個Web Service文件的擴展名是:.asmx(就象asp.net的文件擴展名.aspx那樣),文件的第一行是:

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

這個語句的含義是:告訴編譯器運行Web Service模式,還有c#類名。我們還需要訪問Web Service名字空間,這也是引用系統(tǒng)名字空間的一次好實踐。

using System;

using System.Web.Services;

SecurityWebService 應(yīng)該繼承了Web Service類的功能,因此我們有必要加入下面這行代碼

public class SecurityWebService : WebService

現(xiàn)在我們使用面向?qū)ο蟮木幊碳记蓜?chuàng)建一個類,c#的類與c++和java非常相似,用C#建一個類件象去公園散步那樣簡單,而且不需要任何技巧。

C#的基本數(shù)據(jù)類型設(shè)計的非常聰明,因此,如果我們返回"int," "float," 或者 "string" ,那么將自動將他們轉(zhuǎn)變成標準Xml輸出。不幸的是,在大多數(shù)例子中我們需要將獲得的數(shù)據(jù)集合看成一個單一的實體(single entity)?,F(xiàn)在我們舉一個例子。

我們的 SecurityWebService 股票報價系統(tǒng)需要用戶輸入股票代碼,并且還將返回完整的公司名和現(xiàn)行股票價格,所以對一只股票而言我們有三個信息塊。

1、公司代碼(string)

2、公司名(string)

3、價格(double)

當我們提交股票時,我們需要提取所有三種數(shù)據(jù),有幾種方法來完成這項工作,最好的方法是將他們綁定到一種可被枚舉的數(shù)據(jù)類型內(nèi),我們在c#中可用"struct"來完成,c#中的"struct"和c++中的結(jié)構(gòu)很相似。

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

我們可以通過模塊創(chuàng)建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)
{
// This is where you use your business components.
// Method calls on Business components are used to populate the data.
// For demonstration purposes, I will add a string to the Code and
// use a random number generator to create the price feed.

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().Format("##.##",null));
}


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

}

記住所有用戶都能通過http訪問Web Service,也許你會談到代碼中的機密商業(yè)數(shù)據(jù)和不希望其他人知道的數(shù)據(jù),怎樣保守數(shù)據(jù)機密。解決方法是保護商業(yè)邏輯功能塊,只允許訪問表示層,在c#中可以通過使用關(guān)鍵字"[Web Method]"來達到這個目的,我們看看下面的代碼:

[WebMethod(Description="This......",EnableSession=false)]
public SecurityInfo GetSecurityInfo(string Code)
  
這個函數(shù)顯示給公眾,description標記用于描述Web Service的功能,由于我們不能存儲任何會話數(shù)據(jù),我們就將消除會話狀態(tài)。

private void AssignValues(string Code)

這個商業(yè)邏輯函數(shù)不被公眾所知,我們不希望敏感的商業(yè)信息被公布在web上(注意:甚至將private改為public,公眾仍然看不見,為什么呢?,這是由于沒有使用[Web Method]關(guān)鍵字。)

我們可以在這個函數(shù)中利用商業(yè)邏輯獲得最新的股票報價,為了這個目的,我在代碼中添加了文本框以便輸入公司名稱,價格由一個隨機函數(shù)產(chǎn)生。

我們把這個文件以SampleService.asmx保存在IIS目錄下。我將他保存在虛擬目錄"/work/aspx"下,在WEB瀏覽器中的相似如下圖: (這里圖略)

這個WEB頁是由.NET framework生成的,我們沒有創(chuàng)建這個頁(這是由系統(tǒng)自動生成的,我們沒有為他寫任何一行代碼,這附圖是先前代碼的副產(chǎn)品),準備使用的功能對單一的Web Service是相當合適的。

使用asp.net和config.web文件可以很輕松的改變該頁。不過要注意那個SDL規(guī)范的鏈接(即使我們我們使用WSDL,.NET 版仍然引用了SDL,這個問題在下一個版本中有希望矯正),這是Web Service的一個描述文件目的是創(chuàng)建一個代理對象,這基本上給出Web Service的一個大致介紹,如果你對這些都比較熟悉,你可以只看"Web-only"方法,SDL規(guī)范對所有私有函數(shù)和屬性都未描述,SecurityWebService 類的SDL規(guī)范在例程A中看到。

怎樣使用Web Service

現(xiàn)在我們能夠使用這個Web Service了,讓我們輸入一個值獲得一個假的價格。

點擊Invoke按鈕,將顯示一個下面這樣的新窗口和Xml文檔。

這顯示了Web Service怎樣發(fā)布信息,我們需要設(shè)計一個客戶端來顯示Xml文檔,這個客戶端應(yīng)該是:

1、一個Web 頁

2、控制臺或Windows應(yīng)用程序

3、能和移動電話交互的WML或Wmlscript

4、能在PDA上使用的Palm或Windows ce應(yīng)用程序

后面我將解釋建立客戶端的過程

可以通過http get方法直接調(diào)用Web Service,在這個例子中將不通過上面的web頁和點擊invoke按鈕獲得Xml文檔,我們直接用http get方法調(diào)用Xml文檔,那么語法應(yīng)下:

http://server/webServiceName.asmx/functionName?parameter=parameterValue

所以對我們這個例子而言,語句將是:

http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo?Code=IBM

這與點擊invoke按鈕效果一樣,將產(chǎn)生同樣的結(jié)果。

現(xiàn)在我們知道怎樣創(chuàng)建并使用一個Web Service,但我們的工作還只完成了一半。怎樣使客戶端發(fā)現(xiàn)Web Service呢?在internet網(wǎng)上通過什么途徑搜索Web Service呢?是否通過象雅虎搜索引擎那樣的搜索引擎呢?為了解決這些問題我們需要為Web Service創(chuàng)建一個"discovery" 文件。

創(chuàng)建"discovery" 文件

發(fā)現(xiàn)Web Service是詢問并定位Web Service描述的過程,是訪問Web Service的預(yù)備過程,客戶端通過發(fā)現(xiàn)Web Service的過程獲得Web Service的存在,大小,怎樣和他交互,"discovery" 文件是一個擴展名為 :.disco的Xml文檔。不必強制性地要求為每個Web Service創(chuàng)建一個"discovery" 文件,下面是本文例子的"discovery" 文件實例:

<?Xml version="1.0" ?>
<dynamicDiscovery Xmlns="urn:schemas-
         dynamicdiscovery:disco.2000-03-17">
</dynamicDiscovery>

配置Web Service

配置Web Service非常簡單,與asp.net應(yīng)用文件相似,將.asmx和.disco文件復(fù)制到相應(yīng)的目錄下就行了。

Web Service的將來

Web Service的將來是非常光明的,現(xiàn)在不單是微軟在發(fā)展Web Service技術(shù),IBM和SUN也致力于發(fā)展Web Service,SOAP toolkits已經(jīng)可以在Apache 和 Java Web servers上使用,不過我相信對于Web Service還需要做一點工作,尤其是Web Service發(fā)現(xiàn)過程,她實在是太原始了。

Web Service將在WEB上映入一些新的觀念,有一點我相信是付費瀏覽,就象付費電視一樣,我們建立WEB站點并對用戶收費, 就象付費電視一樣,用戶只需要付一點費用,這在商業(yè)上是可行的。

作為對web services的創(chuàng)建過程的文章,在最后一篇,作者列舉了一個實例:

附實例:

<?Xml version="1.0" ?>
<serviceDescription Xmlns:s0="http://tempuri.org/" name="SecurityWebService" targetNamespace="http://tempuri.org/"
Xmlns="urn:schemas-Xmlsoap-org:sdl.2000-01-25">
<soap Xmlns="urn:schemas-Xmlsoap-org:soap-sdl-2000-01-25">
<service>
<addresses>
<address uri="http://localhost/work/aspx/SampleService.asmx" />
</addresses>
<requestResponse name="GetSecurityInfo" soapAction="http://tempuri.org/GetSecurityInfo">
<request ref="s0:GetSecurityInfo" />
<response ref="s0:GetSecurityInfoResult" />
<info>This method call will get the company name and the price for a given security code.</info>
</requestResponse>
</service>
</soap>
<httppost Xmlns="urn:schemas-Xmlsoap-org:post-sdl-2000-01-25">
<service>
<requestResponse name="GetSecurityInfo" href="http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo">
<request>
<form>
<input name="Code" />
</form>
</request>
<response>
<mimeXml ref="s0:SecurityInfo" />
</response>
<info>This method call will get the company name and the price for a given security code.</info>
</requestResponse>
</service>
</httppost>
<httpget Xmlns="urn:schemas-Xmlsoap-org:get-sdl-2000-01-25">
<service>
<requestResponse name="GetSecurityInfo" href="http://localhost/work/aspx/SampleService.asmx/GetSecurityInfo">
<request>
<param name="Code" />
</request>
<response>
<mimeXml ref="s0:SecurityInfo" />
</response>
<info>This method call will get the company name and the price for a given security code.</info>
</requestResponse>
</service>
</httpget>
<schema targetNamespace="http://tempuri.org/" attributeFormDefault="qualified"
elementFormDefault="qualified" Xmlns="http://www.w3.org/1999/XmlSchema">
<element name="GetSecurityInfo">
<complexType>
<all>
<element name="Code" Xmlns:q1="http://www.w3.org/1999/XmlSchema" type="q1:string" nullable="true" />
</all>
</complexType>
</element>
<element name="GetSecurityInfoResult">
<complexType>
<all>
<element name="result" type="s0:SecurityInfo" />
</all>
</complexType>
</element>
<complexType name="SecurityInfo">
<all>
<element name="Code" Xmlns:q2="http://www.w3.org/1999/XmlSchema" type="q2:string" nullable="true" />
<element name="CompanyName" Xmlns:q3="http://www.w3.org/1999/XmlSchema" type="q3:string" nullable="true" />
<element name="Price" Xmlns:q4="http://www.w3.org/1999/XmlSchema" type="q4:double" />
</all>
</complexType>
<element name="SecurityInfo" type="s0:SecurityInfo" />
</schema>
</serviceDescription>

發(fā)布:2007-03-25 10:28    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
相關(guān)文章: