2011-06-09 149 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代码这么长的时间?你有没有适当的索引?