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

如果你没有意识到这一点,就像一开始对我一样,这基本上意味着:

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

  • 每当UpdatePanel加载缓慢,并且用户决定在UpdatePanel完成更新之前导航到其他页面时...他们不能!ASP.net会话锁强制新页面请求等待,直到原始请求完成其缓慢得令人痛苦的加载.加倍啊!

那么有什么 Select 呢?到目前为止,我已经想出了:

  • 实现ASP.NET支持的自定义SessionStateDataStore.我没有发现太多要复制的东西,而且看起来风险很高,很容易搞砸.
  • 跟踪所有正在进行的请求,如果请求来自同一用户,请取消原始请求.看起来有点极端,但它会起作用(我认为).
  • 不要使用会话!当我需要用户的某种状态时,我可以使用缓存,以及经过身份验证的用户名上的关键项,或者类似的东西.似乎又有点极端了.

我真不敢相信ASP.NET微软团队会在4.0版的框架中留下如此巨大的性能瓶颈!我是不是漏掉了什么明显的东西?为会话使用ThreadSafe集合有多难?

推荐答案

好吧,乔尔·穆勒的所有投入都是一大props .我的最终解决方案是使用本MSDN文章末尾详述的自定义SessionStateModel:

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

这是:

  • 实现起来非常快(实际上似乎比按照Provider 的路由更容易)
  • 使用了很多标准的ASP.Net会话处理开箱即用(通过SessionStateUtility类)

这给我们的应用程序带来了巨大的"敏捷感".我还是不敢相信ASP的定制实现.Net会话为整个请求锁定会话.这给网站增添了如此巨大的惰性.从我不得不做的大量在线研究(以及与几位经验丰富的ASP.Net开发人员的交谈)来看,很多人都经历过这个问题,但很少有人能弄清问题的根源.也许我会写封信给Scott Gu...

我希望这对外面的一些人有帮助!

Asp.net相关问答推荐

ASP.NET Core 延迟加载始终返回 null

逐步 ASP.NET 自动构建/部署

在 ASP.NET 中访问没有值的查询字符串参数

MSCharts找不到请求类型'GET'的http处理程序错误

异步编程与线程有什么不同?

如何在 ASP.NET Web API 中使用非线程安全的 async/await API 和模式?

ASP.Net Core MVC - 自定义属性的客户端验证

stream.CopyTo - 文件为空.网

最佳服务器端 .NET PDF 编辑库

如何将 css 类添加到 ASP.Net 中的更新面板?

ASP.NET 中的多选下拉列表

确定哪个 w3wp.exe 进程属于 Windows 7 / IIS7.5 中的哪个 App Pool?

使用 LINQ 进行递归控制搜索

缩小 ASP.Net MVC 应用程序的 HTML 输出

如何在我自己的方法中模仿 string.Format()?

如何防止aspxerrorpath作为查询字符串传递给 ASP.NET 自定义错误页面

当.NET抛出WebException((400)错误请求)时如何处理WebResponse?

HttpContext.Current.Request.Url.Host 它返回什么?

有没有办法在没有异常类的情况下抛出自定义异常

使用 NLog 在 ASP.NET Web API 2.1 中进行全局异常处理?