ASP.NET 会话状态、序列化和继承
本文关键字:继承 序列化 NET 会话状态 ASP | 更新日期: 2023-09-27 17:56:36
首先,一点背景。我有两个使用 SQLServer 会话状态的 ASP.NET Web 应用程序(它们使用相同的服务器,具有相同的凭据)。每个应用程序都定义一个封装的会话类,该会话类或多或少充当容器。
// For example...
public class FirstSession
{
private string _name;
public string Name
{
get { return this._name; }
set { this._name = value; }
}
public FirstSession()
{
this._name = string.Empty;
}
}
当然,真正的类要复杂得多,但最终它主要归结为数据结构。然后,每当创建新会话时,应用程序都会使用此类。例如,在 Global.asax 文件中:
protected void Session_Start(object sender, EventArgs e)
{
// Adds user to session state.
Session.Add(
"SK_SessionKey",
new FirstSession());
}
我意识到在使用 SQLServer 会话状态时,以这种方式将对象添加到会话时,给定的类必须是可序列化的,但为了简单起见,我省略了该部分。
这两个应用程序中的每一个都定义了自己的一组需要存储在会话中的值,但它们也具有大量共同的值(例如,用户 ID 和身份验证标志)。现在,这两个应用程序需要单点登录功能。因此,由于我们使用 SQLServer 会话状态,我的想法是使用会话状态本身在两个应用程序之间进行身份验证。
我做了什么:我创建了一个第三个程序集,其中包含一个会话类,该类提供了将在应用程序之间使用的公共数据值(例如用户 ID 等)。然后,我将程序集分发给这两个应用程序,这两个应用程序需要向其会话对象添加其他属性。因此,每个应用程序都实现了一个会话类,该会话类派生自外部程序集中包含的基会话类。
我希望,由于两个派生类都基于相同的基类(两个应用程序都可以访问),因此,例如,当从第一个应用程序重定向到第二个应用程序时,第二个应用程序可以查找会话对象,并且在找到第一个应用程序的会话对象时,可以将其转换为基类, 提取值,创建并初始化其自己的会话对象,然后将其序列化回会话。
我尝试使用 ISerializable 来管理进出服务器的序列化,但它不能仅通过使用序列化信息来工作。我应该怎么做?我应该序列化为 XML 还是二进制?二进制甚至适用于基/派生类吗?是否有我应该研究的某个框架类?(二进制格式化程序?我使用基类的想法是否存在根本性错误?
=编辑=
我最终使用了 XML 序列化,如此处所述。
应用程序存储库的基础上。这两个应用程序都有自己的存储库,无论它们是否共享某些代码,它们都不知道另一个存在。
有几种方法可以实现这一点。有一些产品允许多个应用程序共享会话状态,但这可能会导致其自身的后勤问题。我不推荐这种方法。
正确的方法是不要有共同的代码,而要有一个共同的存储库 - 即两个应用程序都有自己的会话,但还有第三个数据库,两个应用程序都可以访问。App1 可以使用唯一键将对象写入第三个数据库,通过查询字符串或其他方式将键传递给 App2,App2 可以返回到此公共数据库并通过同一键检索数据。
我认为有两个问题:
- 2 个应用程序是否可以共享 ASP.Net SQL 会话状态?答案:默认情况下不是 - 在 Rex M 的答案中涵盖。
- 如果有 3 个类 SharedASsembly.Base, Assembly1.Derived1:Base, Assembly2.Derived2:Base 可以在 Assembly2 中编码反序列化 Derived1 而不加载 Assembly1?答:不可以。您将能够在 3 个程序集中的任何一个中反序列化 Base,但要反序列化派生类,您需要加载相应的程序集。