asp.net 如何获取会话中对象的大小

hgtggwj0  于 2023-02-01  发布在  .NET
关注(0)|答案(3)|浏览(181)

我们有一个ASP .NETWebforms应用程序,目前我们将会话数据存储在状态服务器中。现在我们希望增加应用程序的会话超时时间。
这当然是可能的,但为此我们需要计算新的硬件要求。
因此,我们需要查看存储在会话中的对象的大小。您能否建议任何方法/工具,以帮助我们识别存储在会话中的各种对象的大小?
任何帮助或指示将不胜感激。

ars1skjm

ars1skjm1#

否,在这种情况下,您必须在将对象存储到会话之前计算对象,并确定总内存占用大小。请参阅此处了解如何获取对象大小
How to get object size in memory?

5w9g7ksd

5w9g7ksd2#

我们需要查看存储在会话中的对象的大小。
在状态服务器中,您无法看到单个会话的大小。
但是,你可以在任务管理器中看到aspnet_state.exe的内存使用情况。我相信这足以确定你需要多少内存来安装新的服务器。
如果您需要非常详细的信息,则需要启动一个新的SQL Server (仅几小时到几天) 来存储会话状态,然后查询以下内容以获取各个会话状态对象-

SELECT [sessionid],[created], datalength(SessionItemLong) 
FROM ASPStateTempSessions

其他想法

如果你正在创建一个全新的环境,我建议你看看StackExchange's Redis Cache,它也在WindowsAzure中使用。

fykwrbwg

fykwrbwg3#

使用此选项可获取存储在当前会话中的所有对象的大小:

public long GetSessionSize()
{
    long totalBytes = 0;
    System.Runtime.Serialization.Formatters.Binary.BinaryFormatter b = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
    MemoryStream m;

    try
    {
        foreach (string key in Session)
        {
            //--- First add size of key
            totalBytes += key.Length * 2;

            //--- Next add size of object if it exists
            Object x = Session[key];
            if (x != null)
            {
                m = new MemoryStream();
                b.Serialize(m, x);
                totalBytes += m.Length;
            }
        }
    }
    catch { }

    return totalBytes;
}

相关问题