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

Session变NULL的问题

我写了个简单的asp.net的web程序.登录时将用户名写入session,其它时候,只要页面跳转,我就判断session是否为空.结果,有的时候1秒中就空了,有时候10秒后变空的,总之,不是我想要的,而且从时间上看没规律,不知道什么原因丢失的session .config中的设置我设了,就是cookieless = false什么的,timeout=60也设了,就算是秒,也有60秒啊,奇怪了. 另外,我用的是sqlserver,不知道是不是sql连接错误,也不知道是不是相对路径之类的错误.

求教大家了. --------------------编程问答-------------------- 奇怪 --------------------编程问答-------------------- 帖代码吧 --------------------编程问答-------------------- if(!ispostback)
{
  if(session["name"]<>null then
  {
  }
} --------------------编程问答-------------------- 有没有改写 bin 文家加或者 web.config ? --------------------编程问答-------------------- 应该没改写什么吧,有这种说法吗?
更多的是我的团对在做,我不是很清楚.
我在登录的时候写入session,然后,在以下地方调用判断:

private void Page_Load(object sender, System.EventArgs e)
{
if(Session["ENT_NAME"] == null)
{
Response.Write("<script>parent.location.href   = '../login.aspx';</script>");
return;
}
if(!IsPostBack)
{

........
} --------------------编程问答-------------------- 看了一下"gcaling2006() "写的,难道是我写的位置不对?我试验试验 --------------------编程问答-------------------- 搞不懂了,大家帮忙啊 --------------------编程问答-------------------- 我最近发现一个现象:
    在datalist中,如果你使用的HTML控件(例如img),而不是asp控件(例如asp:Image);当数据库返回的字段的值为null时,会把session置为空。
    我不知道微软为什么这么做?
--------------------编程问答-------------------- ding! --------------------编程问答-------------------- sessin就是不如改成cookie好用
--------------------编程问答-------------------- 重新编译或改了配置文件,session会失效。 --------------------编程问答-------------------- ASP Session的功能的缺陷

目前ASP的开发人员都正在使用Session这一强大的功能,但是在他们使用的过程中却发现了ASP Session有以下缺陷: 



进程依赖性:ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。

Session状态使用范围的局限性:刚一个用户从一个网站访问到另外一个网站时,这些Session信息并不会随之迁移过去。例如:新浪网站的 WWW服务器可能不止一个,一个用户登录之后要去各个频道浏览,但是每个频道都在不同的服务器上,如果想在这些WWW服务器共享Session信息怎么办 呢?

Cookie的依赖性:实际上客户端的Session信息是存储与Cookie中的,如果客户端完全禁用掉了Cookie功能,他也就不能享受到了Session提供的功能了。

鉴于ASP Session的以上缺陷,微软的设计者们在设计开发 ASP.NET Session时进行了相应的改进,完全克服了以上缺陷,使得ASP.NET Session成为了一个更加强大的功能。

--------------------编程问答-------------------- Web.config文件简介

有的ASP.NET程序员说:Web.config文件?我从来没有听说过啊,可是我写的程序不是也能很正常的运转吗?是的,你说得没错,没有 Web.config文件程序是可以正常运行的。但是,如果你做了一个大型的网站,需要对整个网站做一些整体配置,例如整个网站的页面使用何种语言编写 的、网站的安全认证模式、Session信息存储方式等,这时你就需要使用Web.config文件了。虽然Web.config文件中的某些选项是可以 通过IIS配置的,但是如果在Web.config中也有相应的设置就会覆盖掉IIS中的配置。而且,Web.config文件的最大的便利之处就是可以 在ASP.NET页面中通过调用System.web名字空间访问Web.config中的设置。 



Web.config 有两种,分别是服务器配置文件和Web应用程序配置文件,他们都名为Web.config。在这个配置文件中会保存当前IIS服务器中网页的使用哪种语言 编写的、应用程序安全认证模式、Session信息存储方式的一系列信息。这些信息是使用XML语法保存的,如果想对其编辑,使用文本编辑器就行了。 



其中服务器配置文件会对IIS服务器下所有的站点中的所有应用程序起作用。在.NET Framework 1.0中,服务器的Web.config文件是存在:\WinNT\Microsoft.NET\Framework\v1.0.3705中的。 

而Web 应用程序配置文件Web.config则保存在各个Web应用程序中。例如:当前网站的根目录\Inetpub\wwwroot,而当前的Web应用程序 为MyApplication,则Web应用程序根目录就应为:\Inetpub\wwwroot\MyApplication。如果你的网站有且只有一 个Web应用程序,一般说来应用程序的根目录就是\Inetpub\wwwroot。如果想添加一个Web应用程序,在IIS中添加一个具有应用程序起始 点的虚拟目录就行了。这个目录下的文件及目录将被视为一个Web应用程序。但是,这样通过IIS添加Web应用程序是不会为你生成Web.config文 件的。如果想创建一个带有Web.config文件的Web应用程序,需要使用Visual Studio.NET,新建一个Web应用程序项目。 



Web应用程序的配置文件Web.config是可选的,可有可无。如果没有,每个Web应用程序会使用服务器的Web.config配置文件。如果有,则会覆盖服务器Web.config配置文件中相应的值。 



在ASP.NET中,Web.config修改保存后会自动立刻成效,不用再像ASP中的配置文件修改后需要重新启动Web应用程序才能生效了。 



Web.config文件中的Session配置信息

打开某个应用程序的配置文件Web.config后,我们会发现以下这段: 



<sessionState 

mode="InProc" 

stateConnectionString="tcpip=127.0.0.1:42424" 

sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" 

cookieless="false" 

timeout="20" 

/> 

这一段就是配置应用程序是如何存储Session信息的了。我们以下的各种操作主要是针对这一段配置展开。让我们先看看这一段配置中所包含的内容的意思。sessionState节点的语法是这样的: 



<sessionState mode="Off|InProc|StateServer|SQLServer" 

cookieless="true|false" 

timeout="number of minutes" 

stateConnectionString="tcpip=server:port" 

sqlConnectionString="sql connection string" 

stateNetworkTimeout="number of seconds" 

/> 





必须有的属性是

属性 选项 描述 

mode 设置将Session信息存储到哪里 

Off 设置为不使用Session功能 

InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。 

StateServer 设置为将Session存储在独立的状态服务中。 

SQLServer 设置将Session存储在SQL Server中。 



可选的属性是: 



属性 选项 描述 

cookieless 设置客户端的Session信息存储到哪里 

ture 使用Cookieless模式 

false 使用Cookie模式,这是默认值。 

timeout 设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟 

stateConnectionString 设置将Session信息存储在状态服务中时使用的服务器名称和端口号,例如:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。 

sqlConnectionString 设置与SQL Server连接时的连接字符串。例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。当mode的值是SQLServer时,这个属性是必需的。 

stateNetworkTimeout 设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服
--------------------编程问答-------------------- 用cookies吧 --------------------编程问答-------------------- <sessionState 

mode="InProc" 

stateConnectionString="tcpip=127.0.0.1:42424" 

sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" 

cookieless="false" 

timeout="20" 

/> 

当mode的值是InProc时,说明服务器正在使用这种模式。 



这 种方式和以前ASP中的模式一样,就是服务器将Session信息存储在IIS进程中。当IIS关闭、重起后,这些信息都会丢失。但是这种模式也有自己最 大好处,就是性能最高。应为所有的Session信息都存储在了IIS的进程中,所以IIS能够很快的访问到这些信息,这种模式的性能比进程外存储 Session信息或是在SQL Server中存储Session信息都要快上很多。这种模式也是ASP.NET的默认方式。 



好 了,现在让我们做个试验。打开刚才的SessionState.aspx页面,随便输入一些字符,使其存储在Session中。然后,让我们让IIS重 起。注意,并不是使当前的站点停止再开始,而是在IIS中本机的机器名的节点上点击鼠标右键,选择重新启动IIS。(想当初使用NT4时,重新启动IIS 必须要重新启动计算机才行,微软真是@#$%^&)返回到SessionState.aspx页面中,检查刚才的Session信息,发现信息已 经丢失了。 
--------------------编程问答-------------------- 将服务器Session信息存储在SQL Server中

首先,还是让我们来做一些准备工作。启动SQL Server和SQL Server代理服务。在SQL Server中执行一个叫做InstallSqlState.sql的脚本文件。这个脚本文件将在SQL Server中创建一个用来专门存储Session信息的数据库,及一个维护Session信息数据库的SQL Server代理作业。我们可以在以下路径中找到那个文件: 



[system drive]\winnt\Microsoft.NET\Framework\[version]\ 

然后打开查询分析器,连接到SQL Server服务器,打开刚才的那个文件并且执行。稍等片刻,数据库及作业就建立好了。这时,你可以打开企业管理器,看到新增了一个叫ASPState的 数据库。但是这个数据库中只是些存储过程,没有用户表。实际上Session信息是存储在了tempdb数据库的 ASPStateTempSessions表中的,另外一个ASPStateTempApplications表存储了ASP中Application对 象信息。这两个表也是刚才的那个脚本建立的。另外查看管理->SQL Server代理->作业,发现也多了一个叫做ASPState_Job_DeleteExpiredSessions的作业,这个作业实际上就是 每分钟去ASPStateTempSessions表中删除过期的Session信息的。 



接着,我们返回到Web.config文件,修改mode的值改为SQLServer。注意,还要同时修改sqlConnectionString的值,格式为: 



sqlConnectionString="data source=localhost; Integrated Security=SSPI;" 

其中data source是指SQL Server服务器的IP地址,如果SQL Server与IIS是一台机子,写127.0.0.1就行了。Integrated Security=SSPI的意思是使用Windows集成身份验证,这样,访问数据库将以ASP.NET的身份进行,通过如此配置,能够获得比使用 userid=sa;password=口令的SQL Server验证方式更好的安全性。当然,如果SQL Server运行于另一台计算机上,你可能会需要通过Active Directory域的方式来维护两边验证的一致性。 



同 样,让我们做个试验。向SessionState.aspx中添加Session信息,这时发现Session信息已经存在SQL Server中了,即使你重起计算机,刚才的Session信息也不会丢失。现在,你已经完全看见了Session信息到底是什么样子的了,而且又是存储 在SQL Server中的,能干什么就看你的发挥了。 

--------------------编程问答-------------------- 护航 --------------------编程问答--------------------
引用 8 楼 haisheng 的回复:
我最近发现一个现象:
           在datalist中,如果你使用的HTML控件(例如img),而不是asp控件(例如asp:Image);当数据库返回的字段的值为null时,会把session置为空。
           我不知道微软为什么这么做?

是吗?学习了 --------------------编程问答-------------------- Sessions 传值有时间限定的。是不是你时间没弄好。 --------------------编程问答--------------------
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,