饭后来份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:\... ...
随机推荐
- [Android Security] 静态分析Android程序——smali文件解析
cp : https://blog.csdn.net/hp910315/article/details/51823236 cp : http://www.jb51.net/softjc/119036. ...
- Apache URL重写的配置 及其 apache500错误
1:如果apache报500错误时 ----->原因:可能是你的ReWrite模块没有打开(有时在apache重装时会忘记打开该模块) 将apache--->httpd.conf文件中Lo ...
- Android开发者选项 介绍
15个必知的Android开发者选项 https://www.jianshu.com/p/07b551ee260b 1.Stay awake 充电时保持屏幕唤醒,开发的时候,时不时的锁屏真是够了,开 ...
- 解决使用Properties读取中文乱码问题
web服务返回的是多行以key和value对应的键值对,且编码为utf-8.我的项目使用的编码也是utf-8,但是我用Properties读取中文的时候,打印出来的总是乱码. 后来网上查了一下,得到如 ...
- Kudu-java数据库简单操作
参考官网:http://kudu.apache.org/docs/kudu_impala_integration.html 参考:https://my.oschina.net/weiqingbin/b ...
- linux命令学习——cat
1.前言 今天需要处理一个oui.txt文件,需要从中抽丝man和orginaziton信息,导出到另外一个文件中.可以cat和grep命令进行操作.之前对cat命令了解一下,知道cat可以查看文件内 ...
- MySQL数据复制到其他主机时报错
问题1: MySQL server has gone away With statement 原因:SQl insert 插入的语句天长导致 问题2:mysql a bulk size specifi ...
- Effective JavaScript Item 63 注意异步调用中可能会被忽略的异常
异常处理是异步编程的一个难点. 在同步的代码中,异常可以非常easy地通过try catch语句来完毕: try { f(); g(); h(); } catch (e) { // handle an ...
- Maven hive-jdbc教程
由于项目中需要用到hive-jdbc从数据仓库拉数据下来,所以简单的学一下hive,hive数据仓库建构在hadoop集群之上,数据存在hdfs文件系统中,hive中执行的操作会装换成mapreduc ...
- Ubuntu 突然上不去网了怎么办
到家了也想看看程序.打开WIN8上的虚拟机VM,然后启动Ubuntu.................................... 像往常一样等待着界面,输入password,然后改动程序. ...