我有MVC应用程序,基本上是1个主视图和多个部分视图。 我在min页面上有这个小脚本,它异步加载部分视图:
<script>
$(function () {
$('#bookmarks').load('Home/Bookmarks');
$('#calendar').load('Home/Calendar');
$('#gmail').load('Home/Gmail');
$('#weather').load('Home/Weather');
$("#news").load("Home/News");
}
</script>
当我对它们进行评论时,我得到了这个(非常快速的加载):
现在我取消注释&#34; Bookmarks&#34;请求(只读取本地驱动器中的小JSON文件),我得到这个(书签需要9毫秒):
现在我取消注释&#34;日历&#34;请求(谷歌日历API),我得到这个(如果请求是异步的,书签延迟从9毫秒跳到1.04秒?):
现在我取消注释&#34; Gmail&#34;请求(谷歌Gmail API),我得到这个(书签延迟从1.04秒再次跳到1.53秒?):
现在我取消注释其余部分(&#34; Gmail&#34;,&#34;天气和#34;以及&#34;新闻和#34;请求),我的这些疯狂增加的延迟,书签请求现在要执行5s而不是9ms - 为什么?):
你可以看到每个操作的延迟增加 - 看起来这些ajax请求根本不是异步的:(当AJAX默认为异步时,怎么可能呢?
我确信我在这里遗漏了一些东西,可能jQuery加载功能不是异步,但它是javascript大小,延迟是在服务器端。我现在很困惑。
更新:显然jQuery调用是异步的,所有加载函数都是同时执行的。这很容易。问题出在服务器端。在进行了一些测试之后,很明显 IIS按照从浏览器接收它们的顺序一个接一个地顺序执行这些请求。我在IIS上做了一些额外的阅读,默认情况下,IIS apppool只有一个正在使用的工作进程,它可以触发多个线程来处理所有这些请求。 但由于某种原因,请求正在按顺序处理而不是并行处理。我还没有找到原因(如果AppPool工作进程可以启动多个线程进行同步处理),请求仍然按顺序执行,以及如何使这些请求并行处理,如果它甚至是可能。如果有人知道如何使事情正常工作,我真的很想听。感谢。
更新经过多次阅读后,发现如果启用了会话,则会按顺序处理请求。会话对象是单线程对象。会话对象不能同时由两个线程共享。因此,当对同一会话有两个请求时,一个会被排队,而另一个会话对象正在使用。这很糟糕:(任何建议,IIS专家?:)
解决 是的,会话状态是问题所在!我在web.config中禁用了会话状态,并删除了使用Session对象的一行以避免运行时错误。现在一切都很完美。真正的问题确实是 - 会话状态绑定到单个线程,因此在服务器端我的应用程序表现得像旧的STA放屁:)
http://msdn.microsoft.com/en-us/library/ms178581.aspx
并发请求和会话状态
对每个会话的访问ASP.NET会话状态是独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。但是,如果对同一会话发出两个并发请求(通过使用相同的SessionID值),则第一个请求将获得对会话信息的独占访问权。第二个请求仅在第一个请求完成后执行。(如果由于第一个请求超过锁定超时而释放信息的独占锁定,则第二个会话也可以访问。)如果EnableSessionState值为@ Page指令设置为ReadOnly,对只读会话信息的请求不会导致会话数据的独占锁定。但是,会话数据的只读请求可能仍然需要等待会话数据的读写请求设置的锁定才能清除。
答案 0 :(得分:2)
经过多次阅读后,发现请求已处理完毕 如果启用了会话,则按顺序会话对象是单个对象 线程对象。两个线程无法共享会话对象 同时。因此,当有两个同一会话请求时 一个在队列对象被另一个使用时排队。这个 糟透了:(任何建议,IIS专家?:)
请勿使用Session
。我很少找到合理使用Session
的案例,并且通常很容易找到没有您遇到的可扩展性限制的存储替代方案。