我在我的开发人员计算机上运行了一个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
如果我将异步切换为假,我得到:14,32,49,58,68 sync result http://martinhansen.no/hostedimages/sync.PNG
似乎某个地方的请求正在排队,一段时间后它只响应每500秒。 我让我的控制器返回空白文本而不是数据库调用,所以不是数据库。
Windows 7的IIS 7.5是否有限制?我可以改变的设置? 我怀疑每个用户的最大并发请求或类似的东西。然后它通过每500毫秒响应来“惩罚”你。这样人们就不会将它用作实际的服务器。
可能的?有没有办法避免它?
答案 0 :(得分:9)
它与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以便下一个请求可以完成?
答案 1 :(得分:0)
您一次发送了多少个请求?客户端操作系统上的IIS为limited to 10 simultaneous connections。超过该限制时,它会将传入连接抛出到队列中,并在插槽打开时对其进行处理。
MS长期以来一直在努力确保客户端操作系统不会被用于蚕食其服务器操作系统平台的销售。