我们在进行Web开发时经常会用到Session,用它去标识不同的会话,那么涉及到跨站点的时候如何实现Session共享呢?


通常的解决方案有:使用数据库、使用Cookies做中间桥等等。

下面介绍一种基于ASP.NET 2.0的,通过序列化和反序列化机制实现的一种解决方案。

首先看一下通常的服务器集群的网络拓扑结构:



利用序列化机制实现Session共享的原理:

1、Web Server 1的应用程序序列化Session信息为文本值(可以是Binary或Soap格式)

2、将序列化后的值写入文件,保存到File Server上

3、Web Server 2 对保存在File Server上的Session序列化后的值进行反序列化

4、在Web Server 2上重新构建Session值


下面我们来详细看看实现代码,分以下几个步骤:


1、创建一个类库工程:ShareSession

引入以下的命名空间:

Code


2、创建一个类:SessionEntity

代码如下:

Code


3、创建一个序列化、反序列化操作的类:ShareSessionFormatter

代码如下:

Code


4、编译项目,生成ShareSession.dll

5、把ShareSession.dll引入Web Server 1上的应用程序中,同时在Web.config文件中增加配置字节

代码如下:

<!-- Session信息序列化后保存路径 -->
        <add key="ShareSessionPath" value="C:\ShareSession\"/>


6、在Web Server 1上的应用程序中新建一个页面,功能是初始化Session,然后把Session信息序列化,代码如下:


前台代码:

<%...@ Page Language="C#" AutoEventWireup="true" CodeFile="ShareSession.aspx.cs" Inherits="Front_Test_ShareSession" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Session共享</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Label ID="lHttp_Cookie" runat="server" Text=""></asp:Label>
            <a href="http://localhost:5000/Front/Test/ShareSession.aspx?AUTH_GUID=<%=AUTH_GUID %>">Go Other Web Site(port:5000)</a>
        </div>
    </form>
</body>
</html>

后台代码:

Code



7、在Web Server 2上进行第5步操作

8、在Web Server 2上的应用程序中新建一个页面,功能是反序列化,还原Session,同时读取Session信息进行测试,代码如下:

前台代码:

Code


后台代码:

Code




此例子只是提供了一种解决思路,在应用过程中应根据项目不同进行调整及详细设计。
posted on 2008-09-02 15:12  睿达团队  阅读(833)  评论(0编辑  收藏  举报