在ASP.NET Atlas中調用Web Service——批量調用以提高效率

來源:互聯網
上載者:User

作者:Dflying Chen (http://dflying.cnblog.com/)

對於Atlas程式,在某些情況下,我們需要在短時間內調用大量的Web Service,例如某個列表中使用者快速的點擊刪除。這時網路頻寬,穩定程度等等往往會造成較長時間的延遲。如果可以將這些調用封裝成一個單一的請求,那麼使用者只需忍受一次網路延遲,即可得到處理的結果,也間接的提高了效率。似乎這並不是一個很容易實現的功能,但幸運的是,Atlas中內建了對批量調用Web Service的支援,您所需要的只是在程式中簡單設定一下。

Atlas中每個Web Service的調用請求都有三個優先順序:0:高1:中2:低,預設值為

在調用的時候您可以通過priority參數(請參考:在ASP.NET Atlas中調用Web Service——處理錯誤,逾時以及響應使用者的取消操作)指定本次調用的優先順序。對於高優先順序的調用,Atlas並不應用批量調用,每次都會立即發送該請求;對於中和低優先順序的調用,Atlas會將一定時間(請參考下面WebRequestManager的介紹)內的調用封裝成一個單獨的請求一起發送,或是當待調用的請求達到指定數目(請參考下面WebRequestManager的介紹)時一起發送。其中如果待調用的請求太多,那麼會從中挑選優先順序的請求首先調用。

啟用Atlas內建的批量調用Web Service支援,您首先需要在web.config中註冊伺服器端處理批量調用的handler(預設的Atlas Web Site Template已經啟用了這個handler):

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

然後在頁面的Atlas XML指令碼中加入對WebRequestManager的顯示聲明並設定該頁面允許對Web Service的批量調用:

<script type="text/xml-script">
    <page xmlns:script="http://schemas.microsoft.com/xml-script/2005">
        <components>
            <webRequestManager batchSize="5" enableBatching="true" batchDelay="3000" />
        </components>
    </page>
</script>

這裡您需要注意的是WebRequestManager的如下三個屬性:

  1. enableBatching:設定該頁面是否允許批量調用,預設值為false。這裡我們應該設定為true。
  2. batchSize:設定一次批量調用中包含的請求的最大數量,預設值為5。當待調用的請求超過這個設定時,即使未達到batchDelay中的設定時限,也立刻發出該批量請求。
  3. batchDelay:設定一次批量調用的等待時限。預設值為1000(毫秒)。當等待時限超過這個設定時,即使未達到batchSize中的請求數量,也立刻發出該批量請求。

如此設定後,頁面中的每一個Web Service請求都會應用批量調用。所以,對於單獨的一次調用,您應該將其優先順序指定為

讓我們來看一個執行個體,首先編寫一個Web Service,其中有下述Web Method,兩個參數分別代表該任務的順序(這樣我們可以分清任務執行的順序)以及優先順序:

[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);
}

然後按照開頭部分代碼在web.config中啟用批量調用,並在頁面上添加WebRequestManager,不要忘了頁面上還需要一個ScriptManager,引用上面定義的Web Service:

<atlas:ScriptManager ID="scriptManager" runat="server">
    <Services>
        <atlas:ServiceReference Path="SampleService.asmx" />
    </Services>
</atlas:ScriptManager>

添加HTML標記。其中按鈕用來引發批量調用,div用來顯示調用結果:

<input id="invokeTasks" type="button" value="Invoke Task Calls" onclick="return invokeTasks_onclick()" />
<div id="result"/>

最後是JavaScript指令碼,調用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()方法接受兩個參數:times用來指定調用次數,priority用來指定優先順序,並且我們利用了一個全域的變數taskID用來維護一個自增的請求順序。

在這個樣本中,我們首先調用了一個低優先順序的請求,然後一個中優先順序的,最後兩個高優先順序的。

由於高優先順序不參與批量調用,所以您最先看到的是它們的返回:

由於中低優先順序的總數為2個,尚未達到5,所以在3000毫秒的延時過後才被發送:

您可以修改invokeTasks_onclick()方法中的調用順序以及調用數目,分析批量調用的實現方式。

該樣本程式可以在此下載:http://files.cnblogs.com/dflying/BatchingCallsDemo.rar

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.