【发布时间】:2019-08-28 15:45:17
【问题描述】:
我刚刚知道会话状态阻塞,所以我正在尝试使用一个简单的 MVC 项目(创建新 MVC 项目时的默认设置)来测试禁用这种阻塞。
这是HomeController 唯一涉及的About 操作方法:
[SessionState(System.Web.SessionState.SessionStateBehavior.Disabled)]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
static int c = 0;
static long ci;
[Authorize]
public ActionResult About()
{
var isSecondRequest = ++c == 2;
//Session["a"] = 1;
Debug.Print(">>> Started working ..." + DateTime.Now);
if (isSecondRequest)
{
Debug.Print(">>> current counter: " + ci);
for (long i = 0; i < 10000000000; i++) ;
}
else
{
for (ci = 0; ci < 10000000000; ci++) ;
}
Debug.Print(">>> Finished!");
return Content("welcome");
}
}
我首先打开主页的两个选项卡来测试这一点。然后尝试单击第一个选项卡上的About 链接,几乎立即切换到第二个选项卡以再次单击About。所以我希望 >>> Started working … 行应该打印 2 次,时间戳几乎相同或有大约 1 或 2 秒的微小差异,但实际差异高达 21 秒,如下所示:
>>> Started working ...4/7/2019 3:16:15 PM
>>> Started working ...4/7/2019 3:16:36 PM
所以这意味着第二个请求仍然被阻止,当我已经将属性 SessionStateAttribute 应用到 HomeController 时,这是出乎意料的。而且看起来确实在另一种意义上有效,Session 对于每个请求都是 null。
你能发现这里有什么问题吗? 我的总体目的是禁用这种阻塞,以便我可以手动管理并发请求并立即向客户端返回一些有用的消息(例如第二个请求),这样它就不会显得不必要地忙碌。
【问题讨论】:
-
原则上看起来是正确的。但是,您的 for 循环 Max 会占用您的处理器时间。请用一个简单的 Thread.Sleep(5000) 再试一次,看看会发生什么。
-
您的目标是哪个版本的 .Net 框架?我们从我的一个问题中解决了类似的问题:stackoverflow.com/questions/42300438/…
-
@ChristophHerold 我刚刚按照您的建议尝试仅使用
Thread.Sleep(5000),现在差异正好是5秒,所以第二个仍然被阻止。 -
@MartinVenter 我的测试项目的目标是 .NET 4.5.2
-
如果您可以升级到 4.6.2,您可以尝试通过“aspnet:AllowConcurrentRequestsPerSession”允许并发请求的会话提供程序进行科学处理?它为我们解决了很多阻塞会话的问题。 PS:您是否有任何与 global.asax 中的某些内容相关联的内容可能导致此阻塞而不是会话?
标签: c# asp.net-mvc session concurrency session-state