一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

深度解析ASP.NET中的Callback機制

  看到不少朋友最近在寫使用callback的文章,也有點手癢,也來涂鴉一下,挖掘挖掘callback的潛力。callback的一般使用方法還算簡單,直接參照msdn的幫助和范例就足夠了。但是想要真正用好、用精,或者想開發一些基于callback機制的WEB組件,那么,就要先深入了解callback的實現機制了。在本文中,Teddy將和您一起解析callback的整個調用、反饋機制,相信對于幫助您更好的使用callback,將能有一定的益處。
  Callback vs ASP.NET AJAX
  首先,談談ASP.NET AJAX。很多朋友可能會覺得奇怪,已經有了Callback,為什么又要出ASP.NET AJAX呢?關于這個問題,ASP.NET AJAX的作者怎么解釋,我倒沒有去調查。只不過從我個人對callback和ASP.NET AJAX的使用感受來講,覺得,callback作為一個接口和postback非常類似的實現,肯定是為了讓用戶類似使用postback來使用它。但是,它的這個類似postback的機制,應該說使用上還不是特別方便,也不易擴展,當然這是相比于其他的AJAX框架實現來說的。因此,微軟方面借鑒了許多的已有的AJAX實現,如Prototype,Backbase以及AJAX.NET,并結合ASP.NET2.0的部分特有功能,發明了這樣一個博采眾長的AJAX框架。基于ASP.NET AJAX來開發AJAX應用有多好,很難量化的來說,但至少不比其他的這些AJAX框架來的差是肯定的,加上微軟這個后臺,以及像live.com這樣的重量級站點的應用推廣,其影響當然是值得期待的。
  不過,這也不是說callback實現沒一無是處了,作為程序員,我們需要有正確的態度,在正確的使用情形,使用最正確的技術。沒有哪一個框架是萬能的,是適合任何使用環境的;就像大家都在爭論那個軟件開發方法最好,CMMi,RUP,XP,AGILE~~,其實,沒有最好,最合適的才是最好的。我們最應該做的,是了解各種方案的原理和優缺點,從而,合理的使用正確的工具來解決實際問題。
  Begin from Client Script
  我們都知道,凡是AJAX,從底層來講,無外乎兩種實現機制:XMLHTTP以及IFRAME。在AJAX這個詞獲得廣泛關注之前,其實,基于這兩種底層實現的功能框架,或者基于這兩種技術的無刷新效果實現就已經被廣泛的使用了。當然,發展到今天,在使用接口方面,這些底層機制的細節往往被框架給隱藏了,使用接口變得越來越簡單,用戶只要調用這些簡單接口,沒有必要知道具體是怎么實現效果的了。
  不過,這里我們既然是要解析callback的實現機制,那還是讓我們從一個callback調用的客戶端腳本調用開始,看看,微軟是怎么實現這個callback機制的。
  1、ClientScript.GetCallbackEventReference(...)
  要激發一個callback,首先,當然需要在客戶端本中發出一個調用。一個典型的調用語法如下:

<script language="Javascript" type="text/Javascript">
function any_script_function(arg, context)
{
<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;
}
</script>

  從以上代碼我們可以很明白的看到,系統判斷您的瀏覽器是否支持XMLHTTP或IFRAME,如果至少支持其中之一,則用相應的方法執行回調,否則當然就是提示錯誤了。回調的時候,采用post的方式,異步post到當前頁面,然后等待回調結束,此時,由我們指定的返回數據處理script函數來處理返回的數據。
  看到這里,我還不知道服務端怎么處理這個根據傳過來的參數解析、執行,并返回數據的過程。但是,我們已經知道,WebForm_DoCallback(...)將會將當前頁面的web控件的信息都post回去,這就意味著,我們在服務端有可能可以訪問到這些web控件的value,這還不錯,方便了我們處理當前數據。另一方面,eventArgument既然是一個任意格式的字符串參數,我們肯定要在服務段自己解析它的。
  Serverside Callback Operation & Render
  好了,那么接下來就讓我們來看看在服務端,ASP.NET都為我們做了些什么。
  首先,我們知道,當前的Page是必須實現ICallbackEventHandler這個接口的,也就是其包含的兩個函數:string GetCallbackResult()和void RaiseCallbackEvent(eventArgument)。根據MSDN的文檔,我們知道,在一個callback被post到服務端時,Page將會首先將post回來的form data綁定到當前頁面的服務端web控件,接著判斷本次post是callback還是postback,如果是postpost,那么自然是原來的那個機制;
  如果是callback,則將回調用觸發本次callback的控件(在本例中,我們在激發這個callback時,第一個參數指定的是this也就是當前的Page,那么這里當前的Page就是這個觸發控件)的RaiseCallbackEvent(eventArgument),當然,eventArgument也將會正確的傳過來,在這個函數的實現代碼里我們可以對這個參數進行解析處理,并在某個地方,存儲我們準備返回的數據,或者待處理的已經被解析出來的參數;
  接著,系統將調用string GetCallbackResult(),在這個函數的實現代碼中,我們可以直接返回我們在RaiseCallback函數中存儲的準備返回的數據,或者根據待處理的已經被解析出來的參數處理這些參數,并返回結果。這個返回的字符串,自然將以腳本的形式被render回客戶端。被返回的腳本細節如下(反編譯Page.RenderCallback()的源碼),我們可以看到,返回的結果除了我們需要的結果數據和相應的腳本,沒有多余的數據,因此,callback的執行效率應該說還是不錯的:

