10

我进行了以下简单的测试:

  1. 在 web.config 中,我们有:`sessionState timeout=40 mode=InProc`
  2. 在页面标记中设置了 `EnableSessionState = "ReadOnly"` 的空页面
  3. 代码背后:
protected void Page_Load(object sender, EventArgs e)
{

    if (Session["dt"] == null)
        Session["dt"] = DateTime.Now;

    Session["dt"] = ((DateTime)Session["dt"]).AddYears(1);
    Response.Write(Session["dt"].ToString());
}

并发回发的结果如下:

1- 13/11/2015 10:00:00
2- 13/11/2016 10:00:00
3- 13/11/2017 10:00:00
4- 13/11/2018 10:00:00
5- 13/11/2019 10:00:00
6- 13/11/2020 10:00:00
...

这清楚地表明会话变量正在更新。在 MSDN 上,您可以找到以下内容:http: //msdn.microsoft.com/en-us/library/ms178581 (v=vs.100).aspx

您可以通过将会话状态模式设置为关闭来禁用应用程序的会话状态。如果您只想为应用程序的特定页面禁用会话状态,您可以将 @Page 指令中的 EnableSessionState 值设置为 false。EnableSessionState 值也可以设置为 ReadOnly 以提供对会话变量的只读访问。

我们几乎在应用程序的每个页面上执行读/写操作。但是,这会阻止同时为同一个客户端运行两个 http 请求。第一个请求应该完成,直到服务器处理第二个请求。经过一些研究,这显然是由于会话排他锁。出于好奇,我们尝试将会话状态设置为 ReadOnly,它似乎仍然可以编辑,没有定义独占锁。

问题:

1- Readonly 是否意味着 Readonly (所以这里的 asp 中有一个错误)还是别的什么?

2-只要会话似乎可以在 ReadOnly 状态下编辑,有什么可担心的,您认为在生产环境中继续使用它是否安全?

谢谢

4

3 回答 3

3

ReadOnly 标志仅表明您对页面/应用程序的意图。它不是对 Session 变量的保护。

当您在页面声明上设置 ReadOnly 时,您只是在声明该页面不会更新 Session 变量。但是,如果您这样做,则风险自负。

声明(和您的行为)有助于 ASP.NET 更快。实际上,会话状态模块实现了一种锁定机制,并对状态值的访问进行排队。

具有会话状态写入访问权限的页面将在会话上保持写入器锁定,直到请求完成。具有会话状态读取访问权限的页面将仅持有会话上的读取器锁定,直到请求完成**。

准确声明每个页面将要使用的会话状态是优化页面性能的一种方法,也是一种保持代码干净的方法。

最后,您可以通过设置完全禁用 Session 变量(读取和写入):

<sessionState mode="Off">

但我不认为这是你想要的。

于 2014-11-13T12:16:02.137 回答
3

这个问题看起来很老,但是有很多观点。只是想向使用只读会话状态并从 InProc 切换到 SQLServer 会话的人发出警告。

虽然您仍然可以在会话中放入只读内容(不会出现异常),但在使用 SQLServer 会话时,这些更改不会在页面完成后提交给数据库。

因此,下一页将不到您对会话所做的更改,如果您以前将会话设置为 InProc 并希望它看到更改,这可能会导致奇怪的副作用。

于 2020-02-07T07:33:24.520 回答
0

更改会话设置:

<sessionState mode="InProc" >

<sessionState mode="Off" >

我想你已经嵌套了 web.config 文件,所以这个设置可能已经被更改为另一个配置文件。

于 2014-11-13T12:01:08.753 回答