c# - 如何覆盖 session 属性?

标签 c# asp.net asp.net-mvc asp.net-mvc-3 session

问题:

通常,一个人像这样访问 session 对象:

Session["foo"] = "bar";

我在它上面写了一个包装器,它是通用的,它检查 session 是否已过期,如果是,则抛出 SessionExpiredException。

为了使用我的 session 访问权限,我必须像这样通过我的类(class)访问 session

WebApplications.SessionAccess.Set<string>("foo", "bar");

现在,显然,尽管存在类 SessionAccess,但仍然可以通过普通 session 对象访问 session 。这是不可取的,另外,我想稍后将它包含在一个更大的旧项目中,该项目是使用普通 session 编写的,这意味着我将不得不用我的包装器。

有没有办法用我自己的属性覆盖 System.Web.HttpSessionStateBase.Controller.Session - 属性?

问题是,没有在 web.config 中定义的自定义 session 处理程序,因为有时已经有一个用于将数据库用于 session 的处理程序(仍然可以在 Global.asax 中初始化一个模块)。

SessionTimeout 上的那些 NULL 引用异常 YSOD 非常令人不安。
如果可能,一个适用于经典 ASP.NET 网络表单和 MVC 的解决方案。

最佳答案

我不认为会有任何你想要的完全证明的解决方案,但很少有技巧可以让你的生活更轻松。

  1. 创建另一个提供索引器属性的包装器,以便您可以轻松地将 Session["key"] = "name" 等调用替换为您的包装器属性;
  2. 您需要从通用基页类(它本身间接从 System.Web.UI.Page 继承)继承所有页面(即代码隐藏类)。如果您已经有这样的基页,那么您的情况真的很好。从本身继承自 System.Web.UI.Page 的内部基类继承通用页面基类。
  3. 在公共(public)页面库中,添加一个新的 Session 属性,该属性将返回您在 #1 中创建的包装器对象。如果您有很多用户控件(和自定义控件),则必须执行类似的技巧。这将使您免于替换大部分 Session["key"] = "name" 类型的调用。
  4. 最后,覆盖内部基页类中的 Session 属性以添加调试断言。您可以选择返回 null 但这会破坏生产使用。调试断言可以更好地找到将从 #3 中转义的 session 使用情况。

如前所述,这不是一个完整的解决方案,因为仍然可以通过 HttpContext 访问 session 状态。但它应该使遗留代码更容易迁移到您的 session 访问器对象。

关于c# - 如何覆盖 session 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9477661/

相关文章:

c# - 在 Web API 中正确使用 async/await

c# - 加号登录 ASP.NET 站点的查询字符串

c# - MemoryStream.WriteTo(Stream destinationStream) 与 Stream.CopyTo(Stream destinationStream)

c# - 如何在asp.net中提取jquery.ajax序列化表单参数

javascript - Controller 操作触发后将文件保存到本地磁盘,ASP.NET MVC

c# - MVC 通用存储库过滤

asp.net - 这是从 ASP.NET MVC Controller 返回不同 View 的正确模式吗?

c# - 不在接口(interface)中的类方法

c# - 限制对继承属性的访问 C#

c# - 确定是否在 ASP.NET 中选中了 CheckBox