我有一个'标签'样式的网页,一旦页面加载每个标签,就会触发对其内容的Ajax请求(使用jQuery)。后端是在Visual Studio中运行的ASP.NET MVC,因此只需使用正常的“ASP.NET开发服务器”来处理请求。我遇到了以下问题:
1)请求由Web服务器逐个处理。第一个请求在第一个请求完成之前不会处理。这是在单线程模式下运行的'ASP.NET Development Server'吗?我可以让它多线程(我应该让它多线程还是会打开一个痛苦的世界?)
2)长时间运行的请求会终止后续请求。即使我一次性关闭ajax请求,也会一次一个地处理请求,为什么会有一些请求甚至没有到达网络服务器?一旦长期请求得到服务,就会发生这种情况。例如:
我尝试过增加ajax超时但没有成功。
更新 我在我的代码中发现了一个错误,它弄乱了最终请求的URL,所以看起来这与请求长度和ajax超时(blush!)无关。一路上虽然我找到了有用的ajaxManager插件,如果你需要的话,它非常适合排队请求(http://www.protofunc.com/scripts/jquery/ajaxManager/)。另外,感谢有关使用ASP.NET Dev Server进行测试的有效观点。它确实与IIS完全不同。
答案 0 :(得分:4)
关于第1点,请记住,如果您正在使用会话状态,则请求将不会同时执行 - ASP.NET将锁定会话状态,并且将仅处理每次使用一个请求的每个请求。 (有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms178581中的“并发请求和会话状态”部分)尝试禁用会话状态(如果您当然没有使用它!)并查看是否有帮助。
答案 1 :(得分:0)
当ASP.NET看到来自同一用户的两个或多个请求(通过检查其SessionID)并且会话同时被标记为“读”和“写”时,它将执行第一个请求并将所有其他请求排队,这样只有一个请求将同时从同一用户执行。因此,我们可以说这些请求已序列化。 要使请求并发执行,您需要将会话标记为已禁用或只读。
例如。如何在应用程序级别禁用会话状态:
protected void Application_BeginRequest()
{
if (Request.Cookies["ASP.NET_SessionId"] != null)
{
Request.Cookies.Remove("ASP.NET_SessionId");
}
}
如果要允许对几个控制器的并发请求,并希望为其他控制器维护会话。我们可以过滤出如下条件:在下面的示例中,我仅针对控制器禁用会话,即“并发”。所有其他控制器将维持会话。
protected void Application_BeginRequest()
{
if (Request.Url.AbsoluteUri.ToLower().Contains("Concurrent") && Request.Cookies["ASP.NET_SessionId"] != null)
{
Request.Cookies.Remove("ASP.NET_SessionId");
}
}