一、感慨

很久前看到一篇博客中有句话大致的意思是:“asp.net 程序性能低下的主要原因是开发人员技术参差不齐”,当时看到这句话不以为然,然而时间过的越久接触的.net 开发人员越多就越认同这句话;特别最近发现非常一个成熟的项目中有些问题非常非常影响性能,最终影响的是用户体验,借此给大家分享一下关于asp.net中一个小小的点,但对项目有很大的性能提升;以前觉得自己接触的项目少小,然后接触的项目越多,越大就会越发现,同样的问题依旧存在;

二、先从最简单的asp.net mvc例子说起

1、Controller

public class HomeController : Controller{ public ActionResult About(){return View();} public ActionResult TestAjax(){Thread.Sleep(1500);return Json(new { Code = 1, LoginId = 0 });}}

Controller里有两个Action,一个是显示的页面,一个是需要请求的ajax,其中Thread.Sleep(1500)简单模拟业务处理时间;

2、View

@{ViewBag.Title = "About";
}
@section scripts{<script type="text/javascript">$(function () {$("#btn-request").click(function () {$("#result").empty();for (var i = 0; i < 5; i++) {$.ajax({url: "/Home/TestAjax",type: "post",success: function (x) {$("#result").append("<div></div>")}});}});});</script>
}
<h3>模拟操作
</h3>
<div><input type="button" value="模拟请求" id="btn-request" />
</div>
<h3>结果
</h3>
<div id="result">
</div>

页面中更加简单,一个按钮同时请求5次Ajax,用于模拟页面的多次异步请求;

3、点击按钮显示效果

结果和我们想象的一样,5个异步请求同时在1500毫秒左右响应;这个时候没什么问题;

4、添加一个简单的登录

1、添加登录Controller

public class LoginController : Controller{public ActionResult Index(){Session["LoginId"] = 1;return Json(new { Code = 1 }, JsonRequestBehavior.AllowGet);}}

2、修改View,添加一个按钮模拟Ajax登录

