2010-01-29 77 views
6

我的Web应用程序的用户可能有多个浏览器窗口(或选项卡)打开并指向相同的页面。我们使用的是基于Cookie的会话ID,用户通常会在两个浏览器/选项卡中的同一会话ID内工作。我希望能够唯一地标识哪个浏览器窗口(和标签)要求ASP.NET页面(为了确保存储在会话中的数据不会混淆)。在ASP.NET(服务器端)中,如何唯一标识一个浏览器窗口与另一个浏览器窗口在同一cookiedbased sessionId

(例如,我会很高兴,如果浏览器将生成并发送窗口/标签-ID与HTTP请求,因为它发布HTTP_USER_AGENT)

任何想法?

- 托马斯

回答

2

如果我要实现这样的事情,我可能会从Dictionary<Type, List<Guid>>开始,并将其存储在用户会话中。我也很可能使这是一个自定义的类型代表了字典和有工作原理类似

public Guid GeneratePageIdentifier(Page thepage) 
{ 
    var guid = Guid.New(); 

    if(_dictionary[thepage.GetType()] == null) 
     _dictionary[thepage.GetType()] = new List<Guid> { guid }; 
    else 
     ((List<Guid>)_dictionary[thepage.GetType()]).Add(guid); 

    return guid; 

} 

然后嵌入这是一个从页面的ViewState的那个方法返回的GUID的工厂方法。在你的页面上,执行你需要验证哪个页面的动作的方法能够验证guid是否在集合内部执行某些操作。你可能也想实现一个带有guid属性的自定义类型来保护更多关于你为什么这么做的信息,或者你需要什么来使其变得有意义。

2

每个页面上的视图状态会有所不同,也许你可以使用某种类型的每一页上创建的唯一标识符的装?

+1

然后,您可以使用此标识来存储下的活动会话的实际数据。这样,您就不会在那里获得任何(可能)敏感的数据,并且您的ViewState不会变得太大。 – Thorarin 2010-01-29 13:33:31

1

由于网络的无状态性,但是默认不可能,您可以添加一个“页面标识符”,该页面标识符在每个打开的页面中生成并针对每个操作传输。

我建议你以一种混淆不会发生的方式重构应用程序,不管从请求来自哪个页面/标签页/窗口。

1

正如Mark Redman所说,您可以使用Viewstate + Session来存储特定于页面的值。 ViewState适用于存储密钥(字符串),Session用于存储任何类型的复杂对象。

使用ViewState或隐藏字段为了在第一次调用GUID时加载。

public string PageUid 
    { 
     get 
     { 
      if (ViewState["UID"] == null) 
       ViewState.Add("UID", Guid.NewGuid().ToString()); 

      return ViewState["UID"].ToString(); 
     } 
    } 

然后使用会话获取/使用此键设置你的价值观:

string MyPagesessionVariable 
    { 
     get 
     { 
      if (Session["MYVAR" + PageUid] == null) 
      { 
       Session["MYVAR" + PageUid] = "VALUE NOT SHARED WITH OTHER TABS/WINDOWS"; 
      } 

      return Session["MYVAR" + PageUid]; 
     } 

     set 
     { 
      Session["MYVAR" + PageUid] = value; 
     } 
    } 
相关问题