asp.net 获取session中如何给session赋值和获取?

最近在ASP.NET MVC项目中碰到这样的情况:在一个controller中设置了Session,但在另一个controller的构造函数中无法获取该Session,会报"System.NullReferenceException"错误。之所以这样做是因为希望在controller构造函数中获取Session值并赋值给一个全局变量,好让该controller的多个action共享。 起先以为是ASP.NET State Service服务没有开启,或者是Web.config中sessionState节点配置不对,结果都不是。最终发现:在ASP.NET中,Session只存在于action中,在controller构造函数中获取Session是行不通的。 & 那么,ASP.NET Session到底是如何工作的?在ASP.NET MVC中action如何获取Session呢? & & 为什么需要Session ASP.NET页面是"无状态"的,这意味着每次向服务器发送一个请求,服务器都会生成一个该页面的实例。但有时候,我们希望在不同的页面之间共享信息,比如购物车、用户登录等,于是,ASP.NET为我们提供了一个服务端的Session机制。 & & Session是如何工作的 服务端的Session机制是基于客户端的,也就是说服务端的Session会保存每个客户端的信息到服务端内存中。具体过程是这样的:→客户端向服务端发出请求→服务端响应客户端,并针对该客户端创建Session和唯一的Session ID→把Session ID作为key, Session内容作为value,以键值对形式存储到Session State Provider中→客户端带着专属的Session ID再次向服务端请求→服务端的Session机制根据客户端的Session ID,从Session State Provider中取出内容返回给客户端 & 优点:● 跨页面维持用户状态、信息● 使用方便,并且能存储任何类型● 能保存每个客户端的信息● 安全的、透明的 & 缺点:● 因为Session是保存在服务端的内存中的,随着客户端请求的增多,很有可能影响到性能● 在Web.conig中,sessionState节点的mode属性,如果设置为"StateServer"或"SQLServer",就必须为存储到Session中的对象打上[Serializable]。这样在存储、读取Session的时候,不断地序列化和反序列化,也会影响到性能 & & Session的Mode 在Web.config中,sessionState节点有一个mode属性,它的属性值代表了Session的Mode。包括:● InProc● StateServer● SQLServer● Custom● Off 每一种Mode的设置,会影响到Session机制采用哪种Session State Provider。 & □ Off 如果我们想让Session失效:&system.web&
&sessionState mode="off" /&
&/sytem.web&
这也是ASP.NET Session机制所选用的默认Mode,在该模式下,只保存当前应用程序域的数据。如果重启服务器,Session保存的数据会全部丢失。&system.web&
&sessionState mode="InProc" timeout="30" /&
&/system.web&
表示Session的有效期是30分钟。对于一些小网站或者数据量不大的时候,选用这个模式是比较好的。
优点:● 由于是把Session数据保存在内存中的,所以,获取数据非常快● 没有序列化和反序列化的要求
缺点:● 如果应用程序域被丢弃、重启,Session数据会丢失● 数据量大的时候,消耗过多的内存,影响性能
□ StateServer
选用此选项,意味着把Session的工作交给了当前应用程序域之外的asp.net_state.exe服务,这是一个独立于IIS之外的Windows服务。如果想启动该服务,可以通过打开“控制面板--管理工具--服务”,找到ASP.NET State Service这个服务,将其设为自动启动。
即使重启ASP.NET进程,Session依然有效,这是StateServer模式的优点。此模式的缺点是涉及过多的序列化和反序列化。&system.web&
&sessionState mode="StateServer" stateConnectionSting="tcpip=127.0.0.1:42424" stateNetworkTimeout="40" /&
&/sytem.web&
● 127.0.0.1 表示默认选用本机● 42424 表示默认端口● stateNetworkTimeout用来设置服务器响应、等待客户端请求的时间,默认是10秒,这里设置为40秒
如果想修改StateServer的默认设置,可以在asp.net_state.exe对应的注册表中修改。
□ SQLServer
选用此模式,Session数据被序列化,并被保存到SQL Server数据库中。为了让Sql Server配合此模式,需要做如下:→查看版本位置,比如在:C:\Windows\Microsoft.NET\Framework\v4.0.30319→输入如下命令
-ssadd 表示在SQL Server中添加session state-sstype p 表示Persisted-S 表示服务器名-U 表示SQL Server用户名-P 表示SQL Server密码
→如果一切顺利,出现如下提示
→数据库中多了ASPState数据库,Session数据将被保存到此数据库的相关表中
优点:● 在重启IIS后,Session数据不会受影响● 最安全的Session处理方式
缺点:● 处理相对缓慢● 过多的序列化和反序列化
自定义Session机制,通过继承SessionStateStoreProviderBase类,实现ISessionIDManager接口,等等。
& Session的Event
Session的事件有2个:Session_Start和Session_End。可以在global.asax全局文件中对这2个事件做处理。void Session_Start(object sender, EventArgs e)
void Session_End(object sender, EventArgs e)
& ASP.NET MVC处理Session的2种方式
如果处理用户登录,可以使用""中介绍的方式。如果处理购物车,可以使用""中介绍的方式。
参考资料:
阅读(...) 评论()
我的公众号:新语新世界,欢迎关注。&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
ASP.NET的ASHX一般处理程序中Session为null且不能赋值
摘要:首先我解释一下ashx文件以前我们做ajax处理的时候要用常用的web界面处理。现在不用了,微软有ashx文件,这个文件就是后台一些处理文件,用extjs的同学可能会更清楚一点。如果在这个文件中用session,会提示失效的,网上找了很久终于找到解决办法如下&如图所示加上IRequiresSessionState继承就好了。
首先我解释一下 ashx文件以前我们做ajax处理的时候要用常用的web界面处理。
现在不用了,微软有ashx文件,这个文件就是后台一些处理文件,用extjs的同学可能会更清楚一点。
如果在这个文件中用session,会提示失效的,网上找了很久终于找到解决办法如下
如图所示加上IRequiresSessionState 继承就好了。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
ASP.NET的ASHX一般处理程序中Session为null且不能赋值相关信息,包括
的信息,所有ASP.NET的ASHX一般处理程序中Session为null且不能赋值相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International16:04 提问
asp.net同一个页面,两个表进行session传值
aspxgridview1选中一条数据后,根据这条数据中的两个字段QH,ZH,传值给aspxgridview2中的字段HM,使aspxgridview2显示QH,ZH之间的所有数据HM;比如aspxgridview1中一条数据QH是1,止号是100,当我选中这条数据后aspxgridview2就自动显示HM在1到100之间的所有数据,怎么用session实现??(两张表在同一个页面中)
按赞数排序
aspxgridview1做个选中触发事件吧,如果需要session那就选中事件中给session赋值,至于session怎么应用就看你自己了
为啥要用session?同一个页面如果要传值可以用viewstate,也可以用隐藏域,还可以通过触发事件绑定数据库的数据。
只要你将数据post回去(无论是提交还是ajax),后端有个页面接收了存入sessionm,就可以了。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐在ASP.NET中怎么用SESSION判断用户是否登录?(
作者:用户
本文讲的是在ASP.NET中怎么用SESSION判断用户是否登录?(,
代码很简单的,我把我平时写过的贴出来给大家看看:if (bResult == true)
//登录的用户名和密码正确
//保存登录的用户名
Session[&LoginUser&] = Form
代码很简单的,我把我平时写过的贴出来给大家看看:if (bResult == true)
//登录的用户名和密码正确
//保存登录的用户名
Session["LoginUser"] = FormatString.Replace(txtLoginUser.Text);
//这里就是给session赋值了.我对登录用户进行了一些安全处理
//转到管理首页
Response.Redirect("Admin_Index.Aspx");
lblErr.Text = Message.Show("用户名或密码错误!");
ShowValidate(); //重新显示验证码
那如何在页面判断是否登录呢?代码更简单,如下:
if(Session["LoginUser"] == null)
//上面Session名字用LoginUser,这里的名字要和上面的相同,可以随便改,保持一致就行了,注意:Session["LoginUser"]后面,没有ToString()哦,你要是加上的话,就会出错了.
Response.Redirect("Login.Aspx"); //如果Session为空,则转到登陆页.
Session有可能会丢失的,解决办法参见我写的另一:
Session登陆后丢失的解决办法
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索密码
,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
40+云计算产品,6个月免费体验
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
云服务器9.9元/月,大学必备
云栖社区(yq.aliyun.com)为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!}

我要回帖

更多关于 asp session 赋值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信