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

當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 泛普各地 > 重慶OA系統(tǒng) > 重慶OA行業(yè)資訊

再談Web Service--VS.NET,我可以說(shuō)不嗎

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

AMTeam.org

再談Web Service--VS.NET,我可以說(shuō)不嗎

不久前我曾寫(xiě)了一篇有關(guān)用VS。NET Beta 2 來(lái)完成一個(gè)Web Service 的整個(gè)過(guò)程。這篇文章也是有關(guān)Web Service的,不過(guò)實(shí)現(xiàn)Web Service的整個(gè)過(guò)程完全是手工方式的,可以不依賴于VS。NET這樣的開(kāi)發(fā)工具。VS。NET開(kāi)發(fā)Web Service是非常簡(jiǎn)便的,同樣它也封裝了許多底層的信息,它希望開(kāi)發(fā)人員可以把精力集中在主要的邏輯實(shí)現(xiàn)和Service本身上。

至于對(duì)VS。NET你能否說(shuō)不,那么要看你自己的理解了,好了言歸正轉(zhuǎn),開(kāi)始實(shí)現(xiàn)這個(gè)Web Service吧。

首先你必須已經(jīng)成功安裝Framework SDK Beta 2 ,然后用Notepad、IIS、IE、Dos 的Command Prompt就可以完成了。整個(gè)功能還是沿用上次的例子,一個(gè)HelloWorld 和Add的例子,如果你Download了兩個(gè)Zip包,你會(huì)發(fā)現(xiàn)兩者中許多代碼是一樣的。特別是客戶端這邊,它根本不關(guān)心你是用什么生成的。

整個(gè)的過(guò)程分為以下幾步:

1. 手工生成一個(gè) .asmx文件。

2. 設(shè)置一下你的IIS服務(wù)器。

3. 在瀏覽器中測(cè)試這個(gè)Web Service

4. 生成代理包

5. 編寫(xiě)客戶端代碼進(jìn)行測(cè)試。

簡(jiǎn)單的看和上次在VS。NET中沒(méi)有什么不同,唯一多的是要手工設(shè)置一下IIS,在VS。NET中是通過(guò)把這頁(yè)設(shè)成Start Page然后F5來(lái)完成對(duì)IIS的設(shè)置的。有關(guān)設(shè)置的方面,dotnet比以前的ASP或Com有許多不同,全面了引進(jìn)XML格式,這個(gè)不在這里說(shuō)了。我們不要涉及這些。

具體的說(shuō):

1. 手工生成一個(gè) .asmx文件。

在VS。NET中它自動(dòng)生成一個(gè)和Project同名的. asmx文件,同樣也會(huì)再自動(dòng)生成一個(gè) .asmx.vb 或 .asmx.cs 文件,其實(shí)實(shí)現(xiàn)Service你的代碼是寫(xiě)在這個(gè)文件中的,當(dāng)然你也可以直接在 .asmx文件中直接寫(xiě),這樣IIS第一次運(yùn)行時(shí)會(huì)編譯這個(gè).asmx文件,在特定的目錄下生成一個(gè)DLL文件。不過(guò)我喜歡用象VS。NET的方式來(lái)實(shí)現(xiàn),這樣更有封裝性,實(shí)際中應(yīng)用中也更安全。道理就象一開(kāi)始我們直接在ASP中用ADO訪問(wèn)數(shù)據(jù)庫(kù),以后卻自然的是用一個(gè)組件來(lái)完成這些,然后在ASP中調(diào)用這個(gè)組件一樣。但如果你完全沿用VS。NET的作法,是無(wú)法編譯通過(guò)的。VS。NET中的.asmx文件是這樣的:

<%@ WebService Language="vb" Codebehind="Service1.asmx.vb" Class="WebService1.Service1" %>,然后是一個(gè).vb 的文件,但如果我們照抄它,編譯時(shí)需要-r許多庫(kù)文件。你可以這樣做,把這句話改成這樣的:<%@ WebService Language="vb" class="MyWebService.Service1, WebService1" %> MyWebService是Namespace , Service1是你實(shí)現(xiàn)Service功能的類名,WebService1是你編譯.vb成DLL的名字。然后在你的 .asmx.vb 中先加上這兩句話:

