【发布时间】:2011-05-17 16:28:21
【问题描述】:
首先,有一点背景。我有两个使用 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 来管理与服务器之间的序列化,但仅使用 SerializationInfo 并不能正常工作。我该怎么做呢?我应该序列化为 XML 还是二进制?二进制文件甚至可以与基类/派生类一起使用吗?我应该研究某个框架类吗? (BinaryFormatter?)我使用基类的想法有什么根本错误吗?
=编辑=
我最终使用了 XML 序列化,如 explained here.
【问题讨论】:
标签: c# asp.net session serialization inheritance