饭后来份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:\... ...
随机推荐
- iOS:CoreText的常用语法
CoreText的关键语法 一.坐标旋转 -(void)drawRect:(CGRect)rect { //获取上下文 CGContextRef ctx = UIGraphicsGetCurrentC ...
- 这篇NLP文章不错,BERT,好好读一下
http://dy.163.com/v2/article/detail/DU5PE7V30511ABV6.html 狂破11项记录,谷歌年度最强NLP论文到底强在哪里?
- 服务器主机上RAID Controller的Read Ahead Policy
RAID控制器(卡)会根据Read Ahead Policy 来决定是否只读取应用程序所请求的一块数据, 还是从硬盘上读取整个stripe. 这个policy会对读的性能产生影响. No Read A ...
- Java奇淫巧技之Lombok
http://blog.csdn.net/ghsau/article/details/52334762
- Python3 比较两个图片是否类似或相同
Python代码 #coding:utf8 import os from PIL import Image,ImageDraw,ImageFile import numpy import pytess ...
- POJ 1265 pick定理
pick公式:多边形的面积=多边形边上的格点数目/2+多边形内部的格点数目-1. 多边形边上的格点数目可以枚举每条边求出.如果是水平或者垂直,显然可以得到,否则则是坐标差的最大公约数减1.(注这里是不 ...
- 建模角度理解word embedding及tensorflow实现
http://www.jianshu.com/p/d44ce1e3ec2f 1. 前言 本篇主要介绍关键词的向量表示,也就是大家熟悉的word embedding.自Google 2013 年开源wo ...
- javascript计算字符串长度
javascript计算字符串长度 学习了:https://blog.csdn.net/u012934325/article/details/75214847 function getByteLen( ...
- Overcoming the List View Threshold in SharePoint CAML queries
From: https://www.codeproject.com/articles/1076854/overcoming-the-list-view-threshold-in-sharepoint- ...
- js获取对象值的方式
js获取对象值的方式 var obj = {abc:"ss",nn:90}; var v1 = obj.abc;//使用点的方式 var v2 = obj["abc&qu ...