2010-02-05 68 views
3

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

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

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

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

“如果两个并发请求为同一会议上提出的第一个请求获取会话信息的独占访问的第一个请求完成后才会第二个请求执行。 (如果由于第一个请求超出锁定超时而释放对信息的排他锁定,第二个会话也可以访问。)如果@ Page指令中的EnableSessionState值设置为ReadOnly,则读取请求 - 仅会话信息不会导致对会话数据的独占锁定。“

...但我还没有找到任何有关此锁定超时时间或如何更改它的信息。

+1

你是否需要整个会话状态?你不能提取你需要的东西,并通过DTO吗? – 2010-02-05 01:49:54

+0

我不需要整个会话状态,只需要一些数据。我不知道这是如何解决锁定问题。 – 2010-02-05 01:53:12

+0

我发现,可能与和有关这些不同的特性: HttpContext.Current.Session.IsReadOnly =假 HttpContext.Current.ReadonlySessionState =假 System.Web.SessionState.SessionStateModule.s_configExecutionTimeout =110秒 系统。 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 。 – 2010-02-05 02:23:50

回答

0

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

+0

这不是我一直在寻找的答案,但它有助于解决问题。所以谢谢和回答接受(而不是迟到)。 – 2011-08-02 11:08:43

1

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

默认情况下,此值是2.0 asp之后的110秒,在此之前它是90秒。我会担心这种行为在未来发生变化,并被“固定”。