饭后来份TempData,瞅瞅有啥料
原本打算写一篇关于.NET下的分布式缓存的随笔,但是为了举一个实际的运用,就想把控制器(是ASP.NET MVC的)中的Session替换成使用分布式缓存来实现。如果你的网站最后是需要负载均衡的话,这就有用了。
一切就绪了,F5走起。啪的一声,亮黄的页面显示在显示器上,一看错,***是TempData错了,于是有了下面的分析了。
上Controller中TempData属性的源码:

点红色框框然后 F12,窥视它的内部。哇映入眼帘就看到它了:

这样我们就能够知道它具体会实现什么方法了,so 我们就只剖析核心部分了,首先我们先记的下面这三个变量(记住就回来看看吧):

其中_data是用来保存数据的,当时另外两个HashSet是干嘛的呢,其实能够实现用完即扔就要依靠这个两个变量,不信?下面我们看看Add方法:

这不每次我们添加数据都会在_initialKeys中也添加,我们再看看当我们从中拿取数据的源码:

看来要有人说为什么不直接从_data删除不就可以了。Oh no,别太天真了,别离开继续往下看。按照标准的教程我们用Peek就可以不删除这条数据的情况下获取,下面大家看到了一定会无语了吧:

仅仅只是少了一句话!这还没完,还有一个Keep方法可以保证数据即使被拿取了(不通过Peek)也可以保留:

作为福利,再传一个:

呵呵~~~~
现在_retainedKeys起作用了,通过这些我们可以这么分析:_data是保存着TempData中的所有数据,并且不会直接删除,而_initialKeys则保存着所有_data中的key(包括后来加进来的),而_retainedKeys则保存了我们需要继续保留的数据。
那么就到了关键的部分了,最终这些数据必定要保存到session中,并且该删除的数据还要删除掉,而笔者看到了一个Save方法:

原来删除在这里,红色框住的就是从_data删除数据,是通过判断_initialKeys中和_retainedKeys是否存在这个key,简单的说就是_data中的key只要不存在于两个hashSet中就只能面对被删除的后果了。既然该删的都删了下面我们就要保存了,悲剧的是这里是接口,不知道真正的实体是什么,我们只能后退了。
时光回溯,我们又来到了Controller中了,既然我们知道了这个Save方法,那么Controller必然要执行的,所以我们机智的Ctrl+F,然后输入TempData.Save,立马我们就找到了调用的部分了:

既然我们已经追捕到这个实体我们果断F12进去看一看:

果断的继续F12追下去(为了世界的和平我把原本的英文注释暂时去掉):

看到这里我们立马大彻大悟,原来还是这般套路(看过一定关于ASP.NET MVC框架揭秘的一定非常熟悉,笔者的脑海中立马闪现依赖注入和工厂方法),有兴趣的读者可以实现这些接口并通过Ninject注入,我们这里仅仅为了剖析,所以F12红色框住的,继续追下去:

笔者一眼就看到红色框住的那部分,原来如此。而且笔者所报的错就是绿色框住的部分导致的。其实到此为止已经剖析完毕了为了多给点福利,下面由笔者揭发TempData保存的Session的Key是什么:

通过这般的追击,爽快多了。不多说了笔者继续实现分布式缓存了~~~
饭后来份TempData,瞅瞅有啥料的更多相关文章
- 有關於USB保固
================================================= 版權聲明:如需轉載,請列明出處:HingAglaiaWong@博客園 支持原創,是對作者最好的的鼓勵 ...
- 设计模式之visitor模式,人人能懂的有趣实例
设计模式,现在在网上随便搜都一大堆,为什么我还要写"设计模式"的章节呢? 两个原因: 1.本人觉得这是一个有趣的设计模式使用实例,所以记下来: 2.看着设计模式很牛逼,却不知道怎么 ...
- 设计模式之模版方法模式(Template Method Pattern)
一.什么是模版方法模式? 首先,模版方法模式是用来封装算法骨架的,也就是算法流程 既然被称为模版,那么它肯定允许扩展类套用这个模版,为了应对变化,那么它也一定允许扩展类做一些改变 事实就是这样,模版方 ...
- 使用NSIS脚本制作一个安装包
大部分人第一次看到NSIS脚本都是一脸懵逼的.因为它这个脚本的结构乍一看上去就非常奇怪,不作说明的话是看不懂的. 编写脚本命令的时候要非常注意,命令要按照规定写在脚本中不同的段落里,也就是说,命令的先 ...
- 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文
阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...
- ASP.NET MVC TempData使用心得
说明: 在ASP.NET MVC中資料傳遞主要有ViewData與TempData ViewData主要是Controller傳遞Data給View,存留期只有一個Action,要跨Action要使用 ...
- Tmk吃汤饭
问题 : Tmk吃汤饭 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Tmk喜欢吃汤饭! Tmk喜欢吃汤饭!! Tmk喜欢吃汤饭!!! 汤饭窗口分点餐和取餐两个窗口,一位蜀黍负责点餐窗 ...
- 程序员必看:给你一份详细的Spring Boot知识清单
在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架.或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用.因而Spring Boot应用本质上就是一个基于Sp ...
- Windows下MySQL備份與還原
方法一 備份: C:\...\MySQL\MySQL Server 5.1\bin\>mysqldump aa -u root -p > d:\aaa.sql.bak 還原: C:\... ...
随机推荐
- [转]Haproxy 1.5.0 正式发布,Web 负载均衡
From : http://www.oschina.net/news/53070/haproxy-1-5-0 经过 4 年的不懈努力,HAProxy 1.5.0 终于发布了! 相对于 1.4 版本来说 ...
- easyui +ASP.NET 前后台乱码解决方法
前端接口 decodeURIencodeURI 后台接口 System.Web.HttpUtility.UrlEncode(user.name) 凡是涉及到中文的地方都要使用这几个接口
- IIS6 Gzip 网页GZIP压缩(转)
现在主流浏览器基本都支持 Gzip 压缩,因此这也成了 WebServer 优化策略的一种常规手段.启用压缩后能有效减少网页传输数据大小,使得有限带宽能提供更多的请求,并在一定程度上提高了网页 &qu ...
- [leetcode]Regular Expression Matching @ Python
原题地址:https://oj.leetcode.com/problems/regular-expression-matching/ 题意: Implement regular expression ...
- ubuntu 下python环境的切换使用
如何在Anaconda的python和系统自带的python之间切换 一般ubuntu下有三种python环境,1. 系统自带python2,3;在/usr/bin路径下:2. anaconda下安装 ...
- CSS 中的字体兼容写法:用CSS为英文和中文字体分别设置不同的字体
font-family的调用方法: font-family:Arial,'Times New Roman','Microsoft YaHei',SimHei; font:bold 12px/.75em ...
- Medline Plus
提问地址: http://apps2.nlm.nih.gov/medlineplus/contact/index.cfm?lang=en&from=http://www.nlm.nih.gov ...
- 如何屏蔽ctrl + v 粘贴事件,鼠标右键粘贴事件
通常在自己的APP里的密码框,验证码框需要屏蔽复制,粘贴,怎么办呢? 有三种方法: 1 hook 此方法是最完全的,但由于hook是全局的,容易影响到其它代码. 2 子类化文本框, 重写OnPaste ...
- [Algorithm] Inorder Successor in a binary search tree
For the given tree, in order traverse is: visit left side root visit right side // 6,8,10,11,12,15,1 ...
- IC卡制作常识概述
ic卡主要有9种: 1.接触型IC卡: 2.非接触型IC卡: 3.串行传输型IC卡: 4.并行传输型IC卡: 5.存储型IC卡: 6.智能型IC卡: 7.超级 ...