Web Service学习笔记(4)
代理類文件:
在客戶端使用程序中生成的Reference.cs的文件即代理類,Service1.wsdl為相應的XML文件?
代理類說明:
1. 代理類開始是引出一系列的命名空間,代碼的主題是定義一個跟待訪問的Web服務類同名的 從System.Web.Services.Protocols.HttpGetClientProtocol派生的代理類
2. 代理類具有如下四個方法
2.1 不帶參數(shù)的構(gòu)造函數(shù)
構(gòu)造函數(shù)主要是設定代理類的URL屬性,這個屬性表示W(wǎng)EB服務的URL.
2.2 doSearch方法
該方法是WEB服務的doSearch方法的本地代理版本,該方法被一個HttpMethodAttribute所標注,其目的是指示如何序列化發(fā)送到 WEB服務的doSearch方法的參數(shù)以及如何反序列化WEB服務的響應.如果采用HTTP-GET調(diào)用WEB服務的方法,則必須把 HTTPMothodAttribute的ReturnFormatter屬性設置為 XmlReturnReader,ParameterFormatter屬性設置為UrlParameterWriter.
方法的返回值也被一個XmlRootAttribute特性所標記.該特性用以將類,結(jié)構(gòu),枚舉或結(jié)口標記為XML文檔實例的根(或項級)元素.該特性的 ElementName屬性表示返回值對應的XML元素的名稱,Namespace屬性表示XML根元素的命名空間,IsNullable屬性表示返回值為空時ElementName所指的無素是否包xsi:nil屬性.
以上特性其實代替了我在C#分類中所講的利用HTTP-GGET;HTTP-POST來獲得WEB服務中的設置URL,在URL中附中參數(shù),以及從返回XML文檔中提結(jié)果的大段代碼
再來看看方法中的代碼
?return ((string)(this.Invoke("doSearch", (this.Url + "/doSearch"), new object[] { keyword})));
上述代碼先調(diào)用一個Invoke方法,(該方法繼承自父類HttpGetClientProtocol),然后把調(diào)用結(jié)果強制轉(zhuǎn)化為字符串類型.
Invoke方法的原型:
protected Object Invoke(string MethodName,string RequestUrl,Object[] Parameters);
參數(shù):MethodName->表示要調(diào)用的Web服務的名稱,本例中的“doSearch“
參數(shù):RequestUrl->表示W(wǎng)EB服務的方法的URL,它是由WEB服務的URL加上"/方法名"組成
參數(shù):Parameters->是一個對象數(shù)組,包含要傳遞到遠程WEB服務的參數(shù),數(shù)組中的順序與派生類的調(diào)用方法中的參數(shù)順序?qū)?br />返回值包含派生類方法的返回值和所有引用或輸出參數(shù)的對象數(shù)組
2.3 BegindoSearch方法
這個方法用以啟動對WEB服務的doSearch方法的異步調(diào)用
BegindoSearch的參數(shù):
????keyword:????參數(shù).
????callback: ????AsyncCallback類型的委托對象,當異步調(diào)用結(jié)束后,callback所代表的函數(shù)將被回調(diào),用來接收結(jié)果.
??????????????????????AsyncCallback委托原型:
????????????????????????[Serializable]
????????????????????????public delegate void AsyncCallback(IAsyncResult ar);
????????????????????????其: IAsyncResult接口:用于監(jiān)視和管理異步操作.
????????????????????????IAsyncResult接口的原型
????????????????????????public interface IAsyncResult
????????????????????????{
????????????????????????????object AsyncState{get;}//返回被作為最后一個參數(shù)提供的對象
????????????????????????????WaitHandle AsyncWaitHandle{get;}//返回WaitHandle,它可用于執(zhí)行WaitHandle.WaitOne,WaitAny,WaitAll,以實現(xiàn)同步
????????????????????????????bool CompletedSynchronously{get;}//如果開始操作同步完成,則CompletedSynchronously=true
????????????????????????????bool?IsCompleted{get;}//在服務器完成調(diào)用處理后IsCompleted=true
????????????????????????}
2.4 EnddoSearch方法
這個方法用以結(jié)束異步調(diào)用,并獲得調(diào)用結(jié)果
代理的作用:
客戶端應用程序如果使用Web Service,必須先創(chuàng)建一個代理。代理是要調(diào)用的真正代碼的替身,它負責在機器邊界引導調(diào)用。在代理在客戶端應用程序中注冊后,客戶端應用程序調(diào)用方法就如調(diào)用本地對象一樣。代理接受該調(diào)用,并以適當格式封裝調(diào)用,然后以SOAP請求發(fā)送調(diào)用到服務器。當服務器返回SOAP包給客戶端后,代理會對包進行解密,并且如同從本地對象的方法返回數(shù)據(jù)一樣將其返回給客戶端應用程序。
代理的生成:
1。可以使用vs自動生成一個代理,并在使用程序中通過將web引用添加到程序中,注冊該代理;2。可以是用wsdl.exe命令來創(chuàng)建代理類源碼。
下面是手工生成代理類的步驟:
1、vs的命令提示工具,輸入:C:\>wsdl http://localhost/StockWebService/Service1.asmx ?/n:localhost,其中,localhost是自定義的命名空間。提示如下:
Microsoft (R) Web 服務描述語言實用工具
[Microsoft (R) .NET Framework,版本 1.1.4322.573]
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.
?
正在寫入文件“C:\Service1.cs”。
?
2、注意,此時在C:盤(其實就是命令提示符的當前目錄)下生成一個和Service1.asmx相同文件名的C#源文件Service1.cs。
?
3、編譯Service1.cs文件,在命令提示符下輸入如下命令:C:\>csc /out:ServiceDll.dll /t:library /r:System.Web.Services.dll c:\Service1.cs。其中,/out:ServiceDll.dll是要輸出的dll文件,/t:library是輸出文件類型,/r:System.Web.Services.dll是要引用的組件,c:\Service1.cs是第4步生成的C#文件。
?
4、此時,將會在C:盤下生成一個叫ServiceDll.dll的文件,要使用這個文件,必須復制到StockWebService文件夾下的bin目錄下。默認情況下為:C:\Inetpub\wwwroot\StockWebService\bin。
?
5、新建一個名為TestWSDL.aspx的WEB窗體文件,并添加一個引用,將剛才生成的ServiceDll.dll文件作為引用添加到工程中。
使用異步方法調(diào)用
正如前面中提到的,Web Service允許程序員調(diào)用任何web方法,無論它是同步的還是異步的。
當方法是同步的,方法調(diào)用就是普通調(diào)用,程序?qū)⒌却椒ǚ祷睾笤倮^續(xù)執(zhí)行。只要方法沒有用太長時間來處理,且網(wǎng)絡延時不是很久的情況下,這樣的停頓不是問題。如下圖,演示了同步處理,通過代理調(diào)用服務器上的方法。調(diào)用程序并不知道還有一個代理在處理過程中進行干預,直到調(diào)用結(jié)果返回之后,調(diào)用程序才會繼續(xù)處理。
然而,當方法需要消耗很長的時間來處理時(例如,一個很長的數(shù)據(jù)庫操作或者擴展計算)或者網(wǎng)絡延遲很明顯的時候,這樣的延遲就是一個不可接受的性能瓶頸。當web service的方法調(diào)用需要在Internet上做一個較長的“旅行”的時候,那么網(wǎng)絡長延遲就很常見。這時,寬帶Internet連接對于解決這個玩呢提有幫助,但是仍然會有性能問題。
一種解決方案是:異步處理。在這種模型下,Web Service的方法將通過指令被調(diào)用,而這種指令會在結(jié)果準備好后,通知客戶端。客戶端不需要等待返回的結(jié)果,卻可以繼續(xù)它的業(yè)務。當異步方法完成后會調(diào)用一個回調(diào)方法,然后客戶端就可以從服務器獲得數(shù)據(jù)。如下圖所示:
與同步方法調(diào)用相同,客戶端不知道代理截獲了方法調(diào)用,并把它傳遞給服務器。客戶端事件處理程序調(diào)用web Service中的(實際上是代理類中)的Begin...方法,并傳入一個回調(diào)方法的委托(即上圖中的1)。客戶端則繼續(xù)做其他事情。代理代表客戶端調(diào)用Web方法(2),當服務器完成對方法的執(zhí)行后,返回一個結(jié)果到代理中(3)。代理調(diào)用客戶端回調(diào)方法然后傳入一個實現(xiàn)了IAsyncResult的對象(4)。然后,客戶端把IAsyncResult返回給代理的End..方法(5)。End...方法再把數(shù)據(jù)返回到哦客戶端(6)。
客戶端不需要盯著服務器,因為當方法執(zhí)行完畢后,回調(diào)會通知客戶端。回調(diào)方法是一個代理,它是指定簽名和返回類型封裝方法的引用類型。異步的Begin和End方法為你在客戶端中實現(xiàn)的回調(diào)機制定義了一個委托。
轉(zhuǎn)載于:https://blog.51cto.com/alexis/573890
總結(jié)
以上是生活随笔為你收集整理的Web Service学习笔记(4)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js 层 分页显示选择用户名
- 下一篇: 第五章 MongoDb索引优化 5.6