今天我不得不将我的项目从Default inProc“升级”到SQLServer会话状态。当我完成转换时,我的代码中的一个方法停止正常工作。它是一个调用静态List var的方法,首先是count,然后是value,它在每个页面上调用它(Master页面的一部分)。到目前为止,它工作得很好,输出值和持久性,但现在,在登录并设置会话状态变量后不久,静态变量将被删除,我得到空指针异常。
由于他们在他们自己的班级中,我设法找到了一个解决方案,将他们移动到他们被调用的页面,但最初可能会导致这个问题。
总而言之,静态列表字符串变量在创建之后不久就会被删除和清空(与以前完全正常工作相反),这与我实现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 :(得分:1)
这是非常错误的。静态类成员由进程中的所有线程共享。您可能同时为不同的用户(并行线程)多次调用dbc.StoredProcedureTOReturnTabsNames
,[重新]多次分配listLbl
和listHead
。
listLbl
和listHead
的内容是否取决于CheckUser.user_id
和CheckUser.user_access
?这两个是静态的吗?