private void RenderCallback()
{
bool flag1 = !string.IsNullOrEmpty(this._requestValueCollection["__CALLBACKLOADSCRIPT"]);
try
{
string text1 = null;
if (flag1)
{
text1
= this._requestValueCollection["__CALLBACKINDEX"];
if (string.IsNullOrEmpty(text1))
{
throw new HttpException(SR.GetString("Page_CallBackInvalid"));
}
for (int num1 = 0; num1 < text1.Length; num1++)
{
if (!char.IsDigit(text1, num1))
{
throw new HttpException(SR.GetString("Page_CallBackInvalid"));
}
}
this.Response.Write("<script>parent.__pendingCallbacks[");
this.Response.Write(text1);
this.Response.Write("].xmlRequest.responseText=/"");
}
if (this._callbackControl != null)
{
string text2 = this._callbackControl.GetCallbackResult();
if (this.EnableEventValidation)
{
string text3 = this.ClientScript.GetEventValidationFieldValue();
this.Response.Write(text3.Length.ToString(CultureInfo.InvariantCulture));
this.Response.Write('|');
this.Response.Write(text3);
}
else
{
this.Response.Write('s');
}
this.Response.Write(flag1 ? Util.QuoteJScriptString(text2) : text2);
}
if (flag1)
{
this.Response.Write("/";parent.__pendingCallbacks[");
this.Response.Write(text1);
this.Response.Write("].xmlRequest.readyState=4;parent.WebForm_CallbackComplete();</script>");
}
}
catch (Exception exception1)
{
this.Response.Clear();
this.Response.Write('e');
if (this.Context.IsCustomErrorEnabled)
{
this.Response.Write(SR.GetString("Page_CallBackError"));
return;
}
this.Response.Write(flag1 ? Util.QuoteJScriptString(HttpUtility.HtmlEncode(exception1.Message)) : HttpUtility.HtmlEncode(exception1.Message));
}
}

NET技術深度解析ASP.NET中的Callback機制,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 在线观看精品视频网站www | 亚洲日本1区2区3区二区 | 亚州一区二区 | 国产精品自产拍视频观看 | 亚洲婷婷六月 | 韩国精品一区二区三区四区五区 | 国产91在线精品福利 | 久久精品国产亚洲片 | 国产成人综合91精品 | 天天操天天干天天爽 | 亚洲香蕉网综合久久 | 手机在线观看黄色网址 | 亚洲激情视频在线 | 国产精品视频一区二区三区w | 伊人网综合在线视频 | 亚洲一区二区三区四区在线 | 国产91免费在线观看 | 91国视频在线 | 欧美不卡视频在线观看 | 亚洲综合色就色手机在线观看 | 国产在线综合网 | 欧美另类精品 | 日韩国产三级 | 婷婷综合五月 | 中文字幕色综合久久 | 天天干天天操天天做 | 日韩精品久久久免费观看夜色 | 高清激情小视频在线观看 | 亚洲视频一区二区在线观看 | 成人嗯啊视频在线观看 | 中文字幕日韩欧美一区二区三区 | 91刺激 | 精品网址| 99国产精品国产精品 | 伊人网在线观看 | 中文字幕免费在线视频 | 天天拍夜夜添久久精品中文 | 精品伊人 | 自啪| 欧美第一页草草影院浮力 | 国产综合在线视频 |