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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

在ASP.NET Atlas中調(diào)用Web Service—批量調(diào)用以提高效率

2019-11-18 17:12:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

作者:Dflying Chen (http://dflying.cnblog.som/

對(duì)于Atlas程序,在某些情況下,我們需要在短時(shí)間內(nèi)調(diào)用大量的Web Service,例如某個(gè)列表中用戶快速的點(diǎn)擊刪除。這時(shí)網(wǎng)絡(luò)帶寬,穩(wěn)定程度等等往往會(huì)造成較長(zhǎng)時(shí)間的延遲。如果可以將這些調(diào)用包裝成一個(gè)單一的請(qǐng)求,那么用戶只需忍受一次網(wǎng)絡(luò)延遲,即可得到處理的結(jié)果,也間接的提高了效率。似乎這并不是一個(gè)很容易實(shí)現(xiàn)的功能,但幸運(yùn)的是,Atlas中內(nèi)建了對(duì)批量調(diào)用Web Service的支持,您所需要的只是在程序中簡(jiǎn)單設(shè)置一下。

Atlas中每個(gè)Web Service的調(diào)用請(qǐng)求都有三個(gè)優(yōu)先級(jí):0:高,1:中,2:低,默認(rèn)值為中。

在調(diào)用的時(shí)候您可以通過(guò)PRiority參數(shù)(請(qǐng)參考:在asp.net Atlas中調(diào)用Web Service——處理錯(cuò)誤,超時(shí)以及響應(yīng)用戶的取消操作)指定本次調(diào)用的優(yōu)先級(jí)。對(duì)于高優(yōu)先級(jí)的調(diào)用,Atlas并不應(yīng)用批量調(diào)用,每次都會(huì)立即發(fā)送該請(qǐng)求;對(duì)于中和低優(yōu)先級(jí)的調(diào)用,Atlas會(huì)將一定時(shí)間(請(qǐng)參考下面WebRequestManager的介紹)內(nèi)的調(diào)用包裝成一個(gè)單獨(dú)的請(qǐng)求一起發(fā)送,或是當(dāng)待調(diào)用的請(qǐng)求達(dá)到指定數(shù)目(請(qǐng)參考下面WebRequestManager的介紹)時(shí)一起發(fā)送。其中如果待調(diào)用的請(qǐng)求太多,那么會(huì)從中挑選中優(yōu)先級(jí)的請(qǐng)求首先調(diào)用。

啟用Atlas內(nèi)建的批量調(diào)用Web Service支持,您首先需要在web.config中注冊(cè)服務(wù)器端處理批量調(diào)用的handler(默認(rèn)的Atlas Web Site Template已經(jīng)啟用了這個(gè)handler):

<httpHandlers>
    <add verb="*" path="atlasbatchcall.axd" type="Microsoft.Web.Services.MultiRequestHandler" validate="false"/>
</httpHandlers>

 

然后在頁(yè)面的Atlas xml腳本中加入對(duì)WebRequestManager的顯示聲明并設(shè)定該頁(yè)面允許對(duì)Web Service的批量調(diào)用: <script type="text/xml-script">
    <page xmlns:script="        <components>
            <webRequestManager batchSize="5" enableBatching="true" batchDelay="3000" />
        </components>
    </page>
</script>
這里您需要注意的是WebRequestManager的如下三個(gè)屬性:

enableBatching:設(shè)定該頁(yè)面是否允許批量調(diào)用,默認(rèn)值為false。這里我們應(yīng)該設(shè)置為true。
batchSize:設(shè)定一次批量調(diào)用中包含的請(qǐng)求的最大數(shù)量,默認(rèn)值為5。當(dāng)待調(diào)用的請(qǐng)求超過(guò)這個(gè)設(shè)定時(shí),即使未達(dá)到batchDelay中的設(shè)定時(shí)限,也立刻發(fā)出該批量請(qǐng)求。
batchDelay:設(shè)定一次批量調(diào)用的等待時(shí)限。默認(rèn)值為1000(毫秒)。當(dāng)?shù)却龝r(shí)限超過(guò)這個(gè)設(shè)定時(shí),即使未達(dá)到batchSize中的請(qǐng)求數(shù)量,也立刻發(fā)出該批量請(qǐng)求。
如此設(shè)定后,頁(yè)面中的每一個(gè)Web Service請(qǐng)求都會(huì)應(yīng)用批量調(diào)用。所以,對(duì)于單獨(dú)的一次調(diào)用,您應(yīng)該將其優(yōu)先級(jí)指定為高。

