【发布时间】: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