簡體   English   中英

在 ClassLibrary C# 中處理會話

[英]Handle Session in ClassLibrary C#

我正在創建類庫項目來跟蹤會話值。

我不知道如何實現這一點,請指導我。

在 global.asax 文件中

session_Start() //event
{
  obj.Start(string val1,string val2);
 }

session_end()
{
   obj.End();
}

在班級圖書館項目中

Class Class_Name
{
     public void Start(string val1,string val2)
      {
          guid=Guid.NewGuid(); //for unique id for each session,
          hastable and its values;
           session[guid]=hastable_values;
       }
   public void End()
      {
       hastable t=(hastable)  session[guid]; //here is the problem,its null.

       send the hastable data to database;

      }
  }

謝謝。

您似乎對SessionApplicationState感到困惑。

Session_Start運行的那一刻,您將獲得該特定瀏覽器的新容器(由於生成了會話 cookie)。 在隨后的每次調用中,都會返回同一個會話容器以及為該會話存儲在其中的對象。 Session_End被調用時,該容器被移除。

我不確定在這兩種情況下obj是實例變量還是靜態變量,您的代碼的行為會有所不同。 我的建議是在會話中使用固定鍵保留一個Class_Name類型的實例。 這使得您始終可以檢索該實例,並且 asp.net 框架會為每個請求加載正確的唯一會話容器。

Session_Start() //event
{
     var cn = new Class_Name();
     cn.Start(string val1,string val2);
     Session["class_name"] = cn;
}

Session_end()
{
    var cn = Session["class_name"] as Class_Name;
    if (cn !=null) 
    {
         cn.End();
    }
}

在您的類庫項目和類型中,您可以存儲任何您想要的內容,只要您確保類型是可序列化的(以防您的實例需要在狀態服務器中序列化)

Class Class_Name
{
     Guid guid;
     HashTable hashtable_values;
     public void Start(string val1,string val2)
     {
          guid=Guid.NewGuid(); //for unique id for each session,
          //hastable and its values;
          // those are now already stored in the session 
     }

     public void End()
     {
        // send the hastable data to database;
        // hash_table has all the values still stored, process them at will
        // do realize that Session_End is not guaranteed to be called
        // so if you still want to store critical stuff in this phase
        // you might be missing data for some sessions    
     }
  }

如果您添加靜態工廠之類的方法和 Instance 屬性,則可以將此邏輯帶入您的類:

class Class_Name
{
    public static void StartSession(string val1, string val2)
    {
        var cn = new Class_Name();
        cn.Start(val1, val2);
        HttpContext.Current.Session["class_name"] = cn;
    }

    // all your classes that need access to theis session object will need 
    // to call this Instance property
    public static Class_Name Instance 
    {
       get 
       {
          return HttpContext.Current.Session["class_name"] as Class_Name;
       }
    }

    public static void EndSession()
    {
        var cn = Instance;
        if (cn != null) 
        {
             cn.End():
        }
    }      
}

你的全局 asax 將變成:

Session_Start() //event
{
     Class_Name.StartSession(string val1,string val2);
}

Session_end()
{
    Class_Name.EndSession();
}

msdn 上的應用程序和頁面生命周期概述。

如果您想訪問類中的會話,請使用HttpContext.Current.Session 檢查此鏈接以獲取更多信息

Class Class_Name
{
     public void Start(string val1,string val2)
      {
          guid; //for unique id for each session,
          hastable and its values;
           HttpContext.Current.Session[guid]=hastable_values;
       }
   public void End()
      {
       hastable t=(hastable)  HttpContext.Current.Session[guid]; //here is the problem,its null.

       send the hastable data to database;

      }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM