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

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

再談Web Service--VS.NET,我可以說不嗎

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

AMTeam.org

再談Web Service--VS.NET,我可以說不嗎

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

至于對VS。NET你能否說不,那么要看你自己的理解了,好了言歸正轉(zhuǎn),開始實現(xiàn)這個Web Service吧。

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

整個的過程分為以下幾步:

1. 手工生成一個 .asmx文件。

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

3. 在瀏覽器中測試這個Web Service

4. 生成代理包

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

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

具體的說:

1. 手工生成一個 .asmx文件。

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

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

Namespace MyWebService

End Namespace

然后你會發(fā)現(xiàn)我Copy了原來在VS。NET中的所有實現(xiàn)WebService的代碼。然后可以存盤,將.asmx和 .asmx.vb放到一個目錄中,比如:MyService,然后準(zhǔn)備在Dos 的Command中編譯這個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目錄下打入這個命令,這樣會在這個目錄下生成的子目錄Bin中發(fā)現(xiàn)這個DLL文件:WebService1.DLL 。如果這一切都沒有問題,那么你過了第一關(guān)。

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

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

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

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

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

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

1. 先生成一個代理類。

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

2. 然后編譯這個代理類。

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

對于bin的目錄不是必須或要求的可以在任何目錄,完成這部之后,組件也自動的注冊了,也就是說你可以開始調(diào)用這個Web Service了。

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

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

Html就很容易了比如:

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

String strReturn = ServiceProxy.HelloWorld() ; 這樣的方式來獲得結(jié)果。在ClientHtml.html中我展現(xiàn)了兩種用于Web Service的協(xié)議:HTTP-GET和HTTP-POST。不過我想著重說的是CallServiceXML.asp這個文件的作法,從中你可以發(fā)現(xiàn)許多不同的東西,到底Web Service是通過什么來返回它提供的Service,它在干什么,結(jié)果也許你會發(fā)現(xiàn)很耳熟的SOAP。其實代理類是通過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) ;

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

XmlRequest.innerText = xmlObj.xml ;

// 發(fā)出請求 并且得到服務(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)造一個SOAP的包然后把請求拿回來(selectSingleNode函數(shù)是XML  DOM中的很通用的一個函數(shù))具體的結(jié)果可以看09CallServiceXML.jpg

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

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