天天看點

Web Service學習筆記(4)

代理類檔案:

在用戶端使用程式中生成的Reference.cs的檔案即代理類,Service1.wsdl為相應的XML檔案 

代理類說明:

1. 代理類開始是引出一系列的命名空間,代碼的主題是定義一個跟待通路的Web服務類同名的 從System.Web.Services.Protocols.HttpGetClientProtocol派生的代理類

2. 代理類具有如下四個方法

2.1 不帶參數的構造函數

構造函數主要是設定代理類的URL屬性,這個屬性表示WEB服務的URL.

2.2 doSearch方法

該方法是WEB服務的doSearch方法的本地代理版本,該方法被一個HttpMethodAttribute所标注,其目的是訓示如何序列化發送到 WEB服務的doSearch方法的參數以及如何反序列化WEB服務的響應.如果采用HTTP-GET調用WEB服務的方法,則必須把 HTTPMothodAttribute的ReturnFormatter屬性設定為 XmlReturnReader,ParameterFormatter屬性設定為UrlParameterWriter.

方法的傳回值也被一個XmlRootAttribute特性所标記.該特性用以将類,結構,枚舉或結口标記為XML文檔執行個體的根(或項級)元素.該特性的 ElementName屬性表示傳回值對應的XML元素的名稱,Namespace屬性表示XML根元素的命名空間,IsNullable屬性表示傳回值為空時ElementName所指的無素是否包xsi:nil屬性.

以上特性其實代替了我在C#分類中所講的利用HTTP-GGET;HTTP-POST來獲得WEB服務中的設定URL,在URL中附中參數,以及從傳回XML文檔中提結果的大段代碼

再來看看方法中的代碼

 return ((string)(this.Invoke("doSearch", (this.Url + "/doSearch"), new object[] { keyword})));

上述代碼先調用一個Invoke方法,(該方法繼承自父類HttpGetClientProtocol),然後把調用結果強制轉化為字元串類型.

Invoke方法的原型:

protected Object Invoke(string MethodName,string RequestUrl,Object[] Parameters);

參數:MethodName->表示要調用的Web服務的名稱,本例中的“doSearch“

參數:RequestUrl->表示WEB服務的方法的URL,它是由WEB服務的URL加上"/方法名"組成

參數:Parameters->是一個對象數組,包含要傳遞到遠端WEB服務的參數,數組中的順序與派生類的調用方法中的參數順序對應

傳回值包含派生類方法的傳回值和所有引用或輸出參數的對象數組

2.3 BegindoSearch方法

這個方法用以啟動對WEB服務的doSearch方法的異步調用

BegindoSearch的參數:

    keyword:    參數.

    callback:     AsyncCallback類型的委托對象,當異步調用結束後,callback所代表的函數将被回調,用來接收結果.

                      AsyncCallback委托原型:

                        [Serializable]

                        public delegate void AsyncCallback(IAsyncResult ar);

                        其: IAsyncResult接口:用于監視和管理異步操作.

                        IAsyncResult接口的原型

                        public interface IAsyncResult

                        {

                            object AsyncState{get;}//傳回被作為最後一個參數提供的對象

                            WaitHandle AsyncWaitHandle{get;}//傳回WaitHandle,它可用于執行WaitHandle.WaitOne,WaitAny,WaitAll,以實作同步

                            bool CompletedSynchronously{get;}//如果開始操作同步完成,則CompletedSynchronously=true

                            bool IsCompleted{get;}//在伺服器完成調用處理後IsCompleted=true

                        }

2.4 EnddoSearch方法

這個方法用以結束異步調用,并獲得調用結果

代理的作用:

用戶端應用程式如果使用Web Service,必須先建立一個代理。代理是要調用的真正代碼的替身,它負責在機器邊界引導調用。在代理在用戶端應用程式中注冊後,用戶端應用程式調用方法就如調用本地對象一樣。代理接受該調用,并以适當格式封裝調用,然後以SOAP請求發送調用到伺服器。當伺服器傳回SOAP包給用戶端後,代理會對包進行解密,并且如同從本地對象的方法傳回資料一樣将其傳回給用戶端應用程式。

代理的生成:

1。可以使用vs自動生成一個代理,并在使用程式中通過将web引用添加到程式中,注冊該代理;2。可以是用wsdl.exe指令來建立代理類源碼。

下面是手工生成代理類的步驟:

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檔案作為引用添加到工程中。

使用異步方法調用

正如前面中提到的,Web Service允許程式員調用任何web方法,無論它是同步的還是異步的。

當方法是同步的,方法調用就是普通調用,程式将等待方法傳回後再繼續執行。隻要方法沒有用太長時間來處理,且網絡延時不是很久的情況下,這樣的停頓不是問題。如下圖,示範了同步處理,通過代理調用伺服器上的方法。調用程式并不知道還有一個代理在處理過程中進行幹預,直到調用結果傳回之後,調用程式才會繼續處理。

<a href="http://blog.51cto.com/attachment/201105/202825908.jpg" target="_blank"></a>

然而,當方法需要消耗很長的時間來處理時(例如,一個很長的資料庫操作或者擴充計算)或者網絡延遲很明顯的時候,這樣的延遲就是一個不可接受的性能瓶頸。當web service的方法調用需要在Internet上做一個較長的“旅行”的時候,那麼網絡長延遲就很常見。這時,寬帶Internet連接配接對于解決這個玩呢提有幫助,但是仍然會有性能問題。

一種解決方案是:異步處理。在這種模型下,Web Service的方法将通過指令被調用,而這種指令會在結果準備好後,通知用戶端。用戶端不需要等待傳回的結果,卻可以繼續它的業務。當異步方法完成後會調用一個回調方法,然後用戶端就可以從伺服器獲得資料。如下圖所示:

<a href="http://blog.51cto.com/attachment/201105/202906380.jpg" target="_blank"></a>

與同步方法調用相同,用戶端不知道代理截獲了方法調用,并把它傳遞給伺服器。用戶端事件處理程式調用web Service中的(實際上是代理類中)的Begin...方法,并傳入一個回調方法的委托(即上圖中的1)。用戶端則繼續做其他事情。代理代表用戶端調用Web方法(2),當伺服器完成對方法的執行後,傳回一個結果到代理中(3)。代理調用用戶端回調方法然後傳入一個實作了IAsyncResult的對象(4)。然後,用戶端把IAsyncResult傳回給代理的End..方法(5)。End...方法再把資料傳回到哦用戶端(6)。

用戶端不需要盯着伺服器,因為當方法執行完畢後,回調會通知用戶端。回調方法是一個代理,它是指定簽名和傳回類型封裝方法的引用類型。異步的Begin和End方法為你在用戶端中實作的回調機制定義了一個委托。

    本文轉自xshf12345 51CTO部落格,原文連結:http://blog.51cto.com/alexis/573890,如需轉載請自行聯系原作者