经查看发现好多地方设置了 $.ajaxSettings.async = false;,方法执行完毕后没有设置异步。
全部修改之后,发现请求还是慢,打断点发现控制台显示耗时几十秒的请求,实际执行一两秒左右,前端同时发送5个Ajax请求,结果却是同步返回的,或者可以说后端做了同步的处理。
.net MVC请求响应慢,也许你的项目同一个用户的请求都是同步的
一. 使用Session后同步的原因
其实原因很简单,试想一下,如果1个以上请求同时修改Session的值,那么Session的值就会有不确定性,这个应该很好理解;为了保证Session值的准确性,只能同一个Session加上锁同步操作;
对于这个问题,写到这已经很明显了;Session的锁默认对同一个Session做了同步处理;不管前端如何异步请求,怎乃后端一直同步;
二. 解决Session同步执行方法
1. 使用 Attribute [SessionState(SessionStateBehavior.ReadOnly)]
[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. 使用其他方式代替Session存储
这里不做列举。
三. 总结
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 对一个给定的会话在某一时刻只处理一个查询。如果客户端形成了多个重叠的请求,他们将被排成队列,并由服务器依序处理。其好处是不需要担忧多个请求对同一数据进行修改的情况,缺点是得不到所希望的请求吞吐量。
程序性能低下的主要原因是开发人员技术参差不齐。。。。