簡體   English   中英

ASP.NET中的請求或服務器特有的靜態類實例?

[英]static class instances unique to a request or a server in ASP.NET?

 public sealed class UserLoginSingleton
{

     UserLoginCollection _userLoginCol = new UserLoginCollection();

    UserLoginSingleton()
    {
    }

    public static UserLoginSingleton Instance
    {
        get
        {
            IDictionary items = HttpContext.Current.Items;
            if (!items.Contains("TheInstance"))
            {
                items["TheInstance"] = new UserLoginSingleton();

            }
            return items["TheInstance"] as UserLoginSingleton;
        }
    }


    public void CreateUserObj(string xmlData)
    {
        _userLoginCol = (UserLoginCollection)_xmlUtil.Deserialize(xmlData, typeof(UserLoginCollection));
    }

    public UserLoginCollection getUserObj()
    {
        return _userLoginCol;
    }
}

用法:

第1.aspx頁

UserLoginSingleton.Instance.CreateUserObj(xml);

Pase2.aspx:

UserLoginCollection userLoginCollection = UserLoginSingleton.Instance.getUserObj();

點擊這里的文章: 鏈接文字

我在第1頁中設置了我的集合對象,然后執行response.redirect或單擊鏈接以獲取第2.aspx頁。 但是,我的單例實例沒有設置的集合對象。 如何在每個會話中跨多個頁面保留我的集合對象?

我知道靜態不會工作,因為每個實例都會看到對象,我希望每個用戶具體。

HttpContext.Items集合是按請求的。 因此,在您將用戶重定向到page2.aspx的情況下,您在第1頁上創建的實例已消失。 要使相同的實例跨請求可用,您需要使用HttpContext.Session來存儲您的實例。

靜態字段在請求之間共享。 注意標准的多線程問題!

請求之間不共享HttpContext實例。

也許我需要重新思考我想做的事情。 基本上我的集合是圍繞下拉列表的不同值的集合。 這是由客戶端提供的,我的網頁需要顯示它。

我想客戶端可以將它作為序列化數據發送給我,我給了他們xsd,他們會在登錄時異步發送給我。 第1頁將收到序列化數據。 登錄頁面將登錄。一旦page1收到數據,將反序列化為我的強類型集合,反過來將用於在page2.aspx中構建下拉列表

為什么我這樣做是以原始方式進行的。 我的雙手被限制捆綁,我試圖不使用會話狀態來保存這個對象,如果我可以避免它。

每個用戶登錄都有下拉列表的各種選項。 user 1 caan有10個選項,user 2可以有200個選項。

只是要指出你的單例實現是錯誤的,你的單例應該像這樣聲明

public sealed class Singleton
{
    static readonly Singleton instance=new Singleton();

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}

使用讀取HttpSession而不是靜態變量的靜態方法:


public class UserLoginController
{
    public static UserLoginController Instance
    {
        get
        {
            HttpSession session = HttpContext.Current.Session;
            if (session["UserLoginController"] == null)
            {
                session["UserLoginController"] = new UserLoginController();
            }
            return session["UserLoginController"] as UserLoginController;
        }
    }
}

暫無
暫無

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

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