十三水半小

极光下载站十三水半小 - 挨制完整的绿色硬件故乡

极光下载站

以后职位: 三水半小 技术开支 ASP专区 正正在ASP与ASP.NET之间共享对话中形(1)

正正在ASP与ASP.NET之间共享对话中形(1)

工妇:2004/6/16 14:43:00 做者:佚名 人气:170

[前止:]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;
 mySession Session = null;

 try
 {
  LoadCmd.Parameters.Add("@ID", new Guid(key));
  conn.Open();
  reader = LoadCmd.ExecuteReader();
  if (reader.Read())
  {
   DateTime LastAccessed =reader.GetDateTime(1).AddMinutes(SessionExpiration);
   if (LastAccessed >= DateTime.Now)
    Session = Deserialize((Byte[])reader["Data"]);
  }
 }
 finally
 {
  if (reader != null)
   reader.Close();
  if (conn != null)
   conn.Close();
 }

 return Session;
}
private mySession Deserialize(Byte[] state)
{
 if (state == null) return null;

 mySession Session = null;
 Stream stream = null;

 try
 {
  stream = new MemoryStream();
  stream.Write(state, 0, state.Length);
  stream.Position = 0;
  IFormatter formatter = new BinaryFormatter();
  Session = (mySession)formatter.Deserialize(stream);
 }
 finally
 {
  if (stream != null)
   stream.Close();
 }
 return Session;
}


  正正在乞请的开端,Page类的Unload事情被启动了,一个同Unload事情一同注册的事情处理办法将串止化对话数据为两进制格式并将结果两进制数据存进SQL Server。


private void PersistSession(Object obj, System.EventArgs arg)
{ sessionPersistence.SaveSession(
  Server.UrlDecode(cookie.Value).ToLower().Trim(), dsn, Session, IsNewSession);
}
public void SaveSession(string key, string dsn,
mySession Session, bool IsNewSession)
{
 SqlConnection conn = new SqlConnection(dsn);
 SqlCommand SaveCmd = new SqlCommand();
 SaveCmd.Connection = conn;

 try
 {
  if (IsNewSession)
   SaveCmd.CommandText = InsertStatement;
  else
   SaveCmd.CommandText = UpdateStatement;

  SaveCmd.Parameters.Add("@ID", new Guid(key));
  SaveCmd.Parameters.Add("@Data", Serialize(Session));
  SaveCmd.Parameters.Add("@LastAccessed", DateTime.Now.ToString());

  conn.Open();
  SaveCmd.ExecuteNonQuery();
 }
 finally
 {
  if (conn != null)
   conn.Close();
 }
}
private Byte[] Serialize(mySession Session)
{
 if (Session == null) return null;

 Stream stream = null;
 Byte[] state = null;

 try
 {
  IFormatter formatter = new BinaryFormatter();
  stream = new MemoryStream();
  formatter.Serialize(stream, Session);
  state = new Byte[stream.Length];
  stream.Position = 0;
  stream.Read(state, 0, (int)stream.Length);
  stream.Close();
 }
 finally
 {
  if (stream != null)
   stream.Close();
 }
 return state;
}



  SessionPage类战与它相闭的类被启拆正正在SessionUtility组件中。正正在一个新ASP.NET项目中,需供做SessionUtility组件的援用,为了与传统的ASP代码共享对话,每个页里由SessionPage交流Page类衍逝世出来。一旦移植完成了,新操做法式能经过历程分析SessionPage类中界讲的对话变量切换回操做本去的HttpSession工具去隐现根柢的HttpSession。
标签
分享到:

公众号

document.write ('