饭后来份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:\... ...
随机推荐
- Java泛型之类型擦除
类型擦除 学过C++模板的,在使用Java泛型的时候,会感觉到有点不疑问,例如:(1)无法定义一个泛型数组.无法调用泛型参数对象中对应的方法(当然,通过extends关键字是可以做到,只是比较麻烦): ...
- Netty精粹之JAVA NIO开发需要知道的
学习Netty框架以及相关源码也有一小段时间了,恰逢今天除夕,写篇文章总结一下.Netty是个高效的JAVA NIO框架,总体框架基于异步非阻塞的设计,基于网络IO事件驱动,主要贡献在于可以让用户基于 ...
- Generalized normal distribution and Skew normal distribution
Density Function The Generalized Gaussian density has the following form: where (rho) is the " ...
- [转]redis配置文件redis.conf的详细说明
转自: http://www.sufeinet.com/thread-8047-1-1.html # Redis 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格 ...
- Qt中printsupport的注意点和使用方法
问题:Qt中包含QPrintDialog.QPrinter.QPrintPreviewDialog失败:在引入printsupport后报cpp:651: error: undefined refer ...
- 7.1 服务暴露前的准备-ServiceBean的装配
dubbo的服务暴露以第一章 第一个dubbo项目中的dubbo-demo-provider来讲述. 列出dubbo-demo-provider的xml配置: <?xml version=&qu ...
- Html单引号,双引号转义
'是单引号的转义符,"是双引号的转义符
- 使用 CSS 接收用户的点击事情并对相关节点进行操作
问题背景:使用纯 CSS 方案,实现导航栏tab切换 实现 Tab 切换的难点在于如何使用 CSS 接收到用户的点击事情并对相关的节点进行操作.即是: 如何接收点击事件 如何操作相关DOM 下面看看如 ...
- Android -- getWidth()与getMeasuredWidth()
getWidth() Return the width of the your view. Returns The width of your view, in pixels. 源代码: public ...
- Java7,AutoClosable
Java 7的try-with-resource语法的目的是提高Java开发人员的效率,使得他们不需要在编写代码时考虑资源释放问题,大多数的这类"清理"问题是由于异常发生时清理方法 ...