【问题标题】:PageMethods and Session页面方法和会话
【发布时间】:2011-02-24 20:24:49
【问题描述】:

我已经为这个解决方案搜索了高低。任何见解都将受到高度赞赏。

情况:当单个页面中有多个PageMethod调用时,每个方法调用都持有Session对象的锁,从而阻塞。 PageMethod 调用只能在 @Page 指令变为 False|ReadOnly 时进行异步调用

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

问题:在@Page 指令中创建EnableSessionState=ReadOnly 非常受限制,并且不想走那条路。

pagemethod 调用可以不阻塞吗?并且仍然访问会话? (可能不是写,只是读)

【问题讨论】:

  • 那么,为什么要使用 PageMethods?为什么不创建 WCF 服务来满足您的需求?
  • 我的猜测是 Session 不是线程安全的,因此 PageMethods 阻塞,因为它们超出了正常的请求/响应周期 - 可以从用户正在查看的页面同时调用许多 PageMethods。有必要如此频繁地调用您的 PageMethods 吗?你能改变设计吗? programminglife.wordpress.com/2009/05/18/… 似乎通过实现异步模式提供了一种解决方法。页面底部的评论甚至说如果您从 Global.asax 中删除 Session_Start/Session_End 处理程序,会话将不会被锁定。
  • @WiseGuyEh:上面的链接确保 PageMethod 调用是真正并行的,并且 Session 可用于页面(因此不要将 @Page EnableSessionState 设置为 ReadOnly) - 但是 BeginInvoke 创建了一个新的线程并且该线程不是会话感知的,因为它不是页面周期的一部分。

标签: c# asp.net asp.net-ajax asynchronous


【解决方案1】:

我不相信您可以在不实现自己的会话提供程序的情况下做到这一点。有some info on this MSDN page

ASP.NET 应用程序本质上是 多线程。因为要求 并行到达被处理 从一个线程中抽取的并发线程 游泳池,可能有两个或更多 针对同一会话的请求 将同时执行。 (这 经典的例子是当一个页面 包含两个框架,每个框架针对一个 不同的ASPX在同一个 应用程序,导致浏览器 提交重叠请求 两页。)为了避免数据冲突 和不稳定的行为,提供者 在会话开始时“锁定”会话 处理第一个请求,导致 针对相同的其他请求 等待锁到来的会话 免费。

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

【讨论】:

  • 是的,这对于 ASP.NET 会话提供程序是不可能的。并且当使用 PageMethods 时 ASP.NET 会话被锁定(PageMethods 没有 ReadOnly 选项)。我将 WebMethods 更改为 HttpHandler 并在客户端使用 JQuery。我总结了我在stackoverflow.com/questions/5118236/…中使用的解决方案
【解决方案2】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2011-06-27
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 2021-11-09
    • 2013-01-14
    相关资源
    最近更新 更多