Namespace MyWebService

End Namespace

然后你會(huì)發(fā)現(xiàn)我Copy了原來(lái)在VS。NET中的所有實(shí)現(xiàn)WebService的代碼。然后可以存盤(pán),將.asmx和 .asmx.vb放到一個(gè)目錄中,比如:MyService,然后準(zhǔn)備在Dos 的Command中編譯這個(gè)Web Service了。使用下面的編譯的編譯命令:

VBC /t:library /r:System.web.Services.dll /r:System.dll /r:System.XML.dll /out:bin/WebService1.dll Service1.asmx.vb

確認(rèn)你在MyService目錄下打入這個(gè)命令,這樣會(huì)在這個(gè)目錄下生成的子目錄Bin中發(fā)現(xiàn)這個(gè)DLL文件:WebService1.DLL 。如果這一切都沒(méi)有問(wèn)題,那么你過(guò)了第一關(guān)。

2. 在IIS中設(shè)置。

這就比較簡(jiǎn)單了,點(diǎn)中MyService目錄右鍵選擇共享,然后共享這個(gè)目錄或是在管理工具中一步一步的新增一個(gè)虛擬目錄都是一樣的。但要效驗(yàn)?zāi)愕腁pplication Name:是否是叫WebService1和你的.asmx中class="MyWebService.Service1, WebService1" 這句對(duì)應(yīng)。具體的你可以看附帶的圖02SetupIIS.jpg。剛才編譯時(shí)用的 /out:bin/WebService1會(huì)在這里有用,如果我們什么也步配置,那么默認(rèn)的是去/bin目錄中看是否有這個(gè)文件,如果你忘了加這個(gè)參數(shù),那么編譯完成后最好Copy編譯的DLL去當(dāng)前目錄的bin子目錄

3. 完成IIS的設(shè)置后,可以用IE瀏覽器來(lái)測(cè)試了。

具體的你可以訪問(wèn)這樣的URL:http://localhost/你共享的目錄名/你的WebService.asmx 如果正常它會(huì)檢查被編譯的類,并返回一個(gè)有關(guān)這個(gè)Web Service的HTML視圖。象附帶的圖中03IEOpenAsmx.jpg中的一樣。其實(shí)它是由一個(gè)DefaultWsdlHelpGenerator.aspx的模板文件產(chǎn)生的,這個(gè)文件在C:WINNTMicrosoft.NETFrameworkv1.0.2914CONFIG 目錄中。一千五多行代碼,也許中文版出來(lái)以后這個(gè)模板也會(huì)成中文的。

4. 完成對(duì)Web Service的測(cè)試之后,我們開(kāi)始完成客戶端的工作,生成代理包,調(diào)用這個(gè)服務(wù)。

這部分也輕車熟路了,上篇文檔中的我也是手工完成的。具體分為兩步:

1. 先生成一個(gè)代理類。

wsdl /out:WebServiceProxyClass.cs http://localhost/WebService1/Service1.asmx

2. 然后編譯這個(gè)代理類。

csc /t:library /out:bin/MyWebServiceProxy.dll WebServiceProxyClass.cs

對(duì)于bin的目錄不是必須或要求的可以在任何目錄,完成這部之后,組件也自動(dòng)的注冊(cè)了,也就是說(shuō)你可以開(kāi)始調(diào)用這個(gè)Web Service了。

5. 用客戶端代碼進(jìn)行測(cè)試。

上一篇中我只用VS。NET簡(jiǎn)單的建立了一個(gè) ASP Form,上面放兩個(gè) Lable顯示一下。其實(shí)對(duì)于客戶端來(lái)說(shuō)可以說(shuō)多種多樣的,可以是ASP,Html,dotnet的應(yīng)用程序,ASP+頁(yè)面,VB程序、甚至是Java或其它任何語(yǔ)言生成的客戶端。這也真正表現(xiàn)了Web Service的意義,只要在Web上,你能找到這個(gè)Service,那么你就可以享受這個(gè)Service。

