【问题标题】:Specifying read-only session in ASP.NET MVC在 ASP.NET MVC 中指定只读会话
【发布时间】:2010-11-13 10:59:03
【问题描述】:

有没有办法指定给定的控制器或动作以只读方式使用会话状态?在“旧”的 ASP.NET 中,我们曾经这样做过:

<%@ Page EnableSessionState="ReadOnly" %>

是否有 ASP.NET MVC 等价物?我希望允许我的应用程序同时处理来自同一个客户端的多个请求,并且在我的情况下完全关闭会话不是一个选项。

【问题讨论】:

标签: asp.net-mvc session


【解决方案1】:

这可能有点棘手——我的理解是设置会话状态是发生在 IHttpHandler 级别的事情。使用自定义处理程序,您可以使用标记接口指定会话状态,例如 IReadOnlySessionState 来声明它只需要只读会话状态。您可以尝试将其附加到您的控制器中,看看它是如何运行的。我怀疑它不会,因为 ASP.NET mvc 控制器在 IHttpHandler 连接后会很好地发生,但值得一试。

另一种解决方案可能是将会话状态变量包装在您自己的类中,并公开一个只读版本以强制只读。跨多个请求访问它应该不是问题,但是如果您开始尝试从多个角度写入相同的会话变量,您可以获得竞争条件等是正确的。

【讨论】:

  • 目标不是使变量成为只读变量,目标是允许从单个客户端同时向 MVC 页面发出多个请求。在只读包装器中包装会话变量无济于事。
  • 我想我并没有完全关注你——如果不是为了避免可能同时更新的竞争条件,为什么 ReadOnly 很重要?如果您的所有页面都只是读取会话数据,那么同时请求不会受到伤害。如果您的所有页面都需要同时更新会话,那么将内容包装为 ReadOnly 将无济于事。
  • 只读很重要,因为 ASP.NET 运行时不允许来自同一个客户端的多个请求,除非指定了只读会话。除非我指定只读会话,否则我不能同时请求,并且问题询问如何在 ASP.NET MVC 中执行此操作。
【解决方案2】:

如何在模型中将您希望“只读”的数据设置为静态数据?通过这种方式,您可以同时向 MVC 请求相同的数据。

【讨论】:

  • 线程问题不是我要解决的问题,问题是 ASP.NET 不会让一个 Web 应用程序同时处理来自同一个客户端的多个请求,除非它认为会话状态已关闭,或者处理请求的特定处理程序不会修改会话状态。将模型中的字段设为静态不会通知 ASP.NET 会话状态是只读的。
【解决方案3】:

这里提出了类似的问题:Disable Session state per-request in ASP.Net MVC

接受的答案涉及创建最终跳过绑定到会话的自定义路由处理程序。这并不能完全回答您的问题(即如何声明多个操作以使用只读会话访问),但它似乎足够相关。

【讨论】:

    【解决方案4】:

    在 Asp.Net MVC3 中,现在有一个 SessionStateAttribute,您可以使用它来装饰您的控制器,以强制所有操作进入读写、只读或无会话模式。

    http://msdn.microsoft.com/en-us/library/system.web.mvc.sessionstateattribute(v=VS.98).aspx

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 2012-02-14
      • 2014-07-05
      • 1970-01-01
      • 2010-12-12
      • 2011-05-15
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多