异步Web方法

本文关键字:方法 Web 异步 | 更新日期: 2023-09-27 17:58:42

我有一个客户端/服务。

该服务有一个需要很长时间才能完成的方法(它与数据库交互)。

我通过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

这里有一段视频可能会有所帮助。

异步Web方法

去掉对Web方法中Session的依赖,您可能会发现会话访问是串行的,这就是块。

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

并发请求和会话状态

对ASP.NET会话状态的访问为每个会话独占,这意味着如果两个不同的用户并发请求,访问每个授予单独会话同时但是,如果两个对相同会话(通过使用SessionID值),第一个请求获得对会话的独占访问权限信息第二个请求仅在第一个请求之后执行完成。(第二次会议可以如果独占锁定,也可以访问上的信息被释放,因为第一个请求超过了锁定超时。)如果EnableSessionState设置了@Page指令中的值到ReadOnly,请求只读会话信息不导致对会话数据。但是,只读对会话数据的请求可能仍然必须等待对的会话数据的读写请求清楚的

最好创建一个BatchLookup API,它可以一次性处理一个请求块。浏览器和服务器之间的任何连接都会受到同时请求数量的限制,每次往返本身就是一次缓慢的操作。

我怀疑这根本不是服务器端的问题,而是您遇到的浏览器连接限制即使您将服务器端修复为同时处理两个请求,浏览器也不会同时启动所有10个请求。例如,请参阅这篇关于以下主题的文章:http://www.ajaxperformance.com/2006/12/18/circumventing-browser-connection-limits-for-fun-and-profit/

顺便说一句,在数据库中查找一个UPC代码怎么会花这么长时间?你有正确的索引吗?