2011-06-09 201 views
4

我有一個客戶端/服務。異步Web方法

該服務有一個需要很長時間才能完成的方法(它與數據庫交互)。

我通過AJAX請求從頁面調用這個方法到客戶端,然後到服務端。

我的服務代碼:

[WebMethod] 
public static string LookupUPC(string sessionId, string upc) { 
    string response = ""; 
    var client = new SmartShopService.SmartShopInterfaceClient(); 
    try { 
     response = client.LookupUPC(sessionId, upc); 
    } 
    catch (Exception e) { 
     throw e; 
    } 
    finally { 
     if (client.State == System.ServiceModel.CommunicationState.Faulted) 
      client.Abort(); 
     else 
      client.Close(); 
    } 
    return response; 
} 

它是從頁通過AJAX請求

for(var i = 0;i<10; i++){ 
$.ajax({ 
    type: "POST", 
    url: "SmartShopGUI.aspx/LookupUPC", 
    contentType: "application/json; charset=utf-8", 
    data: DataCreator(allData), 
    dataType: "json", 
    success: function (result) { 
     $(upcName).html(result.d);  
    }, 
    error: AjaxFailed 
}); 
} 

既然叫,這是頁面上的異步完成的,但客戶端同步發送請求。我想改變它,如果它一次請求10個,它會向服務發送10個不同的請求。

http://www.screencast-o-matic.com/watch/cX1Qo8qV2

這裏是一個視頻,這可能有助於。

+0

我不認爲你已經給了我們足夠的信息......客戶端如何向他們發送同步?這個'Loader'在哪裏定義,它在哪裏調用這個Ajax負載? – Fosco 2011-06-09 14:33:13

+0

裝載機是什麼意思?我知道客戶端正在同步發送它們,因爲我向WebMethod發送了10個AJAX請求,但通過斷點,我發現每個請求都等待前一個請求完成。客戶端只是一個ASPX頁面。 – Overload119 2011-06-09 14:41:58

+0

@ Overload119我的意思是在Ajax調用這一行:'Loader.RequestsMade - ;'..我看來,像有個東西叫裝載機是使這些電話和遞減計數...... – Fosco 2011-06-09 14:45:36

回答

2

在web方法中刪除對Session的依賴,您可能會發現會話訪問是串行的,並且這是該塊的內容。

http://msdn.microsoft.com/en-us/library/ms178581.aspx

併發請求和會話狀態

訪問ASP.NET會話狀態是 每個會話,這意味着 ,如果兩個不同的用戶做出 併發請求,訪問每個 獨家獨立會議同時授予 。但是,如果兩個 併發請求的 同一會議上提出的(通過使用相同的SessionID 值),第一個請求 獲取到會話 信息獨佔訪問。第二個請求 僅在第一個請求 完成後才執行。 (第二屆會議能因爲 第一請求超過鎖定 超時 還可以訪問,如果在信息獨佔鎖 被釋放。)如果@ Page指令中的EnableSessionState 值設置 到只讀,一請求 只讀會話信息不是 會導致對會話數據的獨佔鎖定。然而,對會話數據的只讀 請求可能仍然需要等待 對 的讀寫請求所設置的鎖定爲 清除。

+0

你能進入更多細節 - 請注意,WebMethod代碼位於ASPX頁面內,而不是ASMX服務。它會繼續工作嗎? – Overload119 2011-06-09 15:42:46

+0

對不起,在看到您的評論之前發佈了鏈接。嘗試將屬性[System.Web.Services.WebMethod(false)]並確保您沒有在方法中使用會話。 – 2011-06-09 15:44:32

+0

你可以嘗試把這個'如果@ Page指令中的EnableSessionState值設置爲只讀,爲只讀的會話信息的請求不會導致對會話數據的專用鎖。但是,會話數據的只讀請求可能仍然需要等待由會話數據的讀寫請求設置的鎖定。 – 2011-06-09 15:45:30

1

你會做的更好,以創建一個BatchLookup API,可以處理請求的塊中的所有一氣呵成。瀏覽器與服務器之間的任何連接都會受到限制,因爲您可以同時發出多少個請求,並且每次往返本身都是慢速操作。

我懷疑這根本不是服務器端問題,而是瀏覽器連接限制。即使您修復了服務器端來處理兩個同時發生的請求,瀏覽器也不會一次觸發全部10個請求。例如參見這篇文章的題目是:http://www.ajaxperformance.com/2006/12/18/circumventing-browser-connection-limits-for-fun-and-profit/

BTW,如何在數據庫中查找一個UPC代碼這麼長的時間?你有沒有適當的索引?