看似非常简单问题.但捆扰了我很久,ASP.NET中的Session问题
//这个是一个登录窗口的登录按钮,如果成功把用户名放进Sessionprivate void Button1_Click(object sender, System.EventArgs e)
{
Accounts=tb_UsrID.Text;
PassWord=tb_UsrPassword.Text;
CheckPwd=tb_checkpwd.Text;
okpwd=Session["CheckCode"].ToString();
CheckPwd=CheckPwd.ToLower();
okpwd=okpwd.ToLower();
if(okpwd.Equals(CheckPwd))
{
if(EDao.YanZheng(Accounts,PassWord))
{
Session["Accounts"]=Accounts;
this.Response.Redirect("Index.aspx");
}
else
{
CommHandler.Alert(this,"用户名密码有误,请检查后重试!");
}
}
else
{
CommHandler.Alert(this,"验证码有误,请检查后重试!");
}
}
//在Index.aspx页面中...
public class Index : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
string i=Session.Count.ToString();
object isnull=Session["Accounts"];
string Accounts=Session["Accounts"].ToString();
}
走过这里 i="0"; isnull=null 走到第三句 报红字错误了 未将对象引用设置到对象的实例 以前我也做过这样例子都不会出错,而且拿这个项目有的电脑上又可以取到值 有的电脑又不可以取到...难道的.NET安装问题??搞了很久没想明白
请高手指点那里有错误
--------------------编程问答-------------------- 应该不是代码问题,我觉得。
还有你可以试试用request.Qureystring传值试试,如果还不行。。。那几是编译器的问题了! --------------------编程问答-------------------- 或者测试一下在object 那句下面加这样:
if(Session["Accounts"]!=null)
{
string str=Session["Accounts"].ToString();
}else
{
response.Write('这是没有接收到的信息!');
}
还有就是检查一下看是不是你的Accounts少写了c或s,拼写错误也是很容易犯的哦! --------------------编程问答-------------------- 楼上的兄弟..谢谢你回复...你写的方法我早试过了....一直是走else......
是不是写错了也不可能 我是复制复制在复制的.....我都看了1天多了 还没看出毛病
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
源错误:
行 22: string i=Session.Count.ToString();
行 23: object isnull=Session["Accounts"];
行 24: string Accounts=Session["Accounts"].ToString();
行 25: }
行 26:
--------------------编程问答-------------------- 这。。。。 有可能是编译器的问题了,我也是新手。 --------------------编程问答-------------------- string Accounts=Session["Accounts"].ToString();
string Accounts = System.Convert.ToString(Session["Accounts"]) --------------------编程问答-------------------- 而且奇怪的事...我把这个项目考到我朋友机子上也是报这个错.....但是拷到学校的windows2000的机子上就不会报错.........
我都要郁闷死了...这么小的问题搞了1天 如果用request.Qureystring当然可以....但是我非常想知道原因出在那里了 心好痒痒啊!!! --------------------编程问答-------------------- Session["Accounts"].ToString()
如果Session["Accounts"]会报错,最好先用Session["Accounts"]!=null判断
System.Convert.ToString(Session["Accounts"])这个没问题 --------------------编程问答-------------------- 用 banner91(BN大侠)的方法 虽然不会报错了...但是取出来的值是 "" --------------------编程问答-------------------- 现在问题就是Session["Accounts"]更本就是null Session.count=0 --------------------编程问答-------------------- 帮你顶
--------------------编程问答-------------------- Session["Accounts"]值为空,当然是空了,你检查一下你代码吧
.ToString()是不能为空的,Session["Accounts"],因为根本没有存在,所以不能用.TOSTRING(),除非你先初始化Session["Accounts"] =""; --------------------编程问答-------------------- banner91(BN大侠) 你没注意我 Login页面代码 已经把用户名 赋给Session["Accounts"]=Accounts; --------------------编程问答-------------------- private void Button1_Click(object sender, System.EventArgs e)
{
Session["Accounts"]="sdfsdf";
response.write(System.Convert.ToString(Session["Accounts"]))
}
看看有没有问题
我没办法将上面代码调试,不过肯定一个就是你Session["Accounts"]为空 --------------------编程问答-------------------- 如果是编译器问题或者Session设置问题,,也不是啊,,因为我做了验证码 验证码也用到了Session
okpwd=Session["CheckCode"].ToString();
CheckPwd=CheckPwd.ToLower();
okpwd=okpwd.ToLower();
if(okpwd.Equals(CheckPwd))
{
.......
} --------------------编程问答-------------------- 根据banner91(BN大侠) 的方法....我在登陆页面 可以取出值,,,等跳转到Index.aspx页面 值就为空了.......取不到了............ --------------------编程问答-------------------- 登陆最好用FORMS
login.aspx
protected void Button1_Click(object sender, EventArgs e)
{
Session["ComValTime"] = ComValTime;
Session["ComID"] = ComID;
System.Web.Security.FormsAuthentication.RedirectFromLoginPage(Company,false);
}
WEB.CONFIG
<!--
指定密匙
<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1"/>
指定密匙-->
<system.web>
<authentication mode="Forms">
<forms name="adminuser" loginUrl="mancom/Login.aspx" protection="All" />
</authentication>
</system.web>
<!--设置目录需用户验证-->
<location path="mancom"> <!--设置需要验证的目录-->
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
mancomm目录里面什么判断都不用写了 --------------------编程问答-------------------- 還有就是你試試:在創建Session["Accounts"]之前,你先用Session.clearAll()清空一次,有時候會齣現奇蹟哦 ! --------------------编程问答-------------------- 最新调试
在跳转页面连Session["CheckCode"]也取不出值...
string Accounts=System.Convert.ToString(Session["abc"]);
string Code=System.Convert.ToString(Session["CheckCode"]);
Response.Write(Accounts);
Response.Write(Code); --------------------编程问答-------------------- 很神奇啊,不过session丢失,真是一个世界难题 --------------------编程问答-------------------- 将SESSION全部改成Application试试看,不能显示,是你程序问题了,不关SESSION问题 --------------------编程问答-------------------- 未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
源错误:
行 21: string i=Session.Count.ToString();
行 22: object isnull=Session["abc"];
行 23: string Accounts=Application["abc"].ToString();
行 24: //string Code=Session["CheckCode"].ToString();
行 25: Response.Write(Accounts);
--------------------编程问答-------------------- 用System.Convert.ToString啊 --------------------编程问答-------------------- 又为空,证明你程序体有问题 --------------------编程问答-------------------- 是不是那個object影響到的問題? 為什么要用object呢?我認為沒有必要! --------------------编程问答-------------------- 最奇怪的是.......我这个程序拿学校去运行 一点问题没有....可以取到值.....
最不会告诉我是系统问题啊!~~~~~~~~~~~~~~~~~~~~ --------------------编程问答-------------------- TJ_net()我是为了测试 是否为空 删了也无济于事 --------------------编程问答-------------------- 如果在登录页面取值的话 不管是Session 还是Application 都可以取到值 只要跳转了页面就失效了 ...难道是跳转问题?
--------------------编程问答-------------------- string Accounts=Session["Accounts"].ToString();
----------------
改为string Accounts=Session["Accounts"] as string;
--------------------编程问答-------------------- up --------------------编程问答-------------------- string Accounts=Session["Accounts"].ToString();
这一步验证一下Session["Accounts"]中是否有值,如果没有的话.ToString()就会出问题啦,
就会报你哪个未将对象引用设置到对象的实例! --------------------编程问答-------------------- 日后再说~~~~~~~~~~~~~~~~~~~~~~~~~~
个人签名~~
---------------------------
惊爆支持ASP、ASP.NET2.0空间500M+SQL数据库100M 特惠价格:128一年
支持asp 300M 虚拟主机68一年
支持asp.net2.0 300M 虚拟主机88一年,快抢拉~~~~~
虚拟主机 网站空间 域名注册 主机托管 免费主机 免费空间 免费asp空间 免费虚拟主机
免费试用~~~
联系QQ:43909413
http://www.myidc.info/webhost/stylehost.aspx
硬件配置图:
--------------------编程问答-------------------- 你自己赋给Session的值是String,所以你在取的时候就如
string aa=Session["aa"].ToString();就可以了
--------------------编程问答-------------------- 楼主帖出来的代码应该没问题,关键是没贴出来的代码…… --------------------编程问答-------------------- asp.net Session的实现
asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。
原因1:
bin目录中的文件被改写,asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有access数据库位于bin目录,或者有其他文件被系统改写,就会导致Session丢失
原因2:
文件夹选项中,如果没有打开“在单独的进程中打开文件夹窗口”,一旦新建一个窗口,系统可能认为是新的Session会话,而无法访问原来的Session,所以需要打开该选项,否则会导致Session丢失
原因3:
似乎大部分的Session丢失是客户端引起的,所以要从客户端下手,看看cookie有没有打开
原因4:
Session的时间设置是不是有问题,会不会因为超时造成丢失
原因5:
IE中的cookie数量限制(每个域20个cookie)可能导致session丢失
原因6:
使用web garden模式,且使用了InProc mode作为保存session的方式
解决丢失的经验
1. 判断是不是原因1造成的,可以在每次刷新页面的时候,跟踪bin中某个文件的修改时间
2. 做Session读写日志,每次读写Session都要记录下来,并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作,这样找丢失的原因会方便很多
3. 如果允许的话,建议使用state server或sql server保存session,这样不容易丢失
4. 在global.asa中加入代码记录Session的创建时间和结束时间,超时造成的Session丢失是可以在SessionEnd中记录下来的。
5. 如果有些代码中使用客户端脚本,如javascript维护Session状态,就要尝试调试脚本,是不是因为脚本错误引起Session丢失
补充:.NET技术 , ASP.NET