在asp.net中存储和检索会话是否正确?

时间:2019-02-19 12:11:05

标签: c# asp.net-mvc

我想创建一个从会话状态中检索数据的类,是否正在按照以下方法进行操作?

我有一个静态类和静态方法来获取数据

[AuthorizeMember]
public class TestController : Controller
{
    public ActionResult list()
    {
        Session["memberid"] = 12345;
        return View();
    }

    public ActionResult iteminfo(string prodcode)
    {
        int memberid=SessionData.MemberTableId();
    }
}

public static class SessionData
{
    public static int MemberTableId()
    {
        return Convert.ToInt32(HttpContext.Current.Session[memberid]);
    }
}

1 个答案:

答案 0 :(得分:2)

静态类将在所有登录的会话中提供相同的内容。

除非您完全了解静态应用程序的工作方式,否则请避免在Web应用程序中使用静态类。

选项1:

您可以直接将值放入会话中,如代码示例所示。 好处是您不需要编写任何包装器。
缺点是任何人都将继续为会话添加任何值,并且在应用程序增长之后,没有人会知道您在会话中保留哪些数据。

选项2

或者您可以创建一个类来将所有会话值保存在一起。 每当您想读取会话值时,都始终从此类中读取。
将此类标记为可序列化,以便将来,如果要将会话状态保留在SQL Server或REDIS缓存等其他服务器上,则只需进行最小的配置更改即可。

这样,您将始终知道会话中输入的所有值。

例如您可以使用一个类来保存所有会话值

[Serializable]   //// This is required when using out of proc session state
public class MySessionState
{
    public string Username {get; set;}
    public string Role {get; set;}
    public string FirstName{get; set;}
    public string LastName {get; set;}
    public int Age{get; set;}
}

创建一个const键以引用该类对象

public const string MySessionObjectKey = "mysessionstate";

然后在控制器操作中可以像这样使用它:

public void MyAction()
{
     var sessionState = Session[MySessionObject] as MySessionState;
     if (sessionState == null)
     {
         sessionState = new MySessionState();
     }

     sessionState.FirstName = "SomeName";
     sessionState.LastName = "SomeOtherName";

     /// Process this session object


     Session[MySessionObjectKey] = sessionState;
}

希望这对您有所帮助。