“異步”執行意味著原本從頭到尾執行的函數被攔腰截斷,分成了兩個不同的函數。而這兩個函數之間的聯系往往又非常緊密,例如有些時候我們需要在后一個函數(即回調函數)中訪問前一個函數中計算出來的變量,或是在后一個函數中得到前一個函數執行時的上下文等信息。特別地,若是幾個不同的異步函數均提供了同一個回調函數進行處理,我們一般還要在回調函數中知道是哪個函數引發的這次回調。為了滿足這些需求,異步調用中自然產生了用戶上下文(user context)的概念。
ASP.NET AJAX異步通信層所提供的異步調用模型中同樣提供了對傳遞用戶上下文信息的支持。我們還是使用一個簡單的示例程序演示其具體的實現。
程序的功能并不復雜:兩個按鈕都將異步調用服務器端的同一個Web Service并指定同一個回調函數,取得服務器端當前時間之后顯示出來,同時顯示出來的還有用戶點擊了哪個按鈕的信息。如圖3-7和圖3-8所示,注意其中用戶上下文的不同。
圖3-7 點擊第一個按鈕取得服務器端當前時間
圖3-8 點擊第二個按鈕取得服務器端當前時間
Web Service的聲明如下,返回當前服務器端時間而已:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class UserContextService : System.Web.Services.WebService
{
[WebMethod]
public string GetServerDateTime()
{
return DateTime.Now.ToString();
}
}
頁面中的ScriptManager控件引用了該Web Service,以便生成其客戶端調用代理:
<asp:ScriptManager ID="sm" runat="server">
<Services>
<asp:ServiceReference Path="Services/UserContextService.asmx" />
</Services>
</asp:ScriptManager>
原文轉自:http://www.anti-gravitydesign.com