Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
asp.net中的强类型会话_Asp.net_Session_Session State_Session Variables - Fatal编程技术网

asp.net中的强类型会话

asp.net中的强类型会话,asp.net,session,session-state,session-variables,Asp.net,Session,Session State,Session Variables,如果已经有人问过这个问题,请原谅HttpContext.Current.Session[“key”]返回一个对象,我们必须将其强制转换为特定的类型才能使用它。我正在研究类型化会话的各种实现 我觉得如果我们想在会话中添加一个新的类型的对象,我们需要在SessionManager中添加更多的代码(如果我错了,请纠正我),无论是作为一个方法还是作为一个单独的包装器。我想我们可以用仿制药 public static class SessionManager<T> where T:clas

如果已经有人问过这个问题,请原谅
HttpContext.Current.Session[“key”]
返回一个对象,我们必须将其强制转换为特定的
类型才能使用它。我正在研究类型化会话的各种实现

我觉得如果我们想在会话中添加一个新的
类型
的对象,我们需要在SessionManager中添加更多的代码(如果我错了,请纠正我),无论是作为一个方法还是作为一个单独的包装器。我想我们可以用仿制药

public static class SessionManager<T> where T:class
 {
  public void SetSession(string key,object objToStore)
  {
   HttpContext.Current.Session[key] = objToStore;
  }

  public T GetSession(string key)
  {
   return HttpContext.Current.Session[key] as T;
  }

 }
  • 我也在想这会很好 有点像
SessionManager[“sessionString”]=objtostreasion
, 但是发现静态类不能有索引器。有没有其他方法可以做到这一点

  • 我的想法是创建一个SessionObject,它将存储
    类型和对象,然后使用键将该对象添加到Session(使用SessionManager)。检索时,将所有对象强制转换为
    SessionObject
    ,获取类型(比如t)和对象(比如obj),并将
    obj
    强制转换为
    t
    ,然后返回它

    公共类SessionObject
    {
    公共类型类型{get;set;}
    公共对象obj{get;set;}
    }

这将不起作用(因为返回签名将是相同的,但返回类型将不同)


是否有其他优雅的方式以更安全的方式保存/检索会话中的对象实际上,如果要键入对象,请将类型放在方法级别,如:

public T GetValue<T>(string sessionKey)
{

}

这是静态工厂实现,但它也通过对会话管理器类的静态引用在内部维护一个单点联系。sessionmanager中的每个方法都可以包装现有的ASP.NET会话,或者使用您自己的内部存储。

要获得一种非常干净、可维护且灵活的会话处理方法,请参阅此。您会惊讶于它的简单程度。

该技术的一个缺点是,使用代码时需要知道存储和检索所使用的键。这很容易出错,因为密钥需要完全正确,否则可能会存储在错误的位置,或者返回空值


我实际上使用了强类型变体,因为我知道会话中需要什么,因此可以设置包装类来适应。我宁愿在session类中有额外的代码,也不必担心其他地方的键字符串。

您可以简单地为会话对象使用单例模式。这样,您就可以从单个复合结构对象对整个会话进行建模。这篇文章引用了我正在谈论的内容,并将会话对象作为弱类型对象进行了讨论:

我发布了一个关于StackOverflow问题的解决方案

我认为它非常流畅,包含的代码很少。它需要.NET4.5是最流畅的,但在旧版本中仍然是可能的

它允许:

int myInt = SessionVars.MyInt; 
SessionVars.MyInt = 3;
完全按照以下方式工作:

int myInt = (int)Session["MyInt"];
Session["MyInt"] = 3;

尽管这是一篇很好的文章,但从特定于会话的类派生类不会让您从任何其他抽象类/基类派生类class@Ram是的,在我的帖子中,类的要点是它是您希望在会话中存储的任何项目的包装器。正如我希望你们注意到的,这真的是再容易不过了。它真的能在进程外工作吗?因为会话对象永远不会写回会话存储,所以会话存储中仍将包含以前序列化的旧值。@回答中的链接似乎已失效。是的,同意您的说法。我认为为会话字符串设置SessionManager.Constants是一种标准实现,可以避免输入错误
int myInt = SessionVars.MyInt; 
SessionVars.MyInt = 3;
int myInt = (int)Session["MyInt"];
Session["MyInt"] = 3;