【问题标题】:How to find out size of session in ASP.NET from web application?如何从 Web 应用程序中找出 ASP.NET 中的会话大小?
【发布时间】:2010-09-16 22:03:46
【问题描述】:

如何从 Web 应用程序中找出 ASP.NET 中的会话大小?

【问题讨论】:

    标签: asp.net session size


    【解决方案1】:

    如果您想在运行时而不是在调试跟踪中获取 Session 的大小,您可能想尝试这样的事情:

    long totalSessionBytes = 0;
    BinaryFormatter b = new BinaryFormatter();
    MemoryStream m;
    foreach(var obj in Session) 
    {
      m = new MemoryStream();
      b.Serialize(m, obj);
      totalSessionBytes += m.Length;
    }
    

    (灵感来自http://www.codeproject.com/KB/session/exploresessionandcache.aspx

    【讨论】:

    • 我需要进行以下更改:long totalSessionBytes = 0;因为 m.Length 返回一个长整数。但除此之外,它还是一段非常简洁的代码!循环也可以是 foreach。 ;-)
    • @Oliver 感谢您的反馈。我做了你建议的调整。现在看起来好多了。
    • 这不可能。我有 793 回来了,这似乎非常低。
    • @dlatikay 您的编辑可能会被拒绝,即使它修复了错误。你应该考虑用你的改变写一个新的答案。
    • 好的,明白了。在修复已接受的错误答案时,在 SO 政策中还不是那么坚定(请参阅此处的以前的 cmets)。将取决于审查的最终结果。
    【解决方案2】:

    上面答案中的代码一直给我相同的数字。这是最终对我有用的代码:

    private void ShowSessionSize()
    {
        Page.Trace.Write("Session Trace Info");
    
        long totalSessionBytes = 0;
        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter b = 
            new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
        System.IO.MemoryStream m;
        foreach (string key in Session)
        {
            var obj = Session[key];
            m = new System.IO.MemoryStream();
            b.Serialize(m, obj);
            totalSessionBytes += m.Length;
    
            Page.Trace.Write(String.Format("{0}: {1:n} kb", key, m.Length / 1024));
        }
    
        Page.Trace.Write(String.Format("Total Size of Session Data: {0:n} kb", 
           totalSessionBytes / 1024));
    }
    

    【讨论】:

    • 您应该在尝试序列化之前添加一个检查以确保对象不为空。
    • 我不想小气,但大小实际上是 kB(千字节),而不是 kb(千字节):-)
    【解决方案3】:

    我认为您可以通过将 Trace="true" 添加到 aspx 页面的页面指令来找到该信息。然后当页面加载时,您可以看到有关页面请求的大量详细信息,包括我认为的会话信息。

    您还可以通过在 web.config 文件中添加一行来在整个应用程序中启用跟踪。比如:

    <trace enabled="true" requestLimit="10" pageOutput="true" traceMode="SortByTime" 
     localOnly="true"/>
    

    【讨论】:

      【解决方案4】:

      这是我将所有当前 Session 变量及其大小(以 kB 为单位)放入字典的代码。

      // <KEY, SIZE(kB)>
      var dict = new Dictionary<string, decimal>();
      
      BinaryFormatter b = new BinaryFormatter();
      MemoryStream m;
      foreach(string key in Session.Keys) 
      {
          var obj = Session[key];
          if (obj == null)
          {
              dict.Add(key, -1);
          }
          else
          {
              m = new MemoryStream();
              b.Serialize(m, obj);
              
              //save the key and size in kB (rounded to two decimals)
              dict.Add(key, Math.Round(Convert.ToDecimal(m.Length) / 1024, 2)); 
          }
      }
      
      //return dict
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 2013-06-03
        • 2013-05-31
        • 1970-01-01
        • 1970-01-01
        • 2013-03-10
        • 2011-01-02
        相关资源
        最近更新 更多