• 进程外Session保存和全局文件错误捕获


     Session深入学习,进程外的Session

    当用户登入页面跳转时候,我们会将用户登录信息保存在服务端一个键值对的Session(Session池)中。那么Session池又是在哪里呢

    它最终默认存放的文件是一个叫做 aspnet_wp.exe的可执行程序中(做为一个辅助进程)。路径就在Framework/版本 下面。 它有一个缺点,容量有限!!

    一旦Session池满了,存的数据太多了,这个aspnet_wp.exe程序就会重启,Session就会丢失!(一个微软官方的bug,不可修复)

    什么叫服务呢

    其实就是一个可执行的exe程序,只是它没有界面操作而已。

    那怎么办呢

    解决方案

    1.进程外保存:

    再也不担心网站的重启或者关闭丢失Seesion 不要再用这个aspnet_wp.exe保存session了,我们使用专门保存session的状态服务程序 aspnet_state.exe,默认端口42424。

    此端口预留给Framework通信使用 。

    2.SqlServer数据库保存:

    不管是关闭网站重启网站,关闭状态服务都不会影响到Session的保存 将session存入aspnet数据库中。

    必要的消耗:通信消耗,数据必要的属性:可序列化

    Session是可设置保存位置的

    如何做到进程外保存Session 利用状态服务

    1.开启电脑状态服务 ASP.NET State Service

    2.配置web.config文件

    <system.web> 
    <sessionState mode=""> 
    </sessionState> 
    <!-- mode Custom 自定义| 
       Inpoc 进程内的(默认)|
       Off 关闭不使用Session |
       SQLServer SQL保存 |
       StateServer 进程外(浏览器不可以关,因为SessionId是保存在客户端浏览器缓存Cookie中的)
    --> <system.web>

    默认端口42424是可以根据注册表更改的

    HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParameters Port修改

    修改后 配置文件一定要同步

    <system.web> 
    <sessionState mode="StateServer" stateConnectionString = "tcpip=localhost:42424"> 
    </sessionState> 
    <system.web> 

    注意:如果需要将一个对象类保存在进程外的Session中,一定要标识这个类是可序列化的。[Serializable]

    利用SQL保存Session

    如果要使用 SQL 保存Session数据,首先要在Framework/v4.0.30319安装目录运行一个叫 aspnet_regsql.exe 的可运行程序。它是一个向导,它会自动在数据库创建一些必要的表。

    然后执行InstallSqlState.sql或者InstallSqlStateTemplate.Sql 有好多个,分为临时存储,和持久化存储自己选择,

    注意:需要使用SQLServerAgent服务--因为调度作业

    再然后

    配置web.config

    <!-- 配置Session --> 
    <system.web> <sessionState mode="SQLServer" > </sessionState> </system.web>

    保存在数据库 ASPState 中,里面有两张表 ASPStateTempApplicaions (两列 AppId,AppName),ASPStateTempSessions

    Global.asax 全局文件错误处理 

    //当网站第一次被请求的时候运行         
    void Application_Start(object sender, EventArgs e)         
    {         
            //一般在这个方法中 做一些网站全局 的配置读取及初始化     
    }        
     void Application_End(object sender, EventArgs e)     
    {         
            //  在应用程序关闭时运行的代码    
    }
    
    // 在出现未处理的错误时运行的代码     
    //一般可以用来做 错误日志     
    void Application_Error(object sender, EventArgs e)     
    {         
            HttpApplication app = sender as HttpApplication;         
            Exception ex = app.Context.Server.GetLastError();
            app.Context.Response.Redirect("06Err.aspx?err=" +app.Context.Server.UrlEncode(ex.Message));
            app.Context.Response.End();
            //app.Context.Response.Redirect("06Err.aspx");        
            //string logFile = app.Context.Server.MapPath("04Log.txt");         
            //System.IO.File.AppendAllText(logFile, ex.Message);     
    }
    
    void Session_Start(object sender, EventArgs e)     
    {        
             // 在新会话启动时运行的代码    
    }
    
    void Session_End(object sender, EventArgs e)     
    {        
            // 在会话结束时运行的代码。         
            // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为         
            // InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer         
            // 或 SQLServer,则不引发该事件。
    
        }       
  • 相关阅读:
    关于数据库的索引知识
    RESTful API设计相关
    Coroutine(协程)模式与线程
    Python网络编程中的服务器架构(负载均衡、单线程、多线程和同步、异步等)
    读懂diff
    Linux学习笔记——如何使用echo指令向文件写入内容
    ubuntu中执行定时任务crontab
    网络编程之异步IO,rabbitMQ笔记
    走进docker的世界之入门篇
    xml基础
  • 原文地址:https://www.cnblogs.com/Jolinson/p/3604512.html
Copyright © 2020-2023  润新知