官术网_书友最值得收藏!

  • 決戰(zhàn).NET
  • 黃忠成
  • 995字
  • 2018-12-27 16:55:58

3.7 Async-Postback的錯(cuò)誤控管

當(dāng)Async-Postback的要求到達(dá)Server時(shí),若處理期間發(fā)生任何的異常,ScriptManager控件會(huì)觸發(fā)AsyncPostbackError事件,如果設(shè)計(jì)師未掛載任何事件的話,ScriptManager控件便會(huì)輸出AsyncPostbackErrorMessage屬性所設(shè)定的信息,此時(shí)瀏覽器便會(huì)以信息窗方式顯示此錯(cuò)誤信息,若AsyncPostbackErrorMessage屬性值為空白,ScriptManager控件會(huì)直接輸出異常的錯(cuò)誤信息。我承認(rèn),這段說(shuō)明對(duì)讀者來(lái)說(shuō)有些模糊,文教不如身教,請(qǐng)照以下的步驟來(lái)創(chuàng)建一個(gè)網(wǎng)頁(yè)。

1. 創(chuàng)建一個(gè)新網(wǎng)頁(yè),命名為ErrorCatchs.aspx。

2. 在頁(yè)面中放入一個(gè)ScriptManager控件。

3. 在頁(yè)面中放入一個(gè)UpdatePanel控件。

4. 將UpdatePanel1控件的UpdateMode設(shè)為Conditional。

5. 在UpdatePanel控件中放入一個(gè)Button控件,將Text屬性設(shè)為Catch Me。

6. 在Button控件的Click事件中鍵入程序3-13的代碼。

程序3-13

    Samples\3\AjaxDemo1\ErrorCatchs.aspx.cs
    protected void Button1_Click(object sender, EventArgs e)
    {
          throw new Exception("Error in Catch Me !!");
    }

完成并運(yùn)行此程序,點(diǎn)擊Button后便可看到瀏覽器彈出報(bào)錯(cuò)信息,而此報(bào)錯(cuò)信息便是Click事件所拋出的異常信息,如圖3-11所示。

true

圖3-11

這就是ScriptManager控件最基本的錯(cuò)誤控管機(jī)制,當(dāng)然!這對(duì)實(shí)務(wù)上來(lái)說(shuō)仍嫌過(guò)于初級(jí),應(yīng)該更明確地指出此錯(cuò)誤信息是在Async-Postback時(shí)發(fā)生的。請(qǐng)照以下的步驟,一步步地修改此例子。

1. 掛載事件至ScriptManager的AsyncPostbackError事件。

2. 鍵入程序程序3-14的代碼。

程序3-14

    Samples\3\AjaxDemo1\ErrorCatchs.aspx.cs
    protected void ScriptManager1_AsyncPostbackError(object sender,
      AsyncPostbackErrorEventArgs e)
    {
            ScriptManager1.AsyncPostbackErrorMessage =
                  string.Format("異步回傳錯(cuò)誤:{0}", e.Exception.Message);
    }

重新運(yùn)行程序后,便可看到更明顯的錯(cuò)誤信息,指出此錯(cuò)誤是發(fā)生于異步機(jī)制,如圖3-12 所示。

true

圖3-12

這些就是AsyncPostbackErrorMessage及AsyncPostbackError事件的用法,這個(gè)顯示錯(cuò)誤的形式會(huì)受到ScriptManager的AllowCustomErrorsRedirect屬性值的影響,當(dāng)此值為Ture時(shí),若web.config中明確設(shè)定了錯(cuò)誤的頁(yè)面時(shí),ScriptManager就會(huì)在錯(cuò)誤發(fā)生時(shí),自動(dòng)轉(zhuǎn)向至該頁(yè)面。請(qǐng)照以下的步驟修改此例子。

1. 修改web.config,加入程序3-15中粗體字部分的設(shè)定值。

2. 創(chuàng)建一個(gè)HTML網(wǎng)頁(yè),內(nèi)容如程序3-16所示。

程序3-15

    Samples\3\AjaxDemo1\web.config
    <system.web>
              <customErrors defaultRedirect="GenericError.htm"
                    mode="On"/>
    ……………

程序3-16

    Samples\3\AjaxDemo1\GenericError.htm
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <meta http-equiv="Content-Type" content="text/html; charset=big5">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title>Untitled Page</title>
    </head>
    <body>
        處理期間發(fā)生錯(cuò)誤!!
    </body>
    </html>

重新運(yùn)行程序后,便會(huì)發(fā)現(xiàn)當(dāng)點(diǎn)擊Button后,錯(cuò)誤不再以信息窗方式顯示,而是自動(dòng)導(dǎo)向GenericError.htm頁(yè)面,如圖3-13所示。

true

圖3-13

當(dāng)Async-Postback處理的時(shí)間過(guò)長(zhǎng)時(shí),Client端也會(huì)引發(fā)異常來(lái)終止此次要求,這個(gè)時(shí)間可通過(guò)ScriptManager控件的AsyncPostbackTimeOut屬性來(lái)設(shè)定,單位是秒,默認(rèn)值是90秒,也就是當(dāng)Client端送出Async-Postback要求后等待Server響應(yīng),若超過(guò)90秒未收到Server響應(yīng),那么客戶端自身就會(huì)終止此次要求。請(qǐng)照以下步驟修改本例。

1. 設(shè)定ScriptManager控件的AsyncPostbackTimeOut屬性為20。

2. 在Button控件之Click事件鍵入程序3-17的程序代碼。

程序3-17

    Samples\3\AjaxDemo1\ErrorCatchs.aspx.cs
    protected void Button1_Click(object sender, EventArgs e)
    {
      System.Threading.Thread.Sleep(30000);
    }

運(yùn)行程序后點(diǎn)擊Button,等待20秒后瀏覽器便會(huì)顯示錯(cuò)誤信息,如圖3-14所示。

true

圖3-14

咦,先前不是已經(jīng)設(shè)定錯(cuò)誤時(shí)所導(dǎo)向的頁(yè)面了嗎?為何此處仍然以信息窗顯示?別弄混了,AsyncPostbackTimeout屬性所針對(duì)的是Client端的等待時(shí)間,也就是點(diǎn)擊Button后Client端所等待響應(yīng)的時(shí)間,若時(shí)間到Client端未收到Server的響應(yīng),便直接顯示Timeout的信息,所以這與Server端的錯(cuò)誤機(jī)制無(wú)關(guān)。

主站蜘蛛池模板: 托克逊县| 聂荣县| 湘阴县| 若羌县| 太白县| 西贡区| 聂荣县| 如皋市| 锡林郭勒盟| 沙湾县| 霍邱县| 黔西县| 土默特左旗| 察雅县| 商城县| 吐鲁番市| 射洪县| 柞水县| 金门县| 衡阳市| 宁强县| 休宁县| 会理县| 马边| 名山县| 大连市| 阿拉善左旗| 富源县| 思茅市| 涪陵区| 洛扎县| 三江| 扎赉特旗| 巴彦县| 舒兰市| 宝坻区| 阿瓦提县| 临安市| 望江县| 高青县| 绥化市|