zoukankan      html  css  js  c++  java
  • 【翻译】在使用进程外SessionState时,发生Session内容丢失事件

    原文:A case of lost session variables when using out of process session state

        近日某顾客遇到session问题,他如是描述:当SessionState是进程内时,运行正常;一旦切换到进程外,就会发生session内容丢失,web.config中的配置如下:

    <sessionState mode="StateServer" cookieless="UseCookies" stateConnectionString="tcpip=127.0.0.1:42424"/>

        仔细翻阅了客户发来的报告,发现并不是所有的Session变量都有这个问题,只是在Page_Error事件中设定的Sesion会有这个问题。当发生异常后,在Page_Error中保存错误信息,跳转到自定义错误处理页面(web.config中配置customErrors),读取先前保存的错误信息时什么也没取得。

    进程外与进程内有什么区别呢?

        进程内:session对象是被保存中进程的内存中, 当执行如下语句时 Session[“mySessionVar”] = “some value”,“some value”被立即写入Session变量中。

        而进程外呢(stateserver or sqlsessionstate) ,当前会话的所有Session变量都是在请求开始时从存储空间读入,在请求结束时才向存储空间反映Session值的变化。

        从请求开始到结束期间发生异常,请求会被终止,这样在此期间对Session变量的改变不会反映到存储区间,它依然是老样子。

    如何处理呢?

        在使用进程外SessionState时,当异常发生时,如何在错误处理页面取得先前保存的异常相关信息呢?你得在Page_Error中清空错误,并手动跳转到错误处理页面

    代码差不多是这个样子:

        protected void Page_Error(object sender, EventArgs e)
        {
            Session["ErrorPage"] = "Default2.aspx";
            Exception ex = Server.GetLastError();
            Session["ErrorMessage"] = ex.Message.ToString();
            Server.ClearError();
            Response.Redirect("~/ErrorPages/ErrorPage.aspx");
        }

       Server.ClearError()这句使得请求得以正常结束而非中止(aborted),这样先前Session["ErrorMessage"] = ex.Message.ToString()就可以反映到存储空间了。

  • 相关阅读:
    gcc编译器创建和使用静态库、动态库
    shared_ptr & unique_ptr & weak_ptr (C++11)
    MyString(重写String)
    Linux进程间通讯的几种方式的特点和优缺点,和适用场合
    按行N等分某个文件
    Hbase region 某个regionserver挂掉后的处理
    gentoo
    Hbase 常用shell命令
    网络爬虫速成指南(二)网页解析(基于算法)
    hbase 0.96 java 示例
  • 原文地址:https://www.cnblogs.com/wordmy/p/1513429.html
Copyright © 2011-2022 走看看