国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

在ASP.NET Atlas中調用Web Service—處理錯誤

2024-07-10 13:10:45
字體:
來源:轉載
供稿:網友
在本系列的上一篇(在asp.net atlas中調用web service——介紹及簡單應用)中,我們熟悉了atlas中調用web service的最基礎方法,但是在實際開發中,僅僅發出請求并等待返回結果是不夠的,我們大都需要考慮對錯誤超時等的處理,也要允許用戶取消操作。幸運的是,atlas對web service中的web method的封裝也充分考慮到了這些需求。

讓我們舉一個web method的例子來說明,例如,對于如下的web method:

public class complexwebservice  : system.web.services.webservice {

    [webmethod]
    public string badmethod(int delaytime, bool throwexception)
    {
        // something something
    }
}

 

atlas產生的javascript mash up將會有如下的簽名: complexwebservice.badmethod(
    delaytime,
    throwexception,
    onmethodcomplete,
    onmethodtimeout,
    onmethoderror,
    onmethodaborted,
    usercontext,
    timeoutinterval,
    priority,
    usegetmethod,
);
注意到web method中的兩個參數按照順序作為了javascript方法的前兩個參數,接下來還有一些額外的參數:

onmethodcomplete:指定當該方法順利完成并返回時被觸發的回調函數名,一般情況下您應該總是指定這個方法。
onmethodtimeout,:指定當該方法執行超時時被觸發的函數名。
onmethoderror:指定當該方法在執行中遇到異常時被觸發的函數名。
onmethodaborted:制定當該方法執行期間被用戶取消時被觸發的函數名。
usercontext:用戶上下文對象,在上述四個函數中都可以訪問到。
timeoutinterval:設定超時的時間限制,單位毫秒,默認值好像為90000。一般情況下不需要更改。
priority:設定該方法的執行優先級。該優先級將被用于批量ajax操作(將在下一篇中提到)中。
usegetmethod:是否采用http get來發送請求,默認為false。
上述這八個屬性的順序必須按照指定的來。但有時候我們只需要指定順序靠后的某個參數,就不得不同時書寫前面的參數。為此,atlas特意為我們提供了另一種調用方法,將上述八個參數以dictionary的形式傳給該方法。例如當我們只需要onmethodcomplete和timeoutinterval參數時,可以這樣寫:

complexwebservice.badmethod(
    delaytime,
    throwexception,
    {
        onmethodcomplete: completehandler,
        timeoutinterval: 10000
    }
);

ok,讓我們通過一個實例看看在一般情況下上述四種回調函數(onmethodcomplete,onmethodtimeout,onmethoderror和onmethodaborted)中的常見處理。

首先讓我們完成開頭部分的web service方法:

using system;
using system.web;
using system.web.services;
using system.web.services.protocols;

[webservice(namespace = "http://tempuri.org/")]
[webservicebinding(conformsto = wsiprofiles.basicprofile1_1)]
public class complexwebservice  : system.web.services.webservice {

    [webmethod]
    public string badmethod(int delaytime, bool throwexception)
    {
        if (throwexception)
        {
            throw new exception("sorry, i do not like to do this!");
        }
        system.threading.thread.sleep(delaytime);
        return "done!";
    }
}

可以看到該方法有兩個參數:delaytime指定該方法的延時,throwexception指定該方法是否擲出異常。通過控制這兩個參數以及調用時的timeoutinterval參數,我們就可以模擬完成,超時以及異常的三種情況。

然后,在頁面中加入scriptmanager并添加對這個web service的引用:

<atlas:scriptmanager id="scriptmanager1" runat="server">
    <services>
        <atlas:servicereference path="complexwebservice.asmx" />
    </services>
</atlas:scriptmanager>

 

在aspx頁面上添加四個按鈕,用來觸發下述四種情況: <div>
    this is a bad method, it can:<br />
    <input id="btnworkfine" type="button" value="work fine" />
    <input id="btntimeout" type="button" value="timeout" />
    <input id="btnthrowexception" type="button" value="throw an exception" />
    <input id="btncanceld" type="button" value="get canceled" />
</div>
正常完成,我們指定服務器端沒有延時也沒有異常,并給出了一個合理的(10秒)的超時時間:

function btnworkfine_onclick() {
    complexwebservice.badmethod(
        0,
        false,
        onbadmethodcomplete,
        onbadmethodtimeout,
        onbadmethoderror,
        onbadmethodaborted,
        "btnworkfine_onclick",
        10000
        );
}
function onbadmethodcomplete(result)
{
    alert(result);
}
超時,指定服務器端延時3秒,但超時時間設置成為僅1秒:

function btntimeout_onclick() {
    complexwebservice.badmethod(
        3000,
        false,
        onbadmethodcomplete,
        onbadmethodtimeout,
        onbadmethoderror,
        onbadmethodaborted,
        "btntimeout_onclick",
        1000
        );
}
function onbadmethodtimeout(request, usercontext)
{
    var timeoutstring = "the call to '" + usercontext + "' failed due to time out!";
    alert(timeoutstring);
}
異常,制定服務器端擲出異常。注意回調函數中可以使用response參數得到詳細的錯誤信息:

function btnthrowexception_onclick() {
    complexwebservice.badmethod(
        0,
        true,
        onbadmethodcomplete,
        onbadmethodtimeout,
        onbadmethoderror,
        onbadmethodaborted,
        "btnthrowexception_onclick",
        10000
        );
}
function onbadmethoderror(result, response, usercontext)
{
    var errorstring = "test '" + usercontext + "' failed!";
    if (result == null) {
        errorstring += "  status code='" + response.get_statuscode() + "'";
    }
    else {
        errorstring +=
             "  message='" + result.get_message() +
            "'/r/nstacktrace = " + result.get_stacktrace();
    }
   
    alert(errorstring);
}
用戶取消,與正常完成類似,不過在發出請求后立刻使用request.abort()取消了操作:

function btncanceld_onclick() {
    var request = complexwebservice.badmethod(
        2000,
        false,
        onbadmethodcomplete,
        onbadmethodtimeout,
        onbadmethoderror,
        onbadmethodaborted,
        "btncanceld_onclick",
        10000
        );
    request.abort();
}
function onbadmethodaborted(request, usercontext) {
    var errorstring = "the call to  '" + usercontext + "' failed, request is aborted!";
    alert(errorstring);
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 松桃| 左贡县| 鄱阳县| 灵台县| 东山县| 鹰潭市| 台中县| 清丰县| 涿鹿县| 阳山县| 东乌珠穆沁旗| 南充市| 丹阳市| 延寿县| 龙海市| 崇明县| 克东县| 石景山区| 崇仁县| 饶河县| 孝义市| 兴业县| 郯城县| 武义县| 广元市| 阿城市| 大悟县| 绥德县| 浦江县| 泰来县| 孝义市| 民和| 镇康县| 上饶市| 柯坪县| 永城市| 遵义市| 乌恰县| 亚东县| 阳曲县| 元江|