问题:
通常,一个人像这样访问 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 的解决方案。
最佳答案
我不认为会有任何你想要的完全证明的解决方案,但很少有技巧可以让你的生活更轻松。
- 创建另一个提供索引器属性的包装器,以便您可以轻松地将
Session["key"] = "name"
等调用替换为您的包装器属性; - 您需要从通用基页类(它本身间接从 System.Web.UI.Page 继承)继承所有页面(即代码隐藏类)。如果您已经有这样的基页,那么您的情况真的很好。从本身继承自 System.Web.UI.Page 的内部基类继承通用页面基类。
- 在公共(public)页面库中,添加一个新的 Session 属性,该属性将返回您在 #1 中创建的包装器对象。如果您有很多用户控件(和自定义控件),则必须执行类似的技巧。这将使您免于替换大部分
Session["key"] = "name"
类型的调用。 - 最后,覆盖内部基页类中的 Session 属性以添加调试断言。您可以选择返回 null 但这会破坏生产使用。调试断言可以更好地找到将从 #3 中转义的 session 使用情况。
如前所述,这不是一个完整的解决方案,因为仍然可以通过 HttpContext 访问 session 状态。但它应该使遗留代码更容易迁移到您的 session 访问器对象。
关于c# - 如何覆盖 session 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9477661/