@section scripts{<script type="text/javascript">$(function () {//...其他代码...$("#btn-login").click(function () {$.ajax({url: "/login",type: "post",success: function (x) {alert('登录成功!');}});});});</script>
}...其他代码...
<div><input type="button" value="模拟登录" id="btn-login" />
</div>
...其他代码...

3、 登录以后的模拟结果

结果很明显了,登录以后,虽然前端是同时发送了5个Ajax请求,结果却每隔1500毫秒返回一个请求;或者可以说后端做了同步的处理;

对于这个问题,写到这已经很明显了;Session的锁默认对同一个Session做了同步处理;不管前端如何异步请求,怎乃后端一直同步

在开发中很多人遇到过,一个请求卡住了,导致其他所有ajax包括页面请求全部卡主没有任何反应。解决的方式要么重启浏览器,要么清掉cookie;这个演示也同时解释了遇到的这个问题;

4、使用Session后同步的原因

其实原因很简单,试想一下,如果1个以上请求同时修改Session的值,那么Session的值就会有不确定性,这个应该很好理解;为了保证Session值的准确性,只能同一个Session加上锁同步操作;

三、解决Session同步执行方法

1、使用 Attribute [SessionState(SessionStateBehavior.ReadOnly)]

既然导致同步执行的原因是修改Session导致的,那么在不需要修改Session的请求中使用只读Session就可以解决问题了;

    [SessionState(SessionStateBehavior.ReadOnly)]public class HomeController : Controller{ public ActionResult About(){return View();} public ActionResult TestAjax(){Thread.Sleep(1500);return Json(new { Code = 1, LoginId = Session["LoginId"] });}}

只需要在Controller上加上特性SessionState,设置值为ReadOnly;这样同一个用户的请求也可以是异步的;

在一般的项目开发中,Session修改添加操作会在用户登录的时候使用,那么在除了登录的请求中加入Session ReadOnly,就会根本解决问题;或者笼统的说,在不需要修改Session的请求中加入Session ReadOnly,你的项目性能会有很大的提升;

这种方式对于老项目存在同样的问题,或者习惯使用Session的用户是不错的选择;

2、 使用JWT等方式

既然Session存在这个问题,那么可以使用其他方式替代Session,JWT就是一个很不错的方式,特别现在前后端分离的主流下,JWT更是绝佳的选择。详情可以参考 https://jwt.io/

四、总结

1、如果你的项目正在使用Session,而且并未设置Session ReadOnly,简单的设置会对你项目性能有很大的提升;

2、asp.net webform存在同样的问题;

3、新项目选择非Session也是不错的选择;

4、从asp.net core 2.1开始,使用Session并不会有此问题,同时兼顾了Session的使用习惯也不会导致同步的性能问题;asp.net 2.1的解决方式类jwt方式;

5、为了简化会话状态,ASP.NET 对一个给定的会话在某一时刻只处理一个查询。如果客户端形成了多个重叠的请求,他们将被排成队列,并由服务器依序处理。其好处是不需要担忧多个请求对同一数据进行修改的情况,缺点是得不到所希望的请求吞吐量。
---引用自 《精通ASP.NET MVC5》 19.6.1

6、源码 点击下载

记得推荐 ^_^

系列课程

  • [asp.net mvc 奇淫巧技] 01 - 封装上下文 - 在View中获取自定义的上下文
  • [asp.net mvc 奇淫巧技] 02 - 巧用Razor引擎在Action内生成Html代码
  • [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper
  • [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?
  • [asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,支持混淆加密javascript
  • [asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的

转载于:https://www.cnblogs.com/emrys5/p/aspnet-session-readonly.html

[asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的相关推荐

  1. [asp.net mvc 奇淫巧技] 04 - 你真的会用Action的模型绑定吗?

    在QQ群或者一些程序的交流平台,经常会有人问:我怎么传一个数组在Action中接收.我传的数组为什么Action的model中接收不到.或者我在ajax的data中设置了一些数组,为什么后台还是接收不 ...

  2. [asp.net mvc 奇淫巧技] 05

    一.需求: 在web开发中,经常会处理javascript的一些问题,其中就包括js的压缩,合并,发布版本以及混淆加密等等问题.在asp.net 开发中我们使用ScriptBundle已经可以解决ja ...

  3. 多行文本注视 php,多行文本进行截断的奇淫巧技

    本篇文章给大家带来的内容是关于多行文本进行截断的奇淫巧技,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 单行文字的截断非常简单,但是多行文字的截断可谓是非常头疼,刚学css时候就为了 ...

  4. 【C#冷知识系列】(一)那些你知道或者不知道的奇淫巧技

    引子 正如我在个人介绍中所写,我是一个仍然坚持.NET的头铁高级软件工程师,研究C#,.NET已经六年多,一直坚持认为自己的能力不足以教授别人,所以一直没有想法写博客.工作几年,内容涵盖了.NET框架 ...

  5. 开发奇淫巧技Tips(Android篇)

    没事会记录下开发的奇淫巧技,每个tips前都会标明开发语言,有更多更好的奇淫巧技可以发评论或者私聊,可以添加进来 1.Kotlin:View调用此方法传入url加载网络图片,如果是ImageView则 ...

  6. asa防火墙升级固件_奇淫巧技 | 在路由器中添加策略,阻止电视系统升级

    上一篇文章「长虹智能电视刷机降级,实现U盘安装第三方应用」中提到系统升级后会出现无法随意安装第三方应用的情况,当完成刷机后为了避免系统自动更新,你需要通过路由器阻止系统更新. 用openwrt类路由器 ...

  7. idea new对象后自动补全_IDEA的quot;奇淫巧技quot;

    本期吉大浪潮俱乐部给大家带来了IDEA的快捷键用法总结.废话不多说,让我们赶紧开始吧!!! IDEA的奇淫巧技 前言 奇淫巧技是第一生产力 -鲁迅 玩笑归玩笑,掌握IDEA的常用功能,不仅能提高开发效 ...

  8. 奇淫巧技的KMP算法--详解

    奇淫巧技的KMP算法–详解 花了一下午时间,看了十几个博客,终于拿下了KMP高地,现在总结下下自己对KMP的理解和实现. 情景1 假如你是一名生物学家,现在,你的面前有两段 DNA 序列 S 和 T, ...

  9. 源码解析中看到的奇淫巧技

    源码解析中看到的奇淫巧技 一. 数组重置 let arr = [123,123] arr.length // 2 arr.length = 0 arr // [] 当我们给数组的length 属性设置 ...

  10. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)...

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框 ...

最新文章

  1. ubuntu联网经常掉线的解决方法
  2. 年轻人的第一只机器狗,只要1.6万
  3. 每日一皮:程序员最讨厌的四件事!
  4. 【Java多线程】实现Runnable接口方式 / 继承Thread类方式;使用synchronized锁实现线程安全;线程安全的懒汉式单例模式;死锁问题示例
  5. JAVA中浅复制与深复制
  6. autojsui界面关闭_autojs 第九次 ui界面交互获取
  7. java 设计作业——简单计算器
  8. 【LeetCode笔记】438. 找到字符串中所有字母异位词(Java、字符串、滑动窗口)
  9. Kinect1和Kinect2的区别
  10. SpringBoot+Redis缓存概念介绍
  11. Python+tkinter根据窗体大小自动缩放并显示图像
  12. hadoop streaming怎么设置key
  13. 六款强大的开源数据挖掘工具
  14. Kafka操作之kafka-topics
  15. 【C语言打印红色玫瑰花】
  16. 华为云灾备方案,如何保障企业数据安全
  17. solaris 的ZFS操作
  18. 超级码力在线编程大赛初赛 第2场 题解
  19. Flutter 视频播放器组件封装
  20. 表结构设计的基本思路

热门文章

  1. vue3 Vite 2.0 Vue-Router 4.0 TypeScript elementPlus admin 须弥戒后台案例小结
  2. java和php基础部分相同或异同
  3. Ubuntu nginx 1.6.0 服务器 nginx.conf等相关配置
  4. mysql 查询递归自身,mysql 递归查新
  5. 小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_21、SpringBoot2.x配置全局异常返回自定义页面...
  6. 阶段3 1.Mybatis_09.Mybatis的多表操作_2 完成account表的建立及实现单表查询
  7. sqoop导入/导出
  8. opencart修改网站顶部电话联系方式
  9. 寻找复活节彩蛋egg huting 学习
  10. BZOJ3514 / Codechef GERALD07 Chef and Graph Queries LCT、主席树