【问题标题】:No Concurrency despite SessionStateBehaviour尽管 SessionStateBehaviour 没有并发
【发布时间】:2012-07-12 07:51:06
【问题描述】:

在我们的应用程序中,提供了一个页面,该页面随后应该对更多数据进行并行异步调用。这些调用正在排队,我读到使用同一个会话的调用会排队,因为有多个请求写入同一个会话可能会引起并发症。

我还读到如果没有会话或者我们不需要写入会话,控制器可以设置为 [SessionState(SessionStateBehavior.Disabled)][SessionState(SessionStateBehavior.ReadOnly)]

我已经尝试了这些,因为我不需要写入会话,所以我认为请求将同时提供,或者如果我在没有意识到的情况下使用会话,则会引发异常。

这两种情况都不是。来自同一用户的请求仍在排队中。

如何验证我的指令 [SessionState(SessionStateBehavior.ReadOnly)] 是否得到遵守? 什么可能导致此问题?

如果相关,我们将在Orchard 的范围内工作。

【问题讨论】:

  • 出于测试目的,完全禁用会话并查看它是否有效:<sessionState mode="Off" /> 在您的 web.config 中。
  • 但是对其他控制器的一些请求确实需要会话......但也许我可以尝试一下。
  • 试一试。您将看到没有会话会好得多 :-) 您的应用程序将是 RESTFul 和无状态的,所有 Web 应用程序都应该这样设计。

标签: asp.net asp.net-mvc-3 session httphandler orchardcms


【解决方案1】:

在 Orchard 1.6 中,您可以将RouteDescriptorSessionState 属性设置为SessionStateBehavior.ReadOnlySessionStateBehavior.Disabled

所以您需要做的就是在您的Routes 类中创建一个新路由,该路由映射到您的控制器并具有上述SessionStateBehaviors 之一。之后您不需要使用SessionState 属性来装饰控制器。

【讨论】:

    【解决方案2】:

    这是因为用于每个 Orchard 路由请求的底层 HTTP 处理程序正在实现 IRequiresSessionState 接口。这就是每个请求实际上都排队的原因......

    这是一个已知问题,我们将尝试在下一个 Orchard 版本中解决该问题,只要它不意味着重大更改。有几个核心功能(以及未知数量的外部自定义功能)依赖(或可能依赖)Session,因此简单地删除 IRequiresSessionState 接口不是一种选择。我们需要先重构一些东西,并实现一些选择加入/退出机制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 2020-04-16
      • 2015-08-19
      • 2020-12-23
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多