2015-03-31 65 views
0

今天,我不得不将我的项目从默认inProc“升级”为SQLServer会话状态。当我完成转换时,代码中的某个方法停止正常工作。它是一种调用静态List var的方法,首先调用count,然后调用值,并在每个页面(Master页面的一部分)上调用它。直到现在,它工作得很好,输出值和持久化,但现在,在登录并设置会话状态变量之后不久,静态变量将被擦除,并且我得到空指针异常。会话状态SQLServer删除asp.net中的静态变量

由于他们在他们自己的班级,我设法找到一个解决方案,通过将他们移动到他们被称为的页面,但首先可能会导致此问题。

总而言之,静态列表字符串变量在创建后不久就会被清除并清零(与以前完美无缺的工作相反),并且这与我实现SQLServer作为会话Staste(反之前使用inproc)相关。

谢谢。

编辑:

什么GetTabs(其中静态变量下的是)为:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

public class GetTabs 
{ 


    public static List<string> listLbl; 
    public static List<string> listHead; 
    public static string log_idd; 
    public static string accesss; 
    int i = 0; 

    DbConn dbc = new DbConn(); 


    public void ReturnTabs(int log_id, int access) 
    { 
     dbc.StoredProcedureTOReturnTabsNames(log_id, access, out listLbl, out listHead); 

    } 
    public void ReturnTabsMobile(int log_id, int access) 
    { 
     dbc.StoredProcedureTOReturnTabsNamesForMobiles(log_id, access, out listLbl, out listHead); 

    } 


} 

这被称为在另一个类GetTabs.listLbl [X] ... 现在我感动变量和该类的方法,并简单地删除了“GetTabs”。从我的其他方法。

即使这个类在某些方面不正确,它在我改变会话变量模式之前工作得很好。

EDIT2:其中,这两种方法绘制数据的数据库与我用于会话状态的数据库不同。

EDIT3:后我搬到我的静态变量调用的类,就像这样:

public class Functions : System.Web.UI.Page 
{ ... 
    public void method1(Panel pnn) 
{ 
    ReturnTabs(CheckUser.user_id, CheckUser.user_access); 
    int i = listLbl.Count; 
    for (int n = 0; n < i; n++) 
    { 
     LinkButton l = new LinkButton(); 
     Label lbl = new Label(); 
     l.ID = "lb" + n; 

     l.CommandArgument = n.ToString(); 
     l.Command += Do_Something; 



     lbl.Text = listLbl[n];// +" " + GetTabs.log_idd + " " + GetTabs.accesss; //GetTabs.listHead[n]; 
     Panel pnl = new Panel(); 

等,创建并放置在工作的程序生成的标题菜单按钮。

这就是所谓的onLoad在我的大师与主人面板。

+0

将您的变量更改为属性,并在setter中添加一个断点,条件为value == null。另外,你的静态变量标记为线程静态? – Guillaume 2015-03-31 14:55:00

+1

很神秘。静态类成员和会话或会话状态模式之间没有连接。我们不知道当Session切换到SQL Server时,您的代码会使静态变量[s]变为空。 – Igor 2015-03-31 14:55:16

+0

你会发布代码太多,你可以发布它最初是什么,你已经将代码更改为.. – MethodMan 2015-03-31 14:58:52

回答

1

这是非常错误的。静态类成员由进程中的所有线程共享。您可能同时多次为不同的用户拨打dbc.StoredProcedureTOReturnTabsNames(并行线程),[重新]分配listLbllistHead多次。

listLbllistHead的内容取决于CheckUser.user_idCheckUser.user_access?这两个是静态的吗?

+0

在每一页上--AnLoad和每个用户都非常多。那就解释了很多。我一定会避免使用这种方法。 – 2015-03-31 15:27:33

+0

是的,他们严重依赖他们(不同的访问级别有不同的标签显示)。是的,他们是静态的,但他们还没有以任何方式造成问题。 – 2015-04-01 12:15:45