ASP.NET会话状态,序列化和继承

时间:2011-05-17 16:28:22

标签: c# asp.net session serialization inheritance

首先,一点背景。我有两个使用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.

2 个答案:

答案 0 :(得分:3)

会话存储在应用程序库中。这两个应用程序各自拥有自己的存储库,无论它们是否共享某些代码,它们都不知道另一个存在。

有几种方法可以实现这一点。有一些产品允许多个应用程序共享会话状态,但这可能会导致其自身的后勤问题。我不推荐这种方法。

正确的方法不是拥有通用代码,而是拥有一个共同的存储库 - 即两个应用程序都有自己的会话,但是还有第三个数据库这两个应用程序都可以访问。 App1可以使用唯一键将对象写入第三个数据库,通过查询字符串或其他内容将密钥传递给App2,App2可以返回此公共数据库并使用相同的密钥检索数据。

答案 1 :(得分:1)

我认为有两个问题:

  • 可以2个应用程序共享ASP.Net SQL会话状态吗? 答案:不是默认情况下 - Rex M的回答。
  • 如果有3个类SharedASsembly.Base,Assembly1.Derived1:Base,Assembly2.Derived2:Base可以在Assembly2中编码反序列化Derived1而不加载Assembly1吗? 回答:没有。您将能够在3个程序集中的任何一个中反序列化Base,但是要反序列化您需要加载相应程序集的派生类。