Mar*_*sen 9 c# iis-7.5 asp.net-mvc-3
我在我的开发人员机器上运行了一个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 );
}});
})
Run Code Online (Sandbox Code Playgroud)
然后我得到以下结果(约)12,521,1025,1550,2067 异步结果http://martinhansen.no/hostedimages/async.PNG
如果我将异步切换为假,我得到:14,32,49,58,68 同步结果http://martinhansen.no/hostedimages/sync.PNG
似乎某个地方的请求正在排队,一段时间后它只响应每500秒.我让我的控制器返回空白文本而不是数据库调用,所以不是数据库.
IIS 7.5对Windows 7有限制吗?我可以改变的设置?我怀疑每个用户的最大并发请求或类似的东西.然后它通过每500毫秒响应来"惩罚"你.这样人们就不会将它用作实际的服务器.
可能性有多大?有没有办法避免它?
Mar*_*sen 10
它与IIS显然无关,或者与Windows 7上的IIS无关,我也在测试服务器上尝试了相同的结果.
这是因为sessionstate施加的限制,请参见底部的"并发请求和会话状态"部分:http://msdn.microsoft.com/en-us/library/ms178581.aspx
但是,如果对同一会话发出两个并发请求(通过使用相同的SessionID值),则第一个请求将获得对会话信息的独占访问权.第二个请求仅在第一个请求完成后执行.
但是我仍然不明白为什么在第一个请求看似完成之后不会立即触发下一个请求.500毫秒的延迟似乎很假.
我遇到了这个问题如何设置ASP.NET SessionState读写LOCK超时?讨论会话状态的锁定时间.
System.Web.SessionState.SessionStateModule.LOCKED_ITEM_POLLING_INTERVAL = 500
这是我一直在搜索我的代码和500的互联网的神奇数字!我知道它必须在某个地方.
无论如何,为了解决这个问题,我将sessionstate属性添加到我的控制器中,并选择了只读
[SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
public class BaseController : Controller{}
Run Code Online (Sandbox Code Playgroud)
阅读更多相关信息:
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以便下一个请求可以完成?