第二次打开浏览器时保留会话值

时间:2014-03-21 04:53:12

标签: asp.net session-cookies

首次登录asp.net应用程序,存储一些会话值

  Eg: Session["Test"]="Saving Sesison";

退出应用程序

第二次打开浏览器时,需要保留相同的会话值。

  Eg: Session["Test"]="Saving Sesison";

我怎么能这样做,任何人都可以帮我解决一些进一步的问题。

if (!Page.IsPostBack)
{
  if (Session["Test"] == null)      
                {
                    Binding data to repeater control(with out filter)
                }
                else
                {
                    //Get Session value (To maintain session value across the browser)
                    var cookieSession = Request.Cookies["Test"];      //While opening   the browser for the 2nd time,this line is getting null for all the browsers,but session is getting value for firefox & Chrome not for IE { Session["Test"] }
                if (cookieSession != null &&!String.IsNullOrEmpty(cookieSession.Value))
                    {
                        Session["Test"] = cookieSession.Value;
                    }
                    Binding data to repeater control(with filter using session value)
                }

}

//On Drop down selection.

protected void Dropdown_SelectedIndexChanged(object sender, EventArgs e)
    {
       Binding data to repeater control(based on the dropdown selected value)

Session["Test"] = Dropdown.SelectedItem.Text.ToString(); //To maintain the Dropdown selection all over the app
       // Set it
       if (Session["Test"] == null)
       {
           Session["Test"] = Guid.NewGuid().ToString();
           var cookie = new HttpCookie("Test", (string)Session["Test"]);
           Response.Cookies.Add(cookie);
       }

    }

2 个答案:

答案 0 :(得分:0)

ASP.NET会话范围仅适用于特定会话。所以不可能拥有这种功能。

但是你可以以相同的方式使用Cache,它会存在,直到你使它为null或时间段超过。但请注意,它将存在于每个浏览器中。所以要么你需要使用不同的键(唯一键)而不是'test'

答案 1 :(得分:0)

您有几个选择。虽然在重新启动的浏览器之间会话应该是粘性的,假设它不是私密/隐身模式。如果您发现会话超时太快,可以在Web.config中扩展它

<system.web>
    <sessionState timeout="10080" mode="InProc" />
</system.web>

timeout在几分钟内。注意:如果您正在调试停止并启动调试器将重置您的会话。所以在IIS上重新部署应用程序也是如此。如果这对您来说是一个问题,您应该使用类似SQL会话状态提供程序的内容进行检查:http://msdn.microsoft.com/en-us/library/vstudio/h6bb9cz9(v=vs.100).aspx

处理此问题的另一种方法是在cookie中存储某种令牌(同样,仅当浏览器未处于隐身/私有模式且用户数据尚未刷新时才有效。)

// Set it
if (Session["Test"] == null)    
{
    Session["Test"] = Guid.NewGuid().ToString();     

    var cookie = new HttpCookie("Test", (string)Session["Test"]);
    Response.Cookies.Add(cookie);
}


// Get it
var cookieSession = Request.Cookies["Test"];

if (cookieSession != null && !String.IsNullOrEmpty(cookieSession.Value))
{
    Session["Test"] = cookieSession.Value;
}

作为使用SQL会话状态提供程序的注释,虽然是更持久的存储之一,但可能存在一些严重的开销要求。很容易收集正在跟踪的几场演出。

根据我的经验,如果您需要确定某些内容符合网站上的用户体验,那么Cookie和会话提供商的组合似乎效果最佳。

修改

因此,您的下拉选择保护程序的问题是它总是错误的,不应该设置cookie。

protected void Dropdown_SelectedIndexChanged(object sender, EventArgs e)
{
    //Binding data to repeater control(based on the dropdown selected value)

    // add to Session
    Session["Test"] = Dropdown.SelectedItem.Text.ToString(); 

    // Add Cookie
    var cookie = new HttpCookie("Test", (string)Session["Test"]);
    Response.Cookies.Add(cookie);
}

现在要恢复数据,在尝试访问Session["Test"]

之前,将此代码放入操作/控制器中以运行
var cookieSession = Request.Cookies["Test"];

if (cookieSession != null && !String.IsNullOrEmpty(cookieSession.Value))
{
    Session["Test"] = cookieSession.Value; // Should contain the selected text from the drop down
}