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已经写入到数据库表中了。
     
  • 相关阅读:
    myBatis学习笔记(10)——使用拦截器实现分页查询
    电影院的设计与实现(改进更新)
    软件设计师自我修炼1:怎样让用户对软件产生依赖
    jQuery.ajax()方法中參数具体解析
    王立平--Gallery:实现图片的左右滑动
    USB设备驱动概述
    Android中的多线程编程(一)附源代码
    Shannon-Fano-Elias编码的C语言实现
    互联网协议入门深入
    linux内核中创建线程方法【转】
  • 原文地址:https://www.cnblogs.com/wyt007/p/9658481.html
Copyright © 2011-2022 走看看