2011-12-21 94 views
3

我正在编写一个需要从数据库访问数据并将其显示给用户以查看和编辑的ASP.NET C#网站。它访问的具体数据取决于登录的用户,我需要多个用户同时使用该站点,同时查看和编辑不同的数据。我偶然发现了会话状态的概念,经过大量的阅读并没有那么多的理解。我遇到了一个问题。会话状态变量不起作用

在我的默认页,我这样做是为了创建一个会话变量:

Session.Add("UserData",userdata); 

我也试过这样:

Session["UserData"] = userdata; 

然后在后面的页面,我这样做是为了尽量叫它:

object myobject = Session["UserData"]; 

这给我一个错误,说Session["UserData"]未设置为一个OBJE的实例克拉。这是每个人似乎都在使用的方法,有什么我失踪?

我的站点在IIS上配置为将会话状态模式设置为“正在处理”,但大多数人似乎都使用其web.config文件手动设置了此项。但是,当我尝试在web.config文件中执行此操作时,我总是会遇到“无法识别的配置节”。我的编译器不知道这是什么:

<sessionstate mode="inproc"/> 

编辑,更详细的代码:

MyClass userdata = new MyClass(); 
userdata.name = "myname"; 
userdata.number = 5; 

Session["UserData"] = userdata; 

后...

MyClass mydata = (MyClass)(Session["UserData"]); 

这将返回错误会话[“的UserData “] 一片空白。

+0

你在哪里初始化userdata?你打电话时是否可能为空? – 2011-12-21 20:38:43

+0

你有Session [“UserData”] = userdata; ,你在哪里分配用户数据,你可以粘贴代码,以便我们可以看到。 Session [“UserData”]应该工作,或者我应该说有一个值,如果您正确地分配它.. – MethodMan 2011-12-21 20:39:05

+0

“用户数据”是psuedo代码在这里,我100%确定此变量包含数据之前我调用任何此代码。 – Andrew 2011-12-21 20:40:22

回答

5

事实上,你不能在web.config中设置会话模式是一个红旗,对我来说是一个奇怪的和臭的事情。所以...

  1. 检查会话模式是否在web.config的system.web元素下,否则它将无效。

  2. 检查是否在Web中enableSessionState未设置为false。配置或页面指令

  3. 尝试排除IIS。如果可能,请将您的网站转换为网络应用程序,并通过Visual Studio运行,以便从它自己的内置Web服务器开始。然后会发生什么?会话状态恢复吗?

  4. 它不应该有所作为,但如果你没有在Page_Load中做测试,那么就试试它 - 以防万一你在某些不寻常的地方进行这些测试。

无论答案是什么,当我们知道这将是头痛的明显。我非常期待知道它是什么。祝你好运

+1

我确实已经使用侧面脚本设置了我的测试,这让我很惊讶,但是一旦将它移动到Page_Load中,它就可以工作得很好。不确定那是关于什么的。 – Andrew 2012-01-10 22:34:58

0
var sessionData = Session["data"]; 
0

我会寻找到Session.ClearSession.Abandon任何电话,看看你的会话被清除这两个动作之间。

你也可以连接到Session_End事件,看看它是否会在两次调用之间的某个时间点击。

0

如果你有 Session.Add("UserData",userdata); 要检查你需要投用(string)的对象,如值这个

string userdata= (string)(Session["UserData"]); 

然后你可以运行一个检查,看看 if(string.IsNullOrEmpty(userdata)) 但不知道如何你正在初始化和分配一个值给用户数据

0

是否抱怨您的myobject为空或Session为空?当你试图从什么类的方法中检索你正在做的这个值时?

还有一个问题 - 你试图在并行线程中访问它吗?

0

会话变量可以很好地管理网站上的多个用户,但要初始化它们,您应该在Web应用程序中使用Global.asax文件。该文件有两个专门用于会话变量Session_Start和Session_End的方法。要初始化会话变量你可以使用代码喜欢在Global.asax中的以下内容:

void Session_Start(object sender, EventArgs e) 
{ 
    // initialize session variable   
    Session["MySessionVar"] = 1; 
} 

你也可能要投你的会话变量的值,如果你是在它做操作,比如+,例如,如果您有一个会话变量持有一个整数值,你可能需要做类似如下:

Session["MySessionVar"] = ((int) Session["MySessionVar]) + 1; 

此外,如果您尝试使用您的会话变量一样的Page_Load或其他方法的方法之外,喜欢尝试使用它作为C#代码后面的System.Web.UI.Page类的一个属性,这可能不起作用,您只能在方法中使用会话变量。