C# 使用DynamoDB访问时,会话状态是否读取/写入所有内容

C# 使用DynamoDB访问时,会话状态是否读取/写入所有内容,c#,session,amazon-web-services,amazon-dynamodb,C#,Session,Amazon Web Services,Amazon Dynamodb,我有一个C#.NET应用程序,它的会话状态由支持。然而,我注意到我期望的更高的吞吐量。然而,我注意到在实际的表中,所有内容都存储为一个长字符串中的SessionItems 但假设我在会话中存储了多个内容 Http.Context.Session["Object1"] = obj1; Http.Context.Session["Object2"] = obj2; 其中obj1和obj2是两个不同类的实例 现在,当我读或写其中一个时,例如: var obj1 = Http.Context.Sess

我有一个C#.NET应用程序,它的会话状态由支持。然而,我注意到我期望的更高的吞吐量。然而,我注意到在实际的表中,所有内容都存储为一个长字符串中的SessionItems

但假设我在会话中存储了多个内容

Http.Context.Session["Object1"] = obj1;
Http.Context.Session["Object2"] = obj2;
其中
obj1
obj2
是两个不同类的实例

现在,当我读或写其中一个时,例如:

var obj1 = Http.Context.Session["Object1"];

它正在读取DynamoDB表上存储在SessionItems中的所有内容吗?这是一种解释,可以解释表上更高的吞吐量,但似乎非常不必要。

理想情况下,ASP.NET会在每次请求(例如页面/控制器)时对存储在用户会话中的对象的序列化集合执行一次读写操作。如果您根据请求访问该集合中的多个项,则它将使用本地副本,而不必访问基础数据存储

然而,我认为您注意到的是ASP.NET的。当它尝试执行单次读取以检索用户的会话数据时,如果该用户的会话数据上已经设置了锁,它将继续重试检索(每500毫秒一次)

ASP.NET HTTP生命周期的细节取决于框架版本等,但一般概念如下:

  • 在数据存储中包含会话数据的行上设置排他锁(如果无法获得排他锁,请等待它可以获得)
  • 读取/反序列化此会话的数据存储行中的集合
  • 执行页面/控制器
  • 将集合序列化/写回数据存储
  • 移除独占锁
  • 如果有多个HTTP请求访问一个用户的会话(例如,页面上的Ajax),您会注意到由于独占锁而没有并发性-如果为每个会话启用了
    session
    ,则它们会连续执行。(即使他们没有明确访问
    会话

    避免这种情况的一种方法是有意确定写入
    会话的位置,并在所有其他页面/控制器上指定
    会话状态行为。只读
    。执行此操作时,ASP.NET不会设置独占锁(将使用GetItem而不是GetItemEx)。看

    第页:

    参考:

    • -显示Microsoft会话提供程序的示例
    • -AWS会话提供程序的源
    • -较旧,但演示了请求流的概念
    • -有关创建会话提供程序的详细信息
    希望这有帮助

    问候,

    罗斯

    <% @Page EnableSessionState="ReadOnly" %>
    
    [SessionState(SessionStateBehavior.ReadOnly)]