2011-02-24 68 views
3

我已经搜索这个解决方案的高和低。任何见解将不胜感激。PageMethods和Session

情况:当在一个页面中存在多个PageMethod调用时,每个方法调用都会阻塞Session对象的锁。该PageMethod的调用可以异步仅取得与@Page指令转向False|ReadOnly

发现:当Page指令是默认(读/写),但会议没有显示在页面上的任何地方使用时,呼叫不被阻塞。任何读取或写入页面级别的会话都会阻止pagemethod调用。

问题:在@Page指令中制作EnableSessionState=ReadOnly限制性很强,不想采用该路线。

pagemethod调用不能阻止吗?并仍然访问会话? (可能不是写但只是读)

+1

那么,为什么使用PageMethods详细?为什么不创建WCF服务来满足您的需求? – 2011-02-24 20:39:04

+0

我的猜测是会话不是线程安全的,所以PageMethods会因为它们不在正常的请求/响应周期而被阻止 - 许多PageMethods可以在用户正在查看的页面的同一时间被调用。是否有必要频繁地调用你的PageMethods?你能改变设计吗? http://programminglife.wordpress.com/2009/05/18/how-to-do-parallel-work-with-pagemethods/似乎通过实施异步模式提供解决方法。页面底部的评论甚至表示,如果从Global.asax中删除Session_Start/Session_End处理程序,会话将不会被锁定。 – WiseGuyEh 2011-02-25 00:10:59

+0

@WiseGuyEh:上面的链接确保PageMethod调用是真正并行的,并且Session可用于页面(所以不能将@Page EnableSessionState设置为ReadOnly) - 但BeginInvoke创建一个新线程,而该线程不是会话因为它不是页面循环的一部分。 – 2011-02-25 18:40:24

回答

2

我不相信你可以做到这一点,而不需要实现自己的会话提供程序。有some info on this MSDN page

ASP.NET应用程序固有地是 多线程。由于 并行到达的请求在线程 并行线程 上处理,因此可能会同时执行针对同一个会话 的两个或更多个 请求。 (该 典型的例子是,当一个页面 包含两个帧,每个靶向 不同ASPX在同一 应用,导致浏览器 提交用于 两页重叠的请求。)为了避免数据冲突 和不稳定的行为,提供商 “锁定”会话时开始 处理第一个请求,导致 针对同一个 会话的其他请求等待锁定来 免费。

因为有一个在允许 并发请求执行 重叠读取,锁 通常实现为 读/写锁,也就是说,一个 允许任何数量的线程读取 会议没有坏处,但这可以防止重叠写入和重复写入以及 重复写入。

+0

是的,ASP.NET会话提供程序无法实现此功能。当使用PageMethods时,ASP.NET会话被锁定(PageMethods没有ReadOnly选项)。我将WebMethods改为HttpHandler,并在客户端使用JQuery。我总结了我在http://stackoverflow.com/questions/5118236/sessions-in-asynchronous-design中使用的解决方案 – 2011-03-07 14:17:37