zoukankan      html  css  js  c++  java
  • Asp.Net进程外Session(状态服务器Session、数据库Session)

    介绍

    我们知道,当浏览器关闭,或者网站重启的时候,会话就结束了。即Seesion就丢失了。(当Web.config配置文件改动,哪怕什么内容都不加,仅仅往配置文件中加一个空格都是改we.config变配置文件,改变配置文件网站就会重启。网站重启进程内的Session就会丢失,而进程外的Seeion不会丢失)

    注意:我们知道Cookie与Session的关系。 Cookie里保存的是SessionID  保存SessionID的这个Cookie是一个会话Cookie,会话Cookie一般就保存在本地浏览器进程的内存当中,只要当浏览器关闭,Cookie就消失了。

    所有当浏览器关闭的时候,Cookie中保存的SessionID就消失了。而服务器里对应的Session还是存在的。

    但是当浏览器没有关闭,。但是网站重启的情况下,即服务端的Session消失了(但是浏览器端Cookie里保存的SeesinID还在)

    当一个网站的访问量很大的时候,很容易就将服务端的Session充爆了(因为Sssion只占用那么一小块内存)当Session被充爆后,它就会重启Session池。重启Session池的后果就是所有的Session全部丢失。 所有当浏览器带着一个保存了SessionID的Cookie请求服务器的时候,服务器端又找不到对应的Session,就会报错【“/”应用程序中的服务器错误。未将对象引用设置到对象的实例。】

    所以,为了防止,服务端Seesion被充爆,导致Session丢失。我们就想到将Session保存到网站的进程之外。于是就有了出网站进程内的Session外的另外两种Session.

    进程外Session分为以下两种:

    1,状态服务器Session  (比网站进程内的Session慢一点。但是比占用的内存比进程内的Seesion大一点。比数据库Session快很多,但是毕竟是内存,所以也是容易被充爆的)

    2,数据库Session  (磁盘读写比内存速度慢,需要频繁打开ADO.NET的连接速度也慢,好处是空间无限大,所以比较稳定,推荐使用)

    状态服务器Session的配置

    首先开启一个ASP.NET 状态设置的服务

    即:在 “我的电脑” 鼠标右键--->管理--->服务和应用程序----> 服务--->ASP.NET状态服务(或者ASP.NET State Service)--->点击右键选择“启动”

    启动ASP.NET状态服务后,然后再Web.config配置文件中添加<sessionState>这个节点内容

    <?xml version="1.0" encoding="utf-8"?>
     
    <!--
      有关如何配置 ASP.NET 应用程序的详细信息,请访问
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
     
    <configuration>
        <system.web>
          <compilation debug="true" targetFramework="4.5" />
          <httpRuntime targetFramework="4.5" />
          <!--状态服务器Session的配置    :添加这一段代码-->
          <sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState>       
        </system.web>
          
    </configuration>

    这样进程外Session就配置好了

    怎么测试是否已经配置好了呢?

    下面有一个关于用户登陆的例子: ---------------------------------下面我们来看看这个例子:

    Login.aspx文件

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="进程外Session.Login" %>
     
    <!DOCTYPE html>
     
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server" method="post">
        <div>
            <asp:Label ID="Label1" runat="server" Text="用户名:"></asp:Label><asp:TextBox ID="txtUserName" runat="server"></asp:TextBox>
            <asp:Label ID="Label2" runat="server" Text="密码:"></asp:Label><asp:TextBox ID="txtPassword" runat="server"></asp:TextBox>
            <input type="submit" value="提交" />
     
        </div>
        </form>
    </body>
    </html>

    Login.aspx.cs文件

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
     
    namespace 进程外Session
    {
        public partial class Login : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if(Request.HttpMethod.ToLower()=="post")
                {
                    string userName = this.txtUserName.Text.Trim();
                    string password = this.txtPassword.Text.Trim();
                    if (userName == "abc" && password == "123456")
                    {
                        Session["userName"] = userName;
                        Response.Redirect("News.aspx");
                    }
                    else
                    {
                        Response.Write("<script> alert('登陆失败!')</script>");
                    }
                }           
            }
        }
    }


    登陆成功跳转的页面:News.aspx页面

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="News.aspx.cs" Inherits="进程外Session.News" %>
     
    <!DOCTYPE html>
     
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
         欢迎:<%=Session["userName"].ToString() %> 登陆。
        </div>
        </form>
    </body>
    </html>

    Web.config 文件

    <?xml version="1.0" encoding="utf-8"?>
     
    <!--
      有关如何配置 ASP.NET 应用程序的详细信息,请访问
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
     
    <configuration>
        <system.web>
          <compilation debug="true" targetFramework="4.5" />
          <httpRuntime targetFramework="4.5" />
          <!--状态服务器Session添加这一段代码-->
          <sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState>       
        </system.web>
          
    </configuration>

    首先我们来浏览一下这个Login.aspx这个网页

    在Login.aspx文件上右键点击在浏览器中查看

    点击“提交”  

    此时已经证明Session已经保存好了的。但是我们怎么证明这个Session是进程外的Session还是进程内的Session呢?

    我们知道,当浏览器关闭,或者网站重启的时候,会话就结束了。即Seesion就丢失了。(当Web.config配置文件改动,哪怕什么内容都不加,仅仅往配置文件中加一个空格都是改we.config变配置文件,改变配置文件网站就会重启。网站重启Session就会丢失)

    注意:我们知道Cookie与Session的关系。 Cookie里保存的是SessionID  保存SessionID的这个Cookie是一个会话Cookie,会话Cookie一般就保存在本地浏览器进程的内存当中,只要当浏览器关闭,Cookie就消失了。

    所有当浏览器关闭的时候,Cookie中保存的SessionID就消失了。而服务器里对应的Session还是存在的。

    但是当浏览器没有关闭,。但是网站重启的情况下,即服务端的Session消失了,但是浏览器端Cookie里保存的SeesinID还在

    当一个网站的访问量很大的时候,很容易就将服务端的Session充爆了(因为Sssion只占用那么一小块内存)当Session被充爆后,它就会重启Session池。重启Session池的后果就是所有的Session全部丢失。 所有当浏览器带着一个保存了SessionID的Cookie请求服务器的时候,服务器端又找不到对于的Session,就会报错““/”应用程序中的服务器错误。未将对象引用设置到对象的实例。”

    所以,为了防止,服务端Seesion被充爆,导致Session丢失。我们就想到将Session保存到网站的进程之外。于是就有了出网站进程内的Session外的另外两种Session.

    1,状态服务器Session

    2,数据库Session


    好了。当我们点击提交,页面跳转到Naws.aspx页面,页面成功显示了Session["userName"] 里保存的这个数据 abc

    这个网页我们别关闭,我们现在来改动一下Web.config,给Web.config配置文件随便加一个空格,目的是重启网站,然后点击保存 。保存这个Web.config配置文件。

    此时,我们再来刷新一下这个 刚刚跳转过来的 http://localhost:39756/News.aspx 页面 。我们会发现网站重启了。但是这个进程外的Seesion并没有消失,数据还在。

    这就说明这个Session是保存在进程外的。

    如果你不信,可以将配置文件中的这段 <sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState>  注释掉试试!

    数据库Session的配置

    怎么将Session记录到数据库中呢? 其实微软已经为我们设置好了。只要我们简单的配置一下就行了。

    当然也要在 “我的电脑” 鼠标右键--->管理--->服务和应用程序----> 服务--->ASP.NET状态服务(或者ASP.NET State Service)--->点击右键选择“启动”(杨中科说数据库Session的配置不需要启动ASP.NET状态服务器,我本人没测试过,暂时屏蔽这段话,老杨最大嘛)

    首先。我们进入C盘下的 Windows文件夹 下的Microsoft.Net文件夹下的Framework/Framework64文件夹下的v4.0.30319文件夹下:找到aspnet_regsql 文件。

    具体的路径是: C:WindowsMicrosoft.NETFramework64v4.0.30319

    然后:快捷键win+R调出cmd 命令窗口

    在cmd中进入C:WindowsMicrosoft.NETFramework64v4.0.30319文件夹下

    即:在cmd 命令中输入:cd C:WindowsMicrosoft.NETFramework64v4.0.30319

    然后执行 aspnet_regsql.exe -S wytMSSQLSERVER2008R -U sa -P 123456 -ssadd -sstype c -d zhangshangzu

    解释一下 aspnet_regsql.exe表示执行这个文件 ,-S  后接的参数为数据库服务器的名称或者IP地址;-U 表示SqlServer的登陆用户名是sa  ,-P 表示登陆密码是123456   最后面的zhangshangzu是数据库名,即:你要将Session保存到哪个数据库下。

    点击回车键后,直到执行完毕

    以上运行完毕后,我们打开SqlServer ,找到sales数据库。我们发现下面给我们自动生成了两个表

    我们在来配置Web.config配置文件
    <?xml version="1.0" encoding="utf-8"?>
     
    <!--
      有关如何配置 ASP.NET 应用程序的详细信息,请访问
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
     
    <configuration>
        <system.web>
          <compilation debug="true" targetFramework="4.5" />
          <httpRuntime targetFramework="4.5" />
          <!--进程外Session添加这一段代码-->
          <!--<sessionState stateConnectionString="tcpip=127.0.0.1:42424" mode="StateServer"></sessionState>-->
     
          <!--数据库Session配置文件-->
          <!--timeout是设置Session过期时间,这里设为1000分钟。如果不设置,则默认为20分钟-->
          <sessionState sqlConnectionString="server=.;database=sales;uid=sa;pwd=123456" allowCustomSqlDatabase="true" mode="SQLServer" timeout="1000"></sessionState>
        </system.web>
                
    </configuration>
    然后我们浏览上面那个登陆的例子的Login.aspx文件
    填上用户名:abc 密码:123456 后,就跳转到了http://localhost:39756/News.aspx 文件
    此时证明Session["userName"] 的值abc已经写入Session了。
    我们在打开SqlServer  在sales 数据库下找到ASPStateTempSessions 表
    查询所有数据

    发现Session已经写入到数据库表中了。
     
  • 相关阅读:
    ActiveMQ 即时通讯服务 浅析
    Asp.net Mvc (Filter及其执行顺序)
    ActiveMQ基本介绍
    ActiveMQ持久化消息的三种方式
    Windows Azure Virtual Machine (27) 使用psping工具,测试Azure VM网络连通性
    Azure China (10) 使用Azure China SAS Token
    Windows Azure Affinity Groups (3) 修改虚拟网络地缘组(Affinity Group)的配置
    Windows Azure Storage (22) Azure Storage如何支持多级目录
    Windows Azure Virtual Machine (26) 使用高级存储(SSD)和DS系列VM
    Azure Redis Cache (2) 创建和使用Azure Redis Cache
  • 原文地址:https://www.cnblogs.com/wyt007/p/9658481.html
Copyright © 2011-2022 走看看