【问题标题】:How to set the ASP.NET SessionState read-write LOCK time-out?如何设置 ASP.NET SessionState 读写 LOCK 超时?
【发布时间】:2011-01-13 08:34:24
【问题描述】:

我有一个使用 ASP.NET 会话状态的 WCF Web 服务。 WCF 为每个请求在会话上设置读写锁。这意味着我的 Web 服务每次只能处理每个用户的一个请求,这会损害 AJAX 应用程序的感知性能。

所以我试图找到一种方法来解决这个限制。

  • WCF 不支持使用只读锁(然后允许并发访问会话)。
  • 我还没有找到在处理请求期间手动释放读写锁的方法
  • 所以现在我想可能有一些方法可以将读写锁定超时设置为非常短的时间间隔,以便等待请求不需要等待很长时间。请参阅下面的粗体部分。

来自 MSDN: http://msdn.microsoft.com/en-us/library/ms178581.aspx

"如果对同一个会话有两个并发请求,第一个请求获得对会话信息的独占访问权。第二个请求只有在第一个请求完成后才执行。(第二个会话也可以访问,如果对信息的排他锁被释放,因为第一个请求超过了锁超时。) 如果@Page 指令中的 EnableSessionState 值设置为 ReadOnly,则不会产生对只读会话信息的请求在会话数据的排他锁中。”

...但是我没有找到任何关于这个锁定超时时间的信息,或者如何改变它。

【问题讨论】:

  • 你需要整个会话状态吗?你不能提取你需要的东西并传递一个 DTO 吗?
  • 我不需要整个会话状态,只需要其中的一些数据。不过,我不确定这如何解决锁定问题。
  • 我发现了这些可能相关且相关的各种属性: HttpContext.Current.Session.IsReadOnly = false HttpContext.Current.ReadonlySessionState = false System.Web.SessionState.SessionStateModule.s_configExecutionTimeout = 110 seconds System.Web.SessionState.SessionStateModule.LOCKED_ITEM_POLLING_DELTA = 0.25 秒 System.Web.SessionState.SessionStateModule.LOCKED_ITEM_POLLING_INTERVAL = 500(毫秒?) System.Web.SessionState.SessionStateModule.s_lock = System.Web.Util.ReadWriteSpinLock .

标签: asp.net wcf session-state


【解决方案1】:

我可以告诉你,httpRuntime 执行超时控制了这个锁定时间,但是,这个字段的文档声明线程应该在此时终止。我从经验中知道,这个线程并没有终止,最终会返回数据,但是会产生一个新线程来处理队列中的请求。

默认情况下,这个值是 2.0 asp 之后的 110 秒,之前是 90 秒。我会担心这种行为将来会发生变化并被“修复”。

【讨论】:

    【解决方案2】:

    有没有人尝试过使用 SQLSessionStateProvider 并修改 SP?我在开发中这样做了,似乎解决了锁定问题,但不确定它是否有任何副作用。基本上我所做的是更改获得独占锁的 3 个 SP,以便 Lock 列始终设置为 0。

    【讨论】:

    • 这不是我正在寻找的答案,但它有助于解决问题。所以感谢和回答被接受了(相当晚了)。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    相关资源
    最近更新 更多