当前位置:编程学习 > C#/ASP.NET >>

看似非常简单问题.但捆扰了我很久,ASP.NET中的Session问题

//这个是一个登录窗口的登录按钮,如果成功把用户名放进Session
private 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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,