【问题标题】:IIS delays a lot between each response with async requestsIIS 在每个带有异步请求的响应之间延迟很多
【发布时间】:2011-09-23 02:03:53
【问题描述】:

我有一个 ASP.NET MVC 项目在我的开发者机器上运行,安装 Windows 7 Ultimate 和 iis 7.5。

我执行以下操作:

var requests = ["http://myserver.com/news/details/113834",
"http://myserver.com/tag/details?ids=113834&entityType=23",
"http://myserver.com/publish/details?ids=113834&entityType=23",
"http://myserver.com/generalproperty/details?ids=113834&entityType=23",
"http://myserver.com/category/details?ids=113834&entityType=23"];

var f = new Date().getTime();
$.each(requests, function(k,v) {
    $.ajax({
    url :v,
    async : true,
    type :'get',
    success : function(data) {
        console.log(new Date().getTime()  -f );
    }});
})

然后我得到以下结果(大约)12、521、1025、1550、2067 async result http://martinhansen.no/hostedimages/async.PNG

如果我将 async 切换为 false,我会得到:14,32,49,58,68 sync result http://martinhansen.no/hostedimages/sync.PNG

似乎某处请求正在排队,一段时间后它仅每 500 秒响应一次。 我让我的控制器返回空白文本而不是数据库调用,而不是数据库。

对于 Windows 7 的 IIS 7.5 是否有限制?我可以更改的设置? 我怀疑每个用户的最大并发请求数或类似的东西。然后它通过仅每 500 毫秒响应一次来“惩罚”您。这样人们就不会将它用作实际的服务器。

可能吗?有没有办法避免呢?

【问题讨论】:

    标签: c# asp.net-mvc-3 iis-7.5


    【解决方案1】:

    它与 IIS 或 Windows 7 上的 IIS 无关,我也在测试服务器上尝试过,结果相同。

    这是由于 sessionstate 施加的限制,请参阅此处底部的“并发请求和会话状态”部分:http://msdn.microsoft.com/en-us/library/ms178581.aspx

    但是,如果对同一个会话发出两个并发请求(通过使用相同的 SessionID 值),则第一个请求将获得对会话信息的独占访问权。第二个请求只有在第一个请求完成后才会执行。

    但我仍然不明白为什么它不会在第一个请求看似完成后立即触发下一个请求。 500 毫秒的延迟似乎很假。

    我遇到了这个问题How to set the ASP.NET SessionState read-write LOCK time-out?,它谈到了会话状态的锁定时间。

    System.Web.SessionState.SessionStateModule.LOCKED_ITEM_POLLING_INTERVAL = 500

    这是我一直在搜索我的代码和互联网的神奇数字...... 500!我知道它一定在某个地方。

    无论如何,为了解决这个问题,我将 sessionstate 属性添加到我的控制器中,并选择只读

    [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
    public class BaseController : Controller{} 
    

    了解更多信息:

    http://afana.me/post/session-less-controllers-and-TempData-ASPNET-MVC.aspx

    http://weblogs.asp.net/imranbaloch/archive/2010/07/10/concurrent-requests-in-asp-net-mvc.aspx

    我还是觉得有问题,为什么上一个请求不告诉系统它不再需要锁定 sessionstate 以便下一个请求可以完成?

    【讨论】:

      【解决方案2】:

      您一次发送多少个请求?客户端操作系统上的 IIS 为 limited to 10 simultaneous connections。超过该限制时,它会将传入连接放入队列中,并在插槽打开时对其进行处理。

      长期以来,MS 一直在努力确保客户端操作系统不被用来蚕食其服务器操作系统平台的销售。

      【讨论】:

        猜你喜欢
        • 2019-02-13
        • 1970-01-01
        • 1970-01-01
        • 2016-11-22
        • 1970-01-01
        • 2023-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多