作者: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
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注