【问题标题】:Session State SQLServer deleting static variables in asp.net会话状态 SQLServer 删除 asp.net 中的静态变量
【发布时间】:2015-03-31 23:22:42
【问题描述】:

今天我不得不将我的项目从默认 inProc 升级到 SQLServer 会话状态。当我完成转换时,我的代码中的一种方法停止了正常工作。它是一个调用静态列表变量的方法,首先是计数,然后是值,它在每个页面(母版页的一部分)上调用它。到目前为止,它工作得非常好,输出值并保持不变,但现在,在登录并设置会话状态变量后不久,静态变量将被删除,我得到空指针异常。

由于他们在自己的班级,我设法找到了解决方案,将他们移动到他们被调用的页面,但首先可能是什么导致了这个问题。

总而言之,静态 List 字符串变量在创建后不久就会被删除并清空(与之前完全正常工作相反),这与我将 SQLServer 实现为会话状态有关(与之前使用 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:这两种方法绘制数据的DataBase与我用于Session State的不同。

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();

以此类推,创建并放置作为以编程方式生成的标题菜单的按钮。

在我的 Master 中使用来自 Master 的面板调用 onLoad。

【问题讨论】:

  • 将变量更改为属性,并在设置器中添加断点,条件为 value == null。另外,您的静态变量是否标记为线程静态?
  • 相当神秘。静态类成员与 Session 或 Session 状态模式之间没有联系。我们不知道当 Session 切换到 SQL Server 时,您的代码做了什么使静态变量 [s] 变为空。
  • 您发布代码会不会太多,您可以发布它最初的内容与您将代码更改为的内容吗..
  • @Igor 我知道,在我的代码中,我什至没有接近将变量归零。 MethodMan 请在上面找到。
  • 什么代码调用ReturnTabs

标签: c# asp.net sql-server


【解决方案1】:

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

listLbllistHead 的内容是否依赖于 CheckUser.user_idCheckUser.user_access?这两个是另一对静电吗?

【讨论】:

  • 几乎在每个页面上 - OnLoad 和每个用户。这说明了很多。我肯定会放弃使用这种方法。
  • 是的,他们确实非常依赖它们(不同的访问级别有不同的选项卡要显示)。是的,它们是静态的,但它们还没有以任何方式引起问题。
猜你喜欢
  • 1970-01-01
  • 2013-02-19
  • 2010-11-29
  • 2013-01-26
  • 2012-03-18
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多