在ASP与ASP.NET之间共享对话状态(1)

asp.net

[前言:]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页中的对话状态是可以访问的。Web请求完成后,如果请求终止,对话数据将保存回SQL Server(见图1)。

图1.数据流简单图

  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(coo

时间: 2024-09-10 20:28:19

在ASP与ASP.NET之间共享对话状态(1)的相关文章

在ASP与ASP.NET之间共享对话状态

asp.net [前言:]ASP.NET是微软提供的最新的开发基于Web的应用程序的技术.它提供了大量的比传统ASP脚本技术的好处,包括: 1)通过把UI表现层(presentation)与商业逻辑(business logic)分开建立了更好的开发结构: 2)使用完全编译的代码代替了传统ASP的代码翻译: 3)它编译特性与每个支持的方法协同,这意味着使用ASP.NET的站点比使用传统的ASP站点的性能更高. 尽管把存在的ASP应用程序转换到ASP.NET有很多潜在的好处,也有些ASP应用程序任

在ASP与ASP.NET之间共享对话状态(2)

asp.net ASP实现 原来的ASP对话只能将对话数据保存在内存中.为了将对话数据保存到SQL Server,需要写一个自定义的Visual Basic 6.0 COM对象代替现在的对话对象来管理对话状态.该COM对象在每个Web请求开始时被初始化,并从SQL Server重新载入对话数据.ASP脚本完成时,该对象将终止并把对话状态将返回到SQL Server.Visual Basic 6 COM Session对象的主要目的是提供对微软Internet信息服务器(IIS)内部对象的访问.V

如何实现Asp与Asp.Net共享Session

asp.net|session 微软.net中,Session的存储机制已经与Asp的存储机制不一样,虽然可以在同一个IIS下同时运行asp与aspx,但是它们之间不能传递Session.之前大批系统应用到了asp,在升级过程中,如果完全抛弃asp来重写,一来工作量太大,二来以前的成果不能保存下来. 所以微软提出了一个Session共享的解决方案,只是此文档光说明原理,并没有说具体的操作步骤,由此,我撰文描述过程. 简单说明原理,asp与asp.net之间的Session统一存储在数据库中来实现

实现Asp与Asp.Net共享Session的方法_实用技巧

<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/46860.html" frameborder="0" width="468" scrolling="no" height="60"></iframe> 在.ne

应用技巧:ASP和ASP.Net共享Session解决办法

asp.net|session|技巧|解决 在原有的asp程序中用asp.net添加功能模块,共享SESSIONs是一个难点,下面介绍一种较为简洁的方法,可以在asp和asp.net中共享session会话. 登录页面使用C#重新创建,在成功登录后执行语句: Response.Write("<script language='javascript'>window.open('ASPXTOASP.aspx','new');</script>"); 打开aspxto

asp和asp.net共享session解决办法

asp.net|session|解决 在原有的asp程序中用asp.net添加功能模块,共享SESSIONs是一个难点,下面介绍一种较为简洁的方法,可以在asp和asp.net中共享session会话. 登录页面使用C#重新创建,在成功登录后执行语句: Response.Write("<script language='javascript'>window.open('ASPXTOASP.aspx','new');</script>"); 打开aspxtoasp

asp.net和silverlight之间的联系。

问题描述 asp.net和silverlight之间的联系. 我是学asp.net的,现在有份工作在试岗期,要求我用silverlight做一个项目,大概就是增删改查这四个基本功能,但是我完全不会silverlight,有经验的朋友们给我分析分析这公司有要我的意思么?面试的时候说的很清楚,他也没问silverlight这方面的.还有两天时间做这个,在线等 如果能做要学习什么资料能速成(能做出增删改查) 解决方案 http://www.cnblogs.com/Terrylee/archive/20

asp.net实现访问局域网共享目录下文件的解决方法_实用技巧

本文以实例讲述了asp.net实现访问局域网共享目录下文件的解决方法,完整代码如下所示: using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls;

asp 与 asp.net 共享session

这是一个老话题了,因为最近用的到,所以没办法又到处找资料.微软的网站上提供的是用数据库实现的,总觉得太麻烦,也有说直接使用的,但我没有试成功.我认为直接使用是不可能的.还有一种方法,就是通过几个页面转换,我使用的也是这个方法,通过总结搜索到的资料,整理后编写了几个页面来转换.主要是通过隐藏的input来实现的.具体方法如下: asp 转 asp.net 页面: 用一个asp页,把session信息写到input中,提交给asp.net页 trans.asp <% ''----------测试数据