项目快完成了,发现一个大BUG! 以前没考虑这个问题在一个类 Env 中有一个static int userid;记录当前登录的用户编号.发现如果有其它用户连上来后,原来的连接的用户标识也跟着变了.我怀疑是共同用了这一个数据成员.各位是如何解决这种问题的? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 static是保存在服务器端的静态变量/对象,没有附本..用session/cookie/viewstate都可以.建议产生一个cookie对象,记录用户重要信息.减少服务器负担. static int userid因为是static的,那就应该是在产生第一个类的实例时初始化了,所有类的实例时共享一个static变量的,这就是前面的id会随后面的变化的原因。用session或者做处理后放到url的参数中。 viewstate不可以,不能跨页面访问的! static 类型是应用程序级别的,就相当于一个Application可以是用Session不算是一个大的Bug 如想整个系统改的代码量少一些,可以这样:将static int userid;改为:int userid{ get{return int.Parse(session["userid"].ToString() );} set{session["userid"] = value;}}通过这种方式,我想系统的其他代码基本不需要改动,只需将session的释放时间长一些,基本上会没有问题。 static就是共用的吧,用session吧 放在 session里面 吧 静态变量 总不是太好 晕死了,你不知道Static是公享的吗???去掉了吧!不过你要改变一下访问方式了! 这个问题一个人在做开发的时候好像可以,不细想,其实要不得,还是感觉改Session的好。 三星的问这个问题不太合适吧?static的静态对象是这样的..没有实例的概念..你是内存里的一块.即使有再多的类实例产生,也共享这一个内存对象. 关键是我的userid 是保存在 另外一个工程(dll) 中的,有什么办法在dll 中取得当前session 标识呢? staitc 概念我了解.我本以为微软会把不同的session 用不同的环境隔开. 偶也觉得楼主不应该问这个问题偶是下面这么处理的,偶还想改成static的呢using System;namespace guestbook{ /// <summary> /// admin 的摘要说明。 /// </summary> public class admin:System.Web.UI.Page { public admin() { // // TODO: 在此处添加构造函数逻辑 // if ( Session["username"] != null && Session["username"].ToString() != "" ) { _username = Session["username"].ToString(); } } /// <summary> /// 登陆标志 /// </summary> private string _username; public string username { get { return _username; } set { } } public bool Login(string strUsername, string strPassword) { if (strUsername == "admin" && strPassword == "admin" ) { _username = strUsername; Session["username"] = strUsername; return true; } return false; } public bool IsLogin() { if ( Session["username"] != null && Session["username"].ToString() != "" ) { return true; } else { return false; } } public void Logout() { Session["username"] = null; } }} 楼主可以说具体一点,你的那个userid是用来标志用户身份的,在进程的整个生命周期都存在吗? 在一个 ClassLibrary 中有一个方法,如果在这个方法取取得调用这个方法的session(或进程吧) 标识? HttpContext.Current.Session()? static的问题HttpContext.Current.Session["userid"] 实际上项目是这样的.表示层 web winform mobile -------------------------------逻辑层1 ClassLibrary1 -------------------------------逻辑层2 ClassLibrary2 --------------------------------数据库在罗辑层1的实现 ClassLibrary1 中有一个类叫 Env 存储一些 登录用户信息我希望在代码中任何地方调用Env.CurUser 得到的都是调用发出者的用户标识如果在调用 Env时还要传一个参数类似 sessionID 等标识,太烦了. 你的那个类中的变量不是static会怎么样,实例化一个类,如果类的生命周期没有结束,它的那些共有成员应该是可以访问的啊! 如果不用 static 是可以,服务器存储所有登录用户标识,我可以用一个hash表,把 连接标识(对于web是 sessionid ) 和 登录环境(包括userid)记录进去.但有什么办法在所有想到用 "登录环境"的地方不需要显示指定 连接标识?我觉得asp.net 应做到让开发者不用考虑这个问题. HttpContext.Current.Session["userid"]写在ClassLibrary1中就不用每个页面都写了 ClassLibrary1中调用Session不是一个好方法 2个不用的session调用classlibrary 中的一个方法,在这个方法中没有办法找到调用者身份(或是不用的 thread id)? 哪位仁兄有空,帮帮兄弟:msnenjoylinux#hotmail.com# -> @ to zhanqiangz(闲云野鹤) :是地.因为操作中需要不存验证权限. 谢谢大家,特别是goody9807() ( 两星(中级)) 问题解决了,我就是想知道这个HttpContext.Current.Session 的东东.我只需在 Env.cs 中把原来的 static 改为对实例的调用, 再实现一个sessionid -- Env 对象的 map ,就能通过 env.SessionIDLocator -- 一个指向 web 中某 cs 的方法(HttpContext.Current.Session) 的代理对象.取得 env 对象.那我其它地方的代码只需要把 env. --> evn.currentEvn. 就行了. 为什么我的ImageHandler.ashx文件老是出现这个错误 MVC为什么要用HtmlHelper类? Repeater绑定数据后,对每一行的部分列进行中文显示 求:web项目开发文档和项目管理规范文档 asp.net,c#程序中的如何调试javascript程序段? 各位高手们,关于输出Excel到DataGrid中的问题(DataField) 软件开发方面问题 怎么获取IP地址 asp.net的初学者进来 再次请教怎样从 用循环动态生成的多个TextBox控件中 读取文本内容 请问怎么用c#程序设置iis,dns 为什么创建不了文件夹?
建议产生一个cookie对象,记录用户重要信息.减少服务器负担.
因为是static的,那就应该是在产生第一个类的实例时初始化了,所有类的实例时共享一个static变量的,这就是前面的id会随后面的变化的原因。用session或者做处理后放到url的参数中。
可以是用Session不算是一个大的Bug
将static int userid;改为:
int userid
{
get{return int.Parse(session["userid"].ToString() );}
set{session["userid"] = value;}
}通过这种方式,我想系统的其他代码基本不需要改动,只需将session的释放时间长一些,基本上会没有问题。
dll 中取得当前session 标识呢?
我本以为微软会把不同的session 用不同的环境隔开.
偶是下面这么处理的,偶还想改成static的呢using System;namespace guestbook
{
/// <summary>
/// admin 的摘要说明。
/// </summary>
public class admin:System.Web.UI.Page
{
public admin()
{
//
// TODO: 在此处添加构造函数逻辑
//
if ( Session["username"] != null && Session["username"].ToString() != "" )
{
_username = Session["username"].ToString();
}
} /// <summary>
/// 登陆标志
/// </summary>
private string _username; public string username
{
get
{
return _username;
}
set
{
}
} public bool Login(string strUsername, string strPassword)
{
if (strUsername == "admin" && strPassword == "admin" )
{
_username = strUsername;
Session["username"] = strUsername;
return true;
}
return false;
} public bool IsLogin()
{
if ( Session["username"] != null && Session["username"].ToString() != "" )
{
return true;
}
else
{
return false;
}
} public void Logout()
{
Session["username"] = null;
}
}
}
session(或进程吧) 标识?
HttpContext.Current.Session()?
HttpContext.Current.Session["userid"]
表示层 web winform mobile
-------------------------------
逻辑层1 ClassLibrary1
-------------------------------
逻辑层2 ClassLibrary2
--------------------------------
数据库在罗辑层1的实现 ClassLibrary1 中有一个类叫 Env 存储一些 登录用户信息
我希望在代码中任何地方调用Env.CurUser 得到的都是调用发出者的用户标识如果在调用 Env时还要传一个参数类似 sessionID 等标识,太烦了.
hash表,把 连接标识(对于web是 sessionid ) 和 登录环境(包括userid)记录进
去.但有什么办法在所有想到用 "登录环境"的地方不需要显示指定 连接标识?
我觉得asp.net 应做到让开发者不用考虑这个问题.
写在ClassLibrary1
中就不用每个页面都写了
中调用Session不是一个好方法
msn
enjoylinux#hotmail.com
# -> @
是地.因为操作中需要不存验证权限.
HttpContext.Current.Session 的东东.我只需在 Env.cs 中把原来的 static 改为对实例的调用, 再实现一个
sessionid -- Env 对象的 map ,就能通过 env.SessionIDLocator -- 一个
指向 web 中某 cs 的方法(HttpContext.Current.Session) 的代理对象.
取得 env 对象.那我其它地方的代码只需要把 env. --> evn.currentEvn. 就行了.