是否存在允许/禁止在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秒(即在第一次加载完成后)。
我原以为两个标签都会作为单独的线程或并行加载。
应该吗?如果是这样,我可以注意哪些可能会强制这种序列化页面加载?
我继承了这个项目,所以我无法确定是否是别人打开/关闭的东西。
答案 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。