您当时的方位:主页 > 言语编程 > ASP.NET

在ASP与ASP.NET之间同享对话状况(1)

2014-10-28  
[前语:]ASP.NET是微软供给的最新的开发根据Web的应用程序的技能。它供给了许多的比传统ASP脚本技能的优点,包括:

  1)经过把UI体现层(presentation)与商业逻辑(business logic)分隔树立了更好的开发结构;

  2)运用彻底编译的代码替代了传统ASP的代码翻译;

  3)它编译特性与每个支撑的办法协同,这意味着运用ASP.NET的站点比运用传统的ASP站点的功能更高。

  虽然把存在的ASP应用程序转化到ASP.NET有许多潜在的优点,也有些ASP应用程序使命很重要而且杂乱。转化进程或许需求更多资源并给应用程序带来更多危险。处理这些问题的途径之一是一起运转ASP和ASP.NET应用程序,在一个时间将一个对话转化为ASP.NET。为了一起运转新旧程序,需求树立一个机制在传统的ASP与ASP.NET间同享对话状况。本文评论的是怎样运用.NET结构组件的类和序列化特性同享状况信息。

  概述

  Cookie是Web应用程序辨认用户对话的最常用的办法,能够用于辨认传统的ASP和ASP.NET对话状况。在ASP脚本中状况信息保存在内存中,不能与其它应用程序(例如ASP.NET)同享。假如对话状况运用通用格局保存在微软SQL Server中,它就能够被传统的ASP和ASP.NET一起拜访。

  在本例中,名为mySession的Cookie用于辨认用户对话。当用户对Web应用程序作出恳求时,将为该用户发生仅有的Cookie用于辨认对话。在随后的恳求中,浏览器将该仅有的Cookie发送回服务器用来辨认对话。在被恳求的Web页载入前,一个自界说目标将运用该仅有的Cookie从SQL Server中从头载入用户对话数据。经过自界说目标Web页中的对话状况是能够拜访的。

 ASP.NET完成

  在ASP.NET中每一个Web页都衍生自System.Web.UI.Page类。Page类调集了HttpSession目标的一个实例用于处理对话数据。在本例中,叫做SessionPage的自界说Page类来衍生自System.Web.UI.Page,供给了相似Page类的一切特性。仅有的区别是默许的HttpSession运用自界说的对话目标重载了(对实例变量运用new修正符,C#答应衍生的类躲藏基类的成员)。


public class SessionPage : System.Web.UI.Page
{
 ...
 public new mySession Session = null;
 ...
}

  自界说的对话类运用HybridDictionary目标来相应保存内存中的对话状况(HybridDictionary可用于处理恣意数量的对话元素)。为了与传统的ASP通用,该自界说对话目标将约束对话数据类型为字符串型(默许的HttpSession答应对话保存恣意类型的数据,不能与传统的ASP通用)。


[Serializable]
public class mySession
{
 private HybridDictionary dic = new HybridDictionary();

 public mySession()
 {
 }

 public string this [string name]
 {
  get
  {
   return (string)dic[name.ToLower()];
  }
  set
  {
   dic[name.ToLower()] = value;
  }
 }
}


  Page类为定制暴露了不同的事情和办法。特别是OnInit办法用于设置Page目标的初始化状况。假如恳求不包括名为mySession的Cookie,将为恳求者发生一个新的mySession Cookie。别的,对话数据将运用自界说数据拜访目标SessionPersistence从SQL Server中检索出来。DSN和SessionExpiration的值从web.config中检索。


override protected void OnInit(EventArgs e)
{
 InitializeComponent();
 base.OnInit(e);
}
private void InitializeComponent()
{
 cookie = this.Request.Cookies[sessionPersistence.SessionID];

 if (cookie == null)
 {
  Session = new mySession();
  CreateNewSessionCookie();
  IsNewSession = true;
 }
 else
  Session = sessionPersistence.LoadSession(
    Server.UrlDecode(cookie.Value).ToLower().Trim(),
    dsn,
    SessionExpiration
   );

  this.Unload += new EventHandler(this.PersistSession);
}
private void CreateNewSessionCookie()
{
 cookie = new HttpCookie(sessionPersistence.SessionID,
 sessionPersistence.GenerateKey());
 this.Response.Cookies.Add(cookie);
}


  SessionPersistence类运用微软.NET结构组件的BinaryFormatter来串行化和并行化对话状况为二进制格局以供给最佳功能。成果的二进制对话数据接着作为图象字段类型被存入SQL Server。


public mySession LoadSession(string key, string dsn,
int SessionExpiration)
{
 SqlConnection conn = new SqlConnection(dsn);
 SqlCommand LoadCmd = new SqlCommand();
 LoadCmd.CommandText = command;
 LoadCmd.Connection = conn;
 SqlDataReader reader = null