[{"data":1,"prerenderedAt":749},["ShallowReactive",2],{"blog:2007:typed-session-data-made-easier-still":3,"blogMore-Development":585,"comments-typed-session-data-made-easier-still":598},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"category":11,"tags":12,"excerpt":16,"body":44,"_type":577,"_id":578,"_source":579,"_file":580,"_stem":581,"_extension":582,"url":583,"wordCount":584,"minutes":126,"commentCount":181},"/blog/2007/typed-session-data-made-easier-still","2007",false,"en","Typed session data in ASP.NET made easier still","Philippe Leybaert is unimpressed with Microsoft’s Web Client Software Factory approach for typed session data and offers his own Typed session data made (very) easy which still seems overkill to me comprising as it does of generics, a delegate a helper class to achieve the desired effect. (While you are there check out his very interesting MVC project for ASP.NET called ProMesh)","2007-08-03T06:51:34+00:00","Development",[13,14,15],".NET","ASP.NET","C#",{"type":17,"children":18},"root",[19,39],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24,27,29,31,33,35,37],{"type":25,"value":26},"text","Philippe Leybaert is unimpressed with ",{"type":25,"value":28},"Microsoft’s Web Client Software Factory approach for typed session data",{"type":25,"value":30}," and offers his own ",{"type":25,"value":32},"Typed session data made (very) easy",{"type":25,"value":34}," which still seems overkill to me comprising as it does of generics, a delegate a helper class to achieve the desired effect. (While you are there check out his very interesting MVC project for ASP.NET called ",{"type":25,"value":36},"ProMesh",{"type":25,"value":38},")",{"type":20,"tag":21,"props":40,"children":41},{},[42],{"type":25,"value":43},"The solution which I have been using since my .NET 1.1 days is much simpler still and involves nothing more than creating a plain class with properties for every session variable and a static get accessor that obtains or creates it on the HttpContext similar to a singleton.",{"type":17,"children":45,"toc":575},[46,73,77,82,461,466,550,555,560,569],{"type":20,"tag":21,"props":47,"children":48},{},[49,50,58,59,65,66,72],{"type":25,"value":26},{"type":20,"tag":51,"props":52,"children":56},"a",{"href":53,"rel":54},"https://www.davidhayden.com/blog/dave/archive/2007/02/24/WebClientSoftwareFactorySessionStateStateValueT.aspx",[55],"nofollow",[57],{"type":25,"value":28},{"type":25,"value":30},{"type":20,"tag":51,"props":60,"children":63},{"href":61,"rel":62},"https://www.blog.activa.be/2007/08/01/TypedSessionDataMadeVeryEasy.aspx",[55],[64],{"type":25,"value":32},{"type":25,"value":34},{"type":20,"tag":51,"props":67,"children":70},{"href":68,"rel":69},"https://www.blog.activa.be/2007/07/31/ProMeshNETPreviewExampleProjectAvailableForDownload.aspx",[55],[71],{"type":25,"value":36},{"type":25,"value":38},{"type":20,"tag":21,"props":74,"children":75},{},[76],{"type":25,"value":43},{"type":20,"tag":21,"props":78,"children":79},{},[80],{"type":25,"value":81},"Here’s an example with the important Current property (slightly cleaned up and improved for this post ;-)",{"type":20,"tag":83,"props":84,"children":89},"pre",{"className":85,"code":86,"language":87,"meta":88,"style":88},"language-csharp shiki shiki-themes everforest-light dracula","public class MySession {\n  public string Name;\n  public int LoginID;\n  public int CustomerID;\n\n  public static MySession Current {\n    get {\n      MySession currentSession = HttpContext.Current.Session[\"_session\"] as MySession;\n      if (currentSession == null) {\n        currentSession = new MySession();\n        HttpContext.Current.Session[\"_session\"] = currentSession;\n      }\n      return currentSession;\n    }\n  }\n}\n","csharp","",[90],{"type":20,"tag":91,"props":92,"children":93},"code",{"__ignoreMap":88},[94,124,144,162,179,189,212,225,305,335,362,412,421,434,443,452],{"type":20,"tag":95,"props":96,"children":99},"span",{"class":97,"line":98},"line",1,[100,106,112,118],{"type":20,"tag":95,"props":101,"children":103},{"style":102},"--shiki-default:#F57D26;--shiki-dark:#FF79C6",[104],{"type":25,"value":105},"public",{"type":20,"tag":95,"props":107,"children":109},{"style":108},"--shiki-default:#F85552;--shiki-dark:#FF79C6",[110],{"type":25,"value":111}," class",{"type":20,"tag":95,"props":113,"children":115},{"style":114},"--shiki-default:#3A94C5;--shiki-dark:#8BE9FD",[116],{"type":25,"value":117}," MySession",{"type":20,"tag":95,"props":119,"children":121},{"style":120},"--shiki-default:#5C6A72;--shiki-dark:#F8F8F2",[122],{"type":25,"value":123}," {\n",{"type":20,"tag":95,"props":125,"children":127},{"class":97,"line":126},2,[128,133,139],{"type":20,"tag":95,"props":129,"children":130},{"style":102},[131],{"type":25,"value":132},"  public",{"type":20,"tag":95,"props":134,"children":136},{"style":135},"--shiki-default:#3A94C5;--shiki-dark:#FF79C6",[137],{"type":25,"value":138}," string",{"type":20,"tag":95,"props":140,"children":141},{"style":120},[142],{"type":25,"value":143}," Name;\n",{"type":20,"tag":95,"props":145,"children":147},{"class":97,"line":146},3,[148,152,157],{"type":20,"tag":95,"props":149,"children":150},{"style":102},[151],{"type":25,"value":132},{"type":20,"tag":95,"props":153,"children":154},{"style":135},[155],{"type":25,"value":156}," int",{"type":20,"tag":95,"props":158,"children":159},{"style":120},[160],{"type":25,"value":161}," LoginID;\n",{"type":20,"tag":95,"props":163,"children":165},{"class":97,"line":164},4,[166,170,174],{"type":20,"tag":95,"props":167,"children":168},{"style":102},[169],{"type":25,"value":132},{"type":20,"tag":95,"props":171,"children":172},{"style":135},[173],{"type":25,"value":156},{"type":20,"tag":95,"props":175,"children":176},{"style":120},[177],{"type":25,"value":178}," CustomerID;\n",{"type":20,"tag":95,"props":180,"children":182},{"class":97,"line":181},5,[183],{"type":20,"tag":95,"props":184,"children":186},{"emptyLinePlaceholder":185},true,[187],{"type":25,"value":188},"\n",{"type":20,"tag":95,"props":190,"children":192},{"class":97,"line":191},6,[193,197,202,207],{"type":20,"tag":95,"props":194,"children":195},{"style":102},[196],{"type":25,"value":132},{"type":20,"tag":95,"props":198,"children":199},{"style":102},[200],{"type":25,"value":201}," static",{"type":20,"tag":95,"props":203,"children":205},{"style":204},"--shiki-default:#3A94C5;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic",[206],{"type":25,"value":117},{"type":20,"tag":95,"props":208,"children":209},{"style":120},[210],{"type":25,"value":211}," Current {\n",{"type":20,"tag":95,"props":213,"children":215},{"class":97,"line":214},7,[216,221],{"type":20,"tag":95,"props":217,"children":218},{"style":135},[219],{"type":25,"value":220},"    get",{"type":20,"tag":95,"props":222,"children":223},{"style":120},[224],{"type":25,"value":123},{"type":20,"tag":95,"props":226,"children":228},{"class":97,"line":227},8,[229,234,239,244,249,255,260,265,270,276,282,286,291,296,300],{"type":20,"tag":95,"props":230,"children":231},{"style":204},[232],{"type":25,"value":233},"      MySession",{"type":20,"tag":95,"props":235,"children":236},{"style":120},[237],{"type":25,"value":238}," currentSession ",{"type":20,"tag":95,"props":240,"children":241},{"style":102},[242],{"type":25,"value":243},"=",{"type":20,"tag":95,"props":245,"children":246},{"style":120},[247],{"type":25,"value":248}," HttpContext.",{"type":20,"tag":95,"props":250,"children":252},{"style":251},"--shiki-default:#35A77C;--shiki-dark:#F8F8F2",[253],{"type":25,"value":254},"Current",{"type":20,"tag":95,"props":256,"children":257},{"style":120},[258],{"type":25,"value":259},".",{"type":20,"tag":95,"props":261,"children":262},{"style":251},[263],{"type":25,"value":264},"Session",{"type":20,"tag":95,"props":266,"children":267},{"style":120},[268],{"type":25,"value":269},"[",{"type":20,"tag":95,"props":271,"children":273},{"style":272},"--shiki-default:#8DA101;--shiki-dark:#E9F284",[274],{"type":25,"value":275},"\"",{"type":20,"tag":95,"props":277,"children":279},{"style":278},"--shiki-default:#8DA101;--shiki-dark:#F1FA8C",[280],{"type":25,"value":281},"_session",{"type":20,"tag":95,"props":283,"children":284},{"style":272},[285],{"type":25,"value":275},{"type":20,"tag":95,"props":287,"children":288},{"style":120},[289],{"type":25,"value":290},"] ",{"type":20,"tag":95,"props":292,"children":293},{"style":108},[294],{"type":25,"value":295},"as",{"type":20,"tag":95,"props":297,"children":298},{"style":204},[299],{"type":25,"value":117},{"type":20,"tag":95,"props":301,"children":302},{"style":120},[303],{"type":25,"value":304},";\n",{"type":20,"tag":95,"props":306,"children":308},{"class":97,"line":307},9,[309,314,319,324,330],{"type":20,"tag":95,"props":310,"children":311},{"style":108},[312],{"type":25,"value":313},"      if",{"type":20,"tag":95,"props":315,"children":316},{"style":120},[317],{"type":25,"value":318}," (currentSession ",{"type":20,"tag":95,"props":320,"children":321},{"style":102},[322],{"type":25,"value":323},"==",{"type":20,"tag":95,"props":325,"children":327},{"style":326},"--shiki-default:#DF69BA;--shiki-dark:#BD93F9",[328],{"type":25,"value":329}," null",{"type":20,"tag":95,"props":331,"children":332},{"style":120},[333],{"type":25,"value":334},") {\n",{"type":20,"tag":95,"props":336,"children":338},{"class":97,"line":337},10,[339,344,348,353,357],{"type":20,"tag":95,"props":340,"children":341},{"style":120},[342],{"type":25,"value":343},"        currentSession ",{"type":20,"tag":95,"props":345,"children":346},{"style":102},[347],{"type":25,"value":243},{"type":20,"tag":95,"props":349,"children":350},{"style":108},[351],{"type":25,"value":352}," new",{"type":20,"tag":95,"props":354,"children":355},{"style":204},[356],{"type":25,"value":117},{"type":20,"tag":95,"props":358,"children":359},{"style":120},[360],{"type":25,"value":361},"();\n",{"type":20,"tag":95,"props":363,"children":365},{"class":97,"line":364},11,[366,371,375,379,383,387,391,395,399,403,407],{"type":20,"tag":95,"props":367,"children":368},{"style":120},[369],{"type":25,"value":370},"        HttpContext.",{"type":20,"tag":95,"props":372,"children":373},{"style":251},[374],{"type":25,"value":254},{"type":20,"tag":95,"props":376,"children":377},{"style":120},[378],{"type":25,"value":259},{"type":20,"tag":95,"props":380,"children":381},{"style":251},[382],{"type":25,"value":264},{"type":20,"tag":95,"props":384,"children":385},{"style":120},[386],{"type":25,"value":269},{"type":20,"tag":95,"props":388,"children":389},{"style":272},[390],{"type":25,"value":275},{"type":20,"tag":95,"props":392,"children":393},{"style":278},[394],{"type":25,"value":281},{"type":20,"tag":95,"props":396,"children":397},{"style":272},[398],{"type":25,"value":275},{"type":20,"tag":95,"props":400,"children":401},{"style":120},[402],{"type":25,"value":290},{"type":20,"tag":95,"props":404,"children":405},{"style":102},[406],{"type":25,"value":243},{"type":20,"tag":95,"props":408,"children":409},{"style":120},[410],{"type":25,"value":411}," currentSession;\n",{"type":20,"tag":95,"props":413,"children":415},{"class":97,"line":414},12,[416],{"type":20,"tag":95,"props":417,"children":418},{"style":120},[419],{"type":25,"value":420},"      }\n",{"type":20,"tag":95,"props":422,"children":424},{"class":97,"line":423},13,[425,430],{"type":20,"tag":95,"props":426,"children":427},{"style":108},[428],{"type":25,"value":429},"      return",{"type":20,"tag":95,"props":431,"children":432},{"style":120},[433],{"type":25,"value":411},{"type":20,"tag":95,"props":435,"children":437},{"class":97,"line":436},14,[438],{"type":20,"tag":95,"props":439,"children":440},{"style":120},[441],{"type":25,"value":442},"    }\n",{"type":20,"tag":95,"props":444,"children":446},{"class":97,"line":445},15,[447],{"type":20,"tag":95,"props":448,"children":449},{"style":120},[450],{"type":25,"value":451},"  }\n",{"type":20,"tag":95,"props":453,"children":455},{"class":97,"line":454},16,[456],{"type":20,"tag":95,"props":457,"children":458},{"style":120},[459],{"type":25,"value":460},"}\n",{"type":20,"tag":21,"props":462,"children":463},{},[464],{"type":25,"value":465},"Using the session data then simply involves operations like:",{"type":20,"tag":83,"props":467,"children":469},{"className":85,"code":468,"language":87,"meta":88,"style":88},"MySession.Current.Name = NameTextBox.Text;\nNameLabel.Text = MySession.Current.Name;\n",[470],{"type":20,"tag":91,"props":471,"children":472},{"__ignoreMap":88},[473,513],{"type":20,"tag":95,"props":474,"children":475},{"class":97,"line":98},[476,481,485,489,494,499,504,509],{"type":20,"tag":95,"props":477,"children":478},{"style":120},[479],{"type":25,"value":480},"MySession.",{"type":20,"tag":95,"props":482,"children":483},{"style":251},[484],{"type":25,"value":254},{"type":20,"tag":95,"props":486,"children":487},{"style":120},[488],{"type":25,"value":259},{"type":20,"tag":95,"props":490,"children":491},{"style":251},[492],{"type":25,"value":493},"Name",{"type":20,"tag":95,"props":495,"children":496},{"style":102},[497],{"type":25,"value":498}," =",{"type":20,"tag":95,"props":500,"children":501},{"style":120},[502],{"type":25,"value":503}," NameTextBox.",{"type":20,"tag":95,"props":505,"children":506},{"style":251},[507],{"type":25,"value":508},"Text",{"type":20,"tag":95,"props":510,"children":511},{"style":120},[512],{"type":25,"value":304},{"type":20,"tag":95,"props":514,"children":515},{"class":97,"line":126},[516,521,525,529,534,538,542,546],{"type":20,"tag":95,"props":517,"children":518},{"style":120},[519],{"type":25,"value":520},"NameLabel.",{"type":20,"tag":95,"props":522,"children":523},{"style":251},[524],{"type":25,"value":508},{"type":20,"tag":95,"props":526,"children":527},{"style":102},[528],{"type":25,"value":498},{"type":20,"tag":95,"props":530,"children":531},{"style":120},[532],{"type":25,"value":533}," MySession.",{"type":20,"tag":95,"props":535,"children":536},{"style":251},[537],{"type":25,"value":254},{"type":20,"tag":95,"props":539,"children":540},{"style":120},[541],{"type":25,"value":259},{"type":20,"tag":95,"props":543,"children":544},{"style":251},[545],{"type":25,"value":493},{"type":20,"tag":95,"props":547,"children":548},{"style":120},[549],{"type":25,"value":304},{"type":20,"tag":21,"props":551,"children":552},{},[553],{"type":25,"value":554},"This solution is a lot clearer however all of these solutions use HttpContext.Session which is actually supposed to be there for compatibility with ASP.",{"type":20,"tag":21,"props":556,"children":557},{},[558],{"type":25,"value":559},"Ideally Microsoft would provide us with an option in web.config whereby we can choose our session class and it would just instantiate and track it as part of the session life-cycle.",{"type":20,"tag":21,"props":561,"children":562},{},[563],{"type":20,"tag":564,"props":565,"children":566},"em",{},[567],{"type":25,"value":568},"[)amien",{"type":20,"tag":570,"props":571,"children":572},"style",{},[573],{"type":25,"value":574},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":88,"searchDepth":126,"depth":126,"links":576},[],"markdown","content:blog:2007:typed-session-data-made-easier-still.md","content","blog/2007/typed-session-data-made-easier-still.md","blog/2007/typed-session-data-made-easier-still","md","/blog/2007/typed-session-data-made-easier-still/",308,[586,590,594],{"title":587,"date":588,"url":589},"HTML5 Video Cheatsheet: Optimizing videos for the web","2025-12-05T00:00:00Z","/blog/2025/html5-video-cheatsheet/",{"title":591,"date":592,"url":593},"Transactions in the MongoDB EF Core Provider","2025-10-25","/blog/2025/mongodb-explicit-transactions/",{"title":595,"date":596,"url":597},"Queryable Encryption with the MongoDB EF Core Provider","2025-09-22","/blog/2025/mongodb-queryable-encryption/",[599,620,651,691,728],{"_path":600,"_dir":601,"_draft":6,"_partial":6,"_locale":7,"title":602,"description":603,"id":604,"name":605,"email":606,"avatar":607,"date":608,"body":609,"_type":577,"_id":617,"_source":579,"_file":618,"_stem":619,"_extension":582},"/comments/typed-session-data-made-easier-still/8930","typed-session-data-made-easier-still","8930","Thank it is very easy to understand and workable.",8930,"ashis","ashish@hitechvalley.net","https://www.gravatar.com/avatar/b6639bd76b76f24fb6286d20da773c92?r=pg&d=retro","2008-06-29T09:01:15",{"type":17,"children":610,"toc":615},[611],{"type":20,"tag":21,"props":612,"children":613},{},[614],{"type":25,"value":603},{"title":88,"searchDepth":126,"depth":126,"links":616},[],"content:comments:typed-session-data-made-easier-still:8930.md","comments/typed-session-data-made-easier-still/8930.md","comments/typed-session-data-made-easier-still/8930",{"_path":621,"_dir":601,"_draft":6,"_partial":6,"_locale":7,"title":622,"description":623,"id":624,"name":625,"email":626,"avatar":627,"url":628,"date":629,"body":630,"_type":577,"_id":648,"_source":579,"_file":649,"_stem":650,"_extension":582},"/comments/typed-session-data-made-easier-still/1959","1959","There is nothing actually stopping you from creating more than one of these classes as long as each uses a different dictionary key in the get property.",1959,"Damien Guard","damien@envytech.co.uk","https://www.gravatar.com/avatar/dc72963e7279d34c85ed4c0b731ce5a9?r=pg&d=retro","https://damieng.com/","2007-08-03T18:05:49",{"type":17,"children":631,"toc":646},[632,636,641],{"type":20,"tag":21,"props":633,"children":634},{},[635],{"type":25,"value":623},{"type":20,"tag":21,"props":637,"children":638},{},[639],{"type":25,"value":640},"Defaults can be handled by specifying them in the MySession class.",{"type":20,"tag":21,"props":642,"children":643},{},[644],{"type":25,"value":645},"The additional overhead of unused variables could well be an issue if you have a large number of sessions that only use a subset of the session variables.",{"title":88,"searchDepth":126,"depth":126,"links":647},[],"content:comments:typed-session-data-made-easier-still:1959.md","comments/typed-session-data-made-easier-still/1959.md","comments/typed-session-data-made-easier-still/1959",{"_path":652,"_dir":601,"_draft":6,"_partial":6,"_locale":7,"title":653,"description":654,"id":655,"name":656,"email":657,"avatar":658,"date":659,"body":660,"_type":577,"_id":688,"_source":579,"_file":689,"_stem":690,"_extension":582},"/comments/typed-session-data-made-easier-still/1958","1958","Your solution is indeed simpler, but it has some important limitations:",1958,"Philippe Leybaert","philippe@activa.be","https://www.gravatar.com/avatar/ddb70db3da6c927a557ed3f9a3395f41?r=pg&d=retro","2007-08-03T15:28:20",{"type":17,"children":661,"toc":686},[662,666,671,676,681],{"type":20,"tag":21,"props":663,"children":664},{},[665],{"type":25,"value":654},{"type":20,"tag":21,"props":667,"children":668},{},[669],{"type":25,"value":670},"All fields are stored in the session, even if you don't use them (meaning it is not suitable if you have a lot of session variables).",{"type":20,"tag":21,"props":672,"children":673},{},[674],{"type":25,"value":675},"There is no way to specify defaults that will be returned when there's nothing in the session.",{"type":20,"tag":21,"props":677,"children":678},{},[679],{"type":25,"value":680},"All session variables have to be defined in the same class.",{"type":20,"tag":21,"props":682,"children":683},{},[684],{"type":25,"value":685},"But, indeed, in certain cases your solution is very nice.",{"title":88,"searchDepth":126,"depth":126,"links":687},[],"content:comments:typed-session-data-made-easier-still:1958.md","comments/typed-session-data-made-easier-still/1958.md","comments/typed-session-data-made-easier-still/1958",{"_path":692,"_dir":601,"_draft":6,"_partial":6,"_locale":7,"title":693,"description":694,"id":695,"name":625,"email":626,"avatar":627,"url":628,"date":696,"body":697,"_type":577,"_id":725,"_source":579,"_file":726,"_stem":727,"_extension":582},"/comments/typed-session-data-made-easier-still/1957","1957","While it is true you can't have something like:",1957,"2007-08-03T13:22:28",{"type":17,"children":698,"toc":723},[699,703,708,713,718],{"type":20,"tag":21,"props":700,"children":701},{},[702],{"type":25,"value":694},{"type":20,"tag":21,"props":704,"children":705},{},[706],{"type":25,"value":707},"\u003Casp:SessionParameter DefaultValue=\"-1\" Name=\"CustomerID\" SessionField=\"CustomerID\" Type=\"Int32\" />",{"type":20,"tag":21,"props":709,"children":710},{},[711],{"type":25,"value":712},"There is nothing stopping you doing:",{"type":20,"tag":21,"props":714,"children":715},{},[716],{"type":25,"value":717},"SqlDataSource1.SelectParameters.Add(\"CustomerID\", MySession.Current.CustomerID);",{"type":20,"tag":21,"props":719,"children":720},{},[721],{"type":25,"value":722},"In the code-behind.",{"title":88,"searchDepth":126,"depth":126,"links":724},[],"content:comments:typed-session-data-made-easier-still:1957.md","comments/typed-session-data-made-easier-still/1957.md","comments/typed-session-data-made-easier-still/1957",{"_path":729,"_dir":601,"_draft":6,"_partial":6,"_locale":7,"title":730,"description":731,"id":732,"name":733,"email":734,"avatar":735,"url":736,"date":737,"body":738,"_type":577,"_id":746,"_source":579,"_file":747,"_stem":748,"_extension":582},"/comments/typed-session-data-made-easier-still/1956","1956","Nice idea, though won't work with bound controls which use session data as parameters to their data source.",1956,"Rik Hemsley","rik@rikkus.info","https://www.gravatar.com/avatar/22e33503870d8e20493c4dd6b2f9767f?r=pg&d=retro","https://rikkus.info/","2007-08-03T13:06:19",{"type":17,"children":739,"toc":744},[740],{"type":20,"tag":21,"props":741,"children":742},{},[743],{"type":25,"value":731},{"title":88,"searchDepth":126,"depth":126,"links":745},[],"content:comments:typed-session-data-made-easier-still:1956.md","comments/typed-session-data-made-easier-still/1956.md","comments/typed-session-data-made-easier-still/1956",1779264592143]