再談Web Service--VS.NET我可以說不嗎
發表于:2007-05-25來源:作者:點擊數:
標簽:
不久前我曾寫了一篇有關用VS。NET Beta 2 來完成一個 Web Service 的整個過程。這篇文章也是有關Web Service的,不過實現Web Service的整個過程完全是手工方式的,可以不依賴于VS。NET這樣的 開發 工具。VS。NET開發Web Service是非常簡便的,同樣它也封裝了
不久前我曾寫了一篇有關用VS。NET Beta 2 來完成一個
Web Service 的整個過程。這篇文章也是有關Web Service的,不過實現Web Service的整個過程完全是手工方式的,可以不依賴于VS。NET這樣的
開發工具。VS。NET開發Web Service是非常簡便的,同樣它也封裝了許多底層的信息,它希望開發人員可以把精力集中在主要的邏輯實現和Service本身上。
至于對VS。NET你能否說不,那么要看你自己的理解了,好了言歸正轉,開始實現這個Web Service吧。
首先你必須已經成功安裝Framework SDK Beta 2 ,然后用Notepad、IIS、IE、Dos 的Command Prompt就可以完成了。整個功能還是沿用上次的例子,一個HelloWorld 和Add的例子,如果你Download了兩個Zip包,你會發現兩者中許多代碼是一樣的。特別是客戶端這邊,它根本不關心你是用什么生成的。
整個的過程分為以下幾步:
1. 手工生成一個 .asmx文件。
2. 設置一下你的IIS
服務器。
3. 在瀏覽器中
測試這個Web Service
4. 生成代理包
5. 編寫客戶端代碼進行測試。
簡單的看和上次在VS。NET中沒有什么不同,唯一多的是要手工設置一下IIS,在VS。NET中是通過把這頁設成Start Page然后F5來完成對IIS的設置的。有關設置的方面,dotnet比以前的ASP或Com有許多不同,全面了引進XML格式,這個不在這里說了。我們不要涉及這些。
具體的說:
1. 手工生成一個 .asmx文件。
在VS。NET中它自動生成一個和Project同名的. asmx文件,同樣也會再自動生成一個 .asmx.
vb 或 .asmx.cs 文件,其實實現Service你的代碼是寫在這個文件中的,當然你也可以直接在 .asmx文件中直接寫,這樣IIS第一次運行時會編譯這個.asmx文件,在特定的目錄下生成一個DLL文件。不過我喜歡用象VS。NET的方式來實現,這樣更有封裝性,實際中應用中也更
安全。道理就象一開始我們直接在ASP中用ADO訪問
數據庫,以后卻自然的是用一個組件來完成這些,然后在ASP中調用這個組件一樣。但如果你完全沿用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是你實現Service功能的類名,WebService1是你編譯.vb成DLL的名字。然后在你的 .asmx.vb 中先加上這兩句話:
Namespace MyWebService
End Namespace
然后你會發現我Copy了原來在VS。NET中的所有實現WebService的代碼。然后可以存盤,將.asmx和 .asmx.vb放到一個目錄中,比如:MyService,然后準備在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
確認你在MyService目錄下打入這個命令,這樣會在這個目錄下生成的子目錄Bin中發現這個DLL文件:WebService1.DLL 。如果這一切都沒有問題,那么你過了第一關。
2. 在IIS中設置。
這就比較簡單了,點中MyService目錄右鍵選擇共享,然后共享這個目錄或是在管理工具中一步一步的新增一個虛擬目錄都是一樣的。但要效驗你的Application Name:是否是叫WebService1和你的.asmx中class="MyWebService.Service1, WebService1" 這句對應。具體的你可以看附帶的圖02SetupIIS.jpg。剛才編譯時用的 /out:bin/WebService1會在這里有用,如果我們什么也步配置,那么默認的是去/bin目錄中看是否有這個文件,如果你忘了加這個參數,那么編譯完成后最好Copy編譯的DLL去當前目錄的bin子目錄
3. 完成IIS的設置后,可以用IE瀏覽器來測試了。
具體的你可以訪問這樣的URL:http://localhost/你共享的目錄名/你的WebService.asmx 如果正常它會檢查被編譯的類,并返回一個有關這個
Web Service的HTML視圖。象附帶的圖中03IEOpenAsmx.jpg中的一樣。其實它是由一個DefaultWsdlHelpGenerator.aspx的模板文件產生的,這個文件在C:\WINNT\Microsoft.NET\Framework\v1.0.2914\CONFIG\ 目錄中。一千五多行代碼,也許中文版出來以后這個模板也會成中文的。
這部分也輕車熟路了,上篇文檔中的我也是手工完成的。具體分為兩步:
1. 先生成一個代理類。
wsdl /out:WebServiceProxyClass.cs http://localhost/WebService1/Service1.asmx
2. 然后編譯這個代理類。
csc /t:library /out:bin/MyWebServiceProxy.dll WebServiceProxyClass.cs
對于bin的目錄不是必須或要求的可以在任何目錄,完成這部之后,組件也自動的注冊了,也就是說你可以開始調用這個
Web Service了。
5. 用客戶端代碼進行測試。
上一篇中我只用VS。NET簡單的建立了一個 ASP Form,上面放兩個 Lable顯示一下。其實對于客戶端來說可以說多種多樣的,可以是ASP,Html,dotnet的應用程序,ASP+頁面,VB程序、甚至是
Java或其它任何語言生成的客戶端。這也真正表現了Web Service的意義,只要在Web上,你能找到這個Service,那么你就可以享受這個Service。
Html就很容易了比如:
HelloWorld
你就可以完成測試。如果你要突出編程方式那么你可以象我上次一樣用 Service1 ServiceProxy = new Service1() ;
String strReturn = ServiceProxy.HelloWorld() ; 這樣的方式來獲得結果。在ClientHtml.html中我展現了兩種用于Web Service的協議:HTTP-GET和HTTP-POST。不過我想著重說的是CallServiceXML.asp這個文件的作法,從中你可以發現許多不同的東西,到底Web Service是通過什么來返回它提供的Service,它在干什么,結果也許你會發現很耳熟的
SOAP。其實代理類是通過SOAP協議和ASP+的Web Service進行通訊。
你可以仔細考察下面的代碼:
function btn_click (n1, n2)
{
var xmlObj = new ActiveXObject("Msxml2.DOMDocument") ;
var sXml = "" ;
sXml += "
sXml += "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" """ ;/2001/XMLSchema\//schemas.xmlsoap.org/soap/envelope/\">" ;
sXml += "" ;
sXml += "" ;
sXml = sXml + "" + n1.value + "" ;
sXml = sXml + "" + n2.value + "" ;
sXml += ""
xmlObj.loadXML(sXml) ;
// 完成請求的準備,手工生成一個SOAP的格式包(消息主體)
XmlRequest.innerText = xmlObj.xml ;
// 發出請求 并且得到服務器的回應。
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 中就是服務器回應的結果
answer.innerText = xmlResponse.selectSingleNode
("soap:Envelope/soap:Body/AddResponse/AddResult").text ;
看得出先構造一個SOAP的包然后把請求拿回來(selectSingleNode函數是XML
DOM中的很通用的一個函數)具體的結果可以看09CallServiceXML.jpg
好了,通過上面我們完成了一個
Web Service。這是完成一個Web Service的基本框架,剩下的你可以進行擴充實現你需要的功能。在最后我們具體考察了Web Service的協議和客戶端的問題,涉及到SOAP和XML的一些概念。盡管VS。NET實現Web Service很方便,但手工實現也是完全可以的,但愿看完這篇文章之后你可以對VS。NET說一次不。
原文轉自:http://www.kjueaiud.com
老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
|