Html就很容易了比如:

<a href="http://localhost/WebService1/Service1.asmx/HelloWorld"> HelloWorld </a>你就可以完成測(cè)試。如果你要突出編程方式那么你可以象我上次一樣用 Service1 ServiceProxy = new Service1() ;

String strReturn = ServiceProxy.HelloWorld() ; 這樣的方式來(lái)獲得結(jié)果。在ClientHtml.html中我展現(xiàn)了兩種用于Web Service的協(xié)議:HTTP-GET和HTTP-POST。不過(guò)我想著重說(shuō)的是CallServiceXML.asp這個(gè)文件的作法,從中你可以發(fā)現(xiàn)許多不同的東西,到底Web Service是通過(guò)什么來(lái)返回它提供的Service,它在干什么,結(jié)果也許你會(huì)發(fā)現(xiàn)很耳熟的SOAP。其實(shí)代理類是通過(guò)SOAP協(xié)議和ASP+的Web Service進(jìn)行通訊。

你可以仔細(xì)考察下面的代碼:

function btn_click (n1, n2)

{

var xmlObj = new ActiveXObject("Msxml2.DOMDocument") ;

var sXml = "<?xml version="1.0" ?>" ;

sXml += "<soap:Envelope "

sXml += "xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" " ;

sXml += "xmlns:xsd="http://www.w3.org/2001/XMLSchema" " ;

sXml += "xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">" ;

sXml += "<soap:Body>" ;

sXml += "<Add xmlns="http://tempuri.org/">" ;

sXml = sXml + "<n1>" + n1.value + "</n1>" ;

sXml = sXml + "<n2>" + n2.value + "</n2>" ;

sXml += "</Add></soap:Body></soap:Envelope>"

xmlObj.loadXML(sXml) ;

// 完成請(qǐng)求的準(zhǔn)備,手工生成一個(gè)SOAP的格式包(消息主體)

XmlRequest.innerText = xmlObj.xml ;

// 發(fā)出請(qǐng)求 并且得到服務(wù)器的回應(yīng)。

var xmlHTTP = new ActiveXObject("Msxml2.XMLHTTP") ;

xmlHTTP.Open ( "Post", "http://localhost/WebService1/Service1.asmx", false) ;

xmlHTTP.setRequestHeader("SOAPAction", "http://tempuri.org/Add") ;

xmlHTTP.setRequestHeader("Content-Type", "text/xml; charset=utf-8" ) ;

xmlHTTP.Send(xmlObj.xml) ;

MyResult.innerText = xmlHTTP.responseText ;

var xmlResponse = xmlHTTP.responseXML ;

// xmlHTTP.responseXML 中就是服務(wù)器回應(yīng)的結(jié)果

answer.innerText = xmlResponse.selectSingleNode

("soap:Envelope/soap:Body/AddResponse/AddResult").text ;

看得出先構(gòu)造一個(gè)SOAP的包然后把請(qǐng)求拿回來(lái)(selectSingleNode函數(shù)是XML  DOM中的很通用的一個(gè)函數(shù))具體的結(jié)果可以看09CallServiceXML.jpg

好了,通過(guò)上面我們完成了一個(gè)Web Service。這是完成一個(gè)Web Service的基本框架,剩下的你可以進(jìn)行擴(kuò)充實(shí)現(xiàn)你需要的功能。在最后我們具體考察了Web Service的協(xié)議和客戶端的問(wèn)題,涉及到SOAP和XML的一些概念。盡管VS。NET實(shí)現(xiàn)Web Service很方便,但手工實(shí)現(xiàn)也是完全可以的,但愿看完這篇文章之后你可以對(duì)VS。NET說(shuō)一次不。

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