同时在多个标签页中加载同一页面

时间:2018-04-24 14:04:34

标签: c# asp.net iis

是否存在允许/禁止在ASP.NET中同时加载同一页面的任何设置或内容

采取以下代码。

protected void Page_Load(object sender, EventArgs e)
{
   if (Page.IsPostBack == false)
   {
      System.Threading.Thread.Sleep(20000);

      // etc.

假设在Visual Studio中,我在第二行(if (Page.IsPostback...)上设置了一个断点。我在浏览器的第一个标签页上加载页面,断点就会立刻被打开。所以我按继续。然后我在浏览器的另一个选项卡中加载相同的页面。这次,断点不会被击中20秒(即在第一次加载完成后)。

我原以为两个标签都会作为单独的线程或并行加载。

应该吗?如果是这样,我可以注意哪些可能会强制这种序列化页面加载?

我继承了这个项目,所以我无法确定是否是别人打开/关闭的东西。

1 个答案:

答案 0 :(得分:1)

位于标签页上的页面可能会共享会话。如果您使用会话对象,则访问将是独占和序列化的:

  

对每个会话的访问ASP.NET会话状态是独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。但是,如果对同一会话[...,t]发出两个并发请求,则第二个请求仅在第一个请求完成后才会执行。

source

此网站上有一个现有的答案描述了这个以及MVC的解决方案:ASP.NET MVC 5 concurrent requests are queued even with disabled Session

正如您要求ASP.NET,原因是相同的,但解决方案略有不同。一个简单的解决方案是将会话状态设置为只读,这样就不会有并发写入:

<% @Page EnableSessionState="ReadOnly" %>

这是一种每页方法。对于按应用程序的方法,place it in your web.config

<pages enableSessionState="ReadOnly">
    ...
</pages>

当然这会使整个会话范围变得无用,不能再设置或更改任何值。如果您需要会话概念,请滚动自己的SessionStateModule或参考现有的实施like this one on github