记录一次Session偶尔获取不到的解决过程
导读
平台下某子系统有密码登录需求,初步考虑用Session,登录后设置Session[key]=value;Session中若某key对应的Session,即Session[key]为null则限制操作。对应所用技术点:Asp.Net MVC & Razor 视图引擎,技术点较简单,虽然走了一些弯路,但加深了对Session的理解。
一、前台ajax校验输入密码正确性
$.ajax({
url: "@Url.Action("CheckPwd","Earnings")",
type: "post",
data: { "pwd": pwd},
beforeSend: function () {
loadingLayer = layer.load(1, {
shade: [0.6, '#fff']
});
},
success: function (data) {
var result = JSON.parse(data);
if (result.Success) {
//页面跳转
}
else {
//
}
},
complete: function (XMLHttpRequest, textStatus) {
//
}
});
}
二、后台Action 校验密码输入正确后,设置Session["EarningsManagePwd"]
public ActionResult CheckPwd(string pwd)
{
if (//)
{
Session["EarningsManagePwd"] = encryptPwd;
}
return Json();
}
三、在其他页面,未登录没有访问权限时,跳转到登录页,后台Action核心代码如下:
if (Session["EarningsManagePwd"] == null || string.IsNullOrEmpty(Session["EarningsManagePwd"].ToString()))
{
return RedirectToAction("Index");
}
四、出现问题,Session值时而获取不到
- 做的一些demo,简单使用Session,没有发现异常;
- 本地调试没发现什么问题,发布到服务器后,发现Session["EarningsManagePwd"]的值时而获取不到,变为null,操作页面时总跳转到登录页,多次操作中偶尔会获取到Session值,达到预期效果;
- 然而这样的效果坚决不能容忍,势必找寻其根源,探究哪里出了问题;
五、查询解决方案历程
1.略过一系列调试步骤及“不对症的药方”,怀疑System.Web.HttpContext.Current.Session与MVC下Session二者的区别
(1)MVC下Session转到定义
(2)System.Web.HttpContext.Current.Session转到定义
两者是同一个类,似乎没有本质区别
(3)做兼容处理,判断二者的值,二者也是同一个值,仍旧时而获取不到值,时而获取到
(4)HttpContext.Current.Session 和 Session 的区别(后话)
HttpContext.Current.Session 和 Session 的区别
What is the difference between these two HttpContext.Current.Session and Session - asp.net 4.0
They're effectively the same, in that they will access the same Session data.
他们具有相同的作用,他们将会访问相同的session数据。
The reason you can call
Session
in your code-behind is because ASP.Net pages by default extend theSystem.Web.UI.Page
type. This has aSession
public property. If you look at the code for this in Reflector you can see that it just callsHttpContext.Current.Session
itself (through its ownContext
property).在你的code-behind代码中之所以能够调用session,是因为Asp.net的页面默认是继承自system.web.ui.page类型的。这个类型有一个名字为session的公共属性。如果你在Reflector反编译软件中查看这个公共属性的代码,你会看到这个属性自己仅仅是调用的httpcontext.current.session而已。(在他自己的 Context属性中也全部是这样使用的)
In other classes you will not have access to that property, but you can use
HttpContext.Current.Session
to access the session data instead, as long as you're running in the context of a web application.在其他的类中,你可能不可以直接访问system.web.ui.page的session属性,但是你能够用httpcontext.current.session来访问session数据,只要你的代码正运行在一个web应用程序的上下文中。
2.查询到可以通过更改Web.config文件中sessionState节点配置来解决
(1)C#SESSION丢失问题的解决办法
我们在用C#开发程序的时候经常会遇到Session很不稳定,老是数据丢失。下面就是Session数据丢失的解决办法希望对您有好处。
1、在WEB.CONFIG文件中修改SESSION状态保存模式,如:<sessionState mode='StateServer' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='180'/>
2、启动系统服务“ASP.NET状态服务 ”,系统默认是手动启动的
3、如果SESSION中保存的数据类型是自定义的,如结构,请在自定义数据类型处序列化会话状态,即在类或结构申明前加[Serializable]
启动Asp.Ner State Service
将web.config文件中sessionState节点替换为”<sessionState mode='StateServer' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='180'/> ”,Session["EarningsManagePwd"]取值正常,达到预期效果,然而出现了新的问题,浏览器地址栏莫名多了如下一串字符串,每个链接地址下都多了类似的字符串
多余字符串
session标识两种方式存储:
1)cookieless=false,默认方式,sessionId存放在cookie
2)cookieless=true,sessionId存放在url常用的sessionstate模式:
1.inProc模式:受IIS进程影响,容易丢失,但是也正因如此,是唯一支持Session_OnEnd 事件的模式;
2.StateServer模式 :提供独立的状态服务,即使web应用程序重启,会话仍然保持;
3.SQLServer 模式:利用sqlserver提供状态存储,即使web应用程序重启,会话仍然保持,
并且,利用故障转移集群,可以让其他sqlserver接管故障服务,而不会丢失session
将web.config文件中sessionState节点cookieless属性值改为false,地址栏sessionId果然消失了!
(3)优化sessionState 配置节点(暂不考虑Session集群共享)
<sessionState mode="StateServer" ></sessionState>
附其他参考资料
2.sessionState元素(ASP.Net 设置架构)
总结
解决Session偶尔获取不到的方法
1.web.config文件中sessionState节点mode属性由默认的InProc改为StateServer;
2.启动服务Asp.Net State Service;
3.如果Session中保存的数据类型是自定义的,如结构,请在自定义数据类型处序列化会话状态,即在类或结构申明前加[Serializable] ;
记录一次Session偶尔获取不到的解决过程的更多相关文章
- hibernate中session的获取使用以及其他注意事项
hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行 ...
- webapi mvc session一直获取不到问题
前一段时间在给移动端写接口时遇到一个调用接口发送邮箱 session 一直获取不到的问题.我来给遇到问题的同志们说一说 自个在网上查了好多资料,问了一些朋友后.终于找到解决方案了. 大家都知道weba ...
- php session获取不到的解决方法
php session获取不到的解决方法 因为sesson数据是存在服务器端的硬盘一般临时空间不足 /tmp/ 1 这个需要清空下系统盘就可以了2 你可以在空间充足的地方mkdir 文件夹——你可以使 ...
- [转]线上GC故障解决过程记录
排查了三四个小时,终于解决了这个GC问题,记录解决过程于此,希望对大家有所帮助.本文假定读者已具备基本的GC常识和JVM调优知识,关于JVM调优工具使用可以查看我在同一分类下的另一篇文章: http: ...
- 记录一次Spring Data Solr相关的错误解决
记录一次Spring Data Solr相关的错误解决 生活本不易,流人遂自安 相信大家也使用过SpringDataSolr,但是在最新版的SpringDataSolr 4.0.5 RELEASE中有 ...
- 一次线上GC故障解决过程记录
排查了三四个小时,终于解决了这个GC问题,记录解决过程于此,希望对大家有所帮助.本文假定读者已具备基本的GC常识和JVM调优知识,关于JVM调优工具使用可以查看我在同一分类下的另一篇文章: http: ...
- 记录参加“牛津计划.Docker在线黑客松”比赛的过程
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- Asp.net默认配置下,Session莫名丢失的原因及解决
Asp.net默认配置下,Session莫名丢失的原因及解决 我们平时写的asp.net程序,里面要用到Session来保存一些跨页面的数据.但是Session会经常无故丢失,上网查查,也没找到原因. ...
- Linux(2)---记录一次线上服务 CPU 100%的排查过程
Linux(2)---记录一次线上服务 CPU 100%的排查过程 当时产生CPU飙升接近100%的原因是因为项目中的websocket时时断开又重连导致CPU飙升接近100% .如何排查的呢 是通过 ...
随机推荐
- java 虚拟机与并发处理几个问题简要(一)
一. 处理任务时,应该将代码分成不同的部分,每一部分由一个线程进行,但是会因为任务负载不平衡导致有闲有忙.最好是应分成不同的部分,分配不同的线程,尽量让处理器不停的处理,不要闲下来.如何分配线程数 ...
- jdbc-批处理
批处理 1 Statement批处理 批处理就是一批一批的处理,而不是一个一个的处理! 当你有10条SQL语句要执行时,一次向服务器发送一条SQL语句,这么做效率上很差!处理的方案是使用批处理, ...
- Rx 入门指引 (一)
自学 Rx 快有一个周了, 它非常适合处理复杂的异步场景.结合自己所学,决定写系列教程. 我认为, Rx 中强大的地方在于两处 管道思想,通过管道,我们订阅了数据的来源,并在数据源更新时响应 . 强大 ...
- Jmeter连接mysql数据库
1.下载 MySQL JDBC driver,并拷贝到jmeter的lib目录下. 2.创建JDBC Connection Configuration 需要填入的信息: Variable Name:M ...
- 在不用Promise的情况下如何控制异步请求?
如何更好的控制异步请求?相信大家一定首选Promise对象.确实,使用Promise控制异步请求确实非常方便,直接使用then()方法就可以实现当一个异步请求完成后再处理另一个请求或操作.同时,这样的 ...
- LINUX 笔记-文本过滤
^ 只匹配行首 $ 只匹配行尾 * 一个单字符后紧跟*,匹配0个 ...
- 理解JDK1.5的自动装箱拆箱
JDK1.5的升级引入了装箱和拆箱概念,简单说就是为了简化书写. JDK1.5之前,创建Integer对象是需要这么写的 Integer i = new Integer("3") ...
- Django1.11搭建一个简易上传显示图片的后台
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 项目展示需要,之前没研究过Django,网上查资料快速做了一个后台,写下了防止自己忘了. p ...
- js日期倒计时效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [翻译]欢迎来到 C# 7.1
[翻译]欢迎来到 C# 7.1 原文: Welcome to C# 7.1 在 C# 中,我们一直倾向于主要版本:捆绑了很多功能,并且不太频繁地发布.当我们谈到 C#6.0时,我们甚至还经常忽略掉后面 ...