我刚刚发现为什么所有的ASP.Net网站都很慢,我正在努力研究如何解决这个问题

我刚刚发现,ASP.Net Web应用程序中的每个请求都在请求开始时获得一个Session锁,然后在请求结束时释放它!

如果这种情况对您造成的影响丢失了,就像我刚开始时那样,这基本上意味着以下几点:

  • 任何时候,ASP.Net网页都需要很长时间才能加载(可能是由于数据库调用缓慢或者其他原因),并且用户决定导航到不同的页面,因为他们厌倦了等待,他们不能! ASP.Net会话锁强制新的页面请求等待,直到原始请求完成其痛苦的缓慢加载。 Arrrgh。

  • 任何时候UpdatePanel加载速度都很慢,并且用户决定在UpdatePanel完成更新之前导航到不同的页面......他们不能! ASP.net会话锁强制新的页面请求等待,直到原始请求完成其痛苦的缓慢加载。 双Arrrgh!

  • 那么有什么选择? 到目前为止,我已经提出:

  • 实现ASP.Net支持的自定义SessionStateDataStore。 我还没有发现太多复制的东西,看起来有很高的风险,容易搞砸。
  • 跟踪所有正在进行的请求,并且如果请求来自同一用户,请取消原始请求。 似乎有点极端,但它会工作(我认为)。
  • 不要使用Session! 当我需要用户的某种状态时,我可以仅使用缓存,而使用经过身份验证的用户名上的重要项目,或者其他类似的东西。 再次显得有点极端。
  • 我真的不敢相信ASP.Net微软团队会在4.0版本的框架中留下如此巨大的性能瓶颈! 我错过了明显的东西吗? 在会话中使用ThreadSafe集合有多难?


    如果你的页面没有修改任何会话变量,你可以选择退出这个锁定的大部分。

    <% @Page EnableSessionState="ReadOnly" %>
    

    如果您的页面没有读取任何会话变量,那么您可以完全退出该锁定页面。

    <% @Page EnableSessionState="False" %>
    

    如果你的页面没有使用会话变量,只需关闭web.config中的会话状态即可。

    <sessionState mode="Off" />
    

    我很好奇,如果不使用锁定,你认为“一个ThreadSafe集合”会变成线程安全的吗?

    编辑:我可能应该解释我的意思是“退出这个锁的大部分”。 可以同时处理给定会话的任何数量的只读会话或无会话页面,而不会相互阻塞。 但是,只有所有只读请求都完成后,读写会话页面才能开始处理,并且在运行时它必须具有对该用户会话的独占访问权限,以保持一致性。 锁定各个值不起作用,因为如果一个页面将一组相关值更改为一组,那该怎么办? 您如何确保同时运行的其他页面能够获得用户会话变量的一致视图?

    如果可能的话,我建议你尽量减少会话变量的修改。 这将允许您将大多数页面设置为只读会话页面,这增加了来自同一用户的多个同时请求不会彼此阻塞的可能性。


    好吧,这么大的道具让Joel Muller得到他的所有意见。 我的最终解决方案是使用本MSDN文章末尾详述的Custom SessionStateModule:

    http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstateutility.aspx

    这是:

  • 很快实现(实际上比提供者路由更容易)
  • 使用了大量标准的ASP.Net会话处理(通过SessionStateUtility类)
  • 这对我们应用程序的“snap feeling”感觉有很大的不同。 我仍然无法相信ASP.Net Session的自定义实现会锁定整个请求的会话。 这给网站增加了如此巨大的缓慢。 从我必须做的在线研究的数量(以及与几位非常有经验的ASP.Net开发人员的对话)来看,很多人都经历过这个问题,但很少有人遇到过这样的问题。 也许我会写一封信给斯科特古...

    我希望这可以帮助那里的几个人!


    我开始使用AngiesList.Redis.RedisSessionStateModule,除了使用(非常快)的Redis服务器进行存储(我使用Windows端口 - 尽管也有一个MSOpenTech端口),它绝对不会锁定会话。

    在我看来,如果你的应用程序是以合理的方式构建的,这不是问题。 如果实际上需要将锁定的一致数据作为会话的一部分,则应该专门实施锁定/并发检查。

    MS认为每个ASP.NET会话都应该被默认锁定以处理糟糕的应用程序设计,这是一个糟糕的决定,在我看来。 特别是因为大多数开发人员似乎没有/甚至没有意识到会话被锁定,更不用说那些应用程序显然需要结构化,所以您可以尽可能地执行只读会话状态(在可能的情况下选择退出) 。

    链接地址: http://www.djcxy.com/p/20507.html

    上一篇: I just discovered why all ASP.Net websites are slow, and I am trying to work out what to do about it

    下一篇: Service stack and Mocking, any tutorials?