讓我們來(lái)看一個(gè)實(shí)例,首先編寫一個(gè)Web Service,其中有下述Web Method,兩個(gè)參數(shù)分別代表該任務(wù)的順序(這樣我們可以分清任務(wù)執(zhí)行的順序)以及優(yōu)先級(jí):

[WebMethod]
public string DoTask(int taskID, int priority)
{
    if (priority < 0 || priority > 2)
        throw new Exception("priority can only be 0, 1 or 2!");
    return string.Format("Task (ID: {0}, Priority: {1}) finished.", taskID, priority);
}

 

然后按照開(kāi)頭部分代碼在web.config中啟用批量調(diào)用,并在頁(yè)面上添加WebRequestManager,不要忘了頁(yè)面上還需要一個(gè)ScriptManager,引用上面定義的Web Service: <atlas:ScriptManager ID="scriptManager" runat="server">
    <Services>
        <atlas:ServiceReference Path="SampleService.asmx" />
    </Services>
</atlas:ScriptManager>
添加HTML標(biāo)記。其中按鈕用來(lái)引發(fā)批量調(diào)用,div用來(lái)顯示調(diào)用結(jié)果:

<input id="invokeTasks" type="button" value="Invoke Task Calls" onclick="return invokeTasks_onclick()" />
<div id="result"/>
最后是
javaScript腳本,調(diào)用Web Service:

function invokeTasks_onclick()
{
    // clear the output
    $('result').innerHTML = '';
   
    DoTask(1, 2);
    DoTask(1, 1);
    DoTask(2, 0);
}

var taskID = 0;
function DoTask(times, priority)
{
    for (var i = 0; i < times; ++i)
    {
        SampleService.DoTask(
            taskID++,
            priority,
            {onMethodComplete: OnComplete, priority: priority }
        );
    }
}
function OnComplete(result)
{
    $('result').innerHTML += result + "<br />";
}
注意到DoTask()方法接受兩個(gè)參數(shù):times用來(lái)指定調(diào)用次數(shù),priority用來(lái)指定優(yōu)先級(jí),并且我們利用了一個(gè)全局的變量taskID用來(lái)維護(hù)一個(gè)自增的請(qǐng)求順序。

在這個(gè)示例中,我們首先調(diào)用了一個(gè)低優(yōu)先級(jí)的請(qǐng)求,然后一個(gè)中優(yōu)先級(jí)的,最后兩個(gè)高優(yōu)先級(jí)的。

由于高優(yōu)先級(jí)不參與批量調(diào)用,所以您最先看到的是它們的返回:

由于中低優(yōu)先級(jí)的總數(shù)為2個(gè),尚未達(dá)到5,所以在3000毫秒的延時(shí)過(guò)后才被發(fā)送:

您可以修改invokeTasks_onclick()方法中的調(diào)用順序以及調(diào)用數(shù)目,分析批量調(diào)用的實(shí)現(xiàn)方式。

該示例程序可以在此下載:http://m.survivalescaperooms.com/Files/dflying/BatchingCallsDemo.rar


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武城县| 汉寿县| 洛隆县| 韩城市| 女性| 文化| 镇赉县| 阿克陶县| 田林县| 新蔡县| 芜湖市| 屯留县| 肥城市| 阿勒泰市| 甘泉县| 富宁县| 潢川县| 延长县| 贵州省| 韩城市| 株洲市| 枣阳市| 射阳县| 泰宁县| 玛沁县| 会东县| 虞城县| 藁城市| 平凉市| 黄石市| 资中县| 信丰县| 蕲春县| 商水县| 黎川县| 武平县| 通渭县| 丰顺县| 阜康市| 汪清县| 建始县|