原本打算写一篇关于.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,瞅瞅有啥料的更多相关文章

  1. 有關於USB保固

    ================================================= 版權聲明:如需轉載,請列明出處:HingAglaiaWong@博客園 支持原創,是對作者最好的的鼓勵 ...

  2. 设计模式之visitor模式,人人能懂的有趣实例

    设计模式,现在在网上随便搜都一大堆,为什么我还要写"设计模式"的章节呢? 两个原因: 1.本人觉得这是一个有趣的设计模式使用实例,所以记下来: 2.看着设计模式很牛逼,却不知道怎么 ...

  3. 设计模式之模版方法模式(Template Method Pattern)

    一.什么是模版方法模式? 首先,模版方法模式是用来封装算法骨架的,也就是算法流程 既然被称为模版,那么它肯定允许扩展类套用这个模版,为了应对变化,那么它也一定允许扩展类做一些改变 事实就是这样,模版方 ...

  4. 使用NSIS脚本制作一个安装包

    大部分人第一次看到NSIS脚本都是一脸懵逼的.因为它这个脚本的结构乍一看上去就非常奇怪,不作说明的话是看不懂的. 编写脚本命令的时候要非常注意,命令要按照规定写在脚本中不同的段落里,也就是说,命令的先 ...

  5. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  6. ASP.NET MVC TempData使用心得

    说明: 在ASP.NET MVC中資料傳遞主要有ViewData與TempData ViewData主要是Controller傳遞Data給View,存留期只有一個Action,要跨Action要使用 ...

  7. Tmk吃汤饭

    问题 : Tmk吃汤饭 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Tmk喜欢吃汤饭! Tmk喜欢吃汤饭!! Tmk喜欢吃汤饭!!! 汤饭窗口分点餐和取餐两个窗口,一位蜀黍负责点餐窗 ...

  8. 程序员必看:给你一份详细的Spring Boot知识清单

    在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架.或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用.因而Spring Boot应用本质上就是一个基于Sp ...

  9. Windows下MySQL備份與還原

    方法一 備份: C:\...\MySQL\MySQL Server 5.1\bin\>mysqldump aa -u root -p > d:\aaa.sql.bak 還原: C:\... ...

随机推荐

  1. 安卓开发环境配置及HelloWorld

    一:JAVA 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 1.1 ...

  2. CUDA报错: Cannot create Cublas handle. Cublas won't be available. 以及:Check failed: status == CUBLAS_STATUS_SUCCESS (1 vs. 0) CUBLAS_STATUS_NOT_INITIALIZED

    Error描述: aita@aita-Alienware-Area-51-R5:~/AITA2/daisida/ssd-github/caffe$ make runtest -j8 .build_re ...

  3. Installing Hyperledger Fabric v1.1 on Ubuntu 16.04 — Part II &  Part III

    This entire tutorial is the second part of the installation of Hyperledger Fabric v1.1. In the previ ...

  4. rapidjson库的基本使用

    转自:https://blog.csdn.net/qq849635649/article/details/52678822 我在工作中一直使用的是rapidjson库,这是我在工作中使用该库作的一些整 ...

  5. BERT深度解析

    这篇文章看起来很不错: https://blog.csdn.net/qq_39521554/article/details/83062188 仔细看看. 也可以看这个github,一样的文章: htt ...

  6. 滴滴大数据算法大赛Di-Tech2016参赛总结

    https://www.jianshu.com/p/4140be00d4e3 题目描述 建模方法 特征工程 我的几次提升方法 从其他队伍那里学习到的提升方法 总结和感想 神经网络方法的一点思考 大数据 ...

  7. 斯坦福大学CS224d课程目录

    https://www.zybuluo.com/hanxiaoyang/note/404582 Lecture 1:自然语言入门与次嵌入 1.1 Intro to NLP and Deep Learn ...

  8. (转)C#中的委托(Delegate)和事件(Event)

    转自:http://blog.chinaunix.net/uid-576762-id-2733751.html   把C#中的委托(Delegate)和事件(Event)放到现在讲是有目的的:给下次写 ...

  9. 主成分分析(PCA)原理及推导

    原文:http://blog.csdn.net/zhongkejingwang/article/details/42264479 什么是PCA? 在数据挖掘或者图像处理等领域经常会用到主成分分析,这样 ...

  10. linux mount

    挂载       mount //10.65.200.168/linux_bj /home/linux_bj -t cifs -o username=niu,password=ruanxiaopang ...