[{"data":1,"prerenderedAt":689},["ShallowReactive",2],{"blog:2006:extending_httpapplication_with_session_counts_and_uptime_in_c":3,"blogMore-Development":675,"comments-extending_httpapplication_with_session_counts_and_uptime_in_c":688},{"id":4,"title":5,"body":6,"category":657,"commentCount":121,"date":658,"description":12,"excerpt":659,"extension":660,"filenames":661,"hidden":662,"image":661,"meta":663,"minutes":71,"navigation":124,"path":664,"seo":665,"showCategory":661,"stem":666,"tags":667,"updated":661,"url":672,"wordCount":673,"__hash__":674},"content\u002Fblog\u002F2006\u002Fextending_httpapplication_with_session_counts_and_uptime_in_c.md","Extend HttpApplication with session counts and uptime",{"type":7,"value":8,"toc":655},"minimark",[9,13,21,562,565,587,590,639,645,651],[10,11,12],"p",{},"It’s sometimes useful to know or display how many people are currently using your web application and how long it’s been up for.",[10,14,15,16,20],{},"As web applications normally inherit from ",[17,18,19],"code",{},"System.Web.HttpApplication"," we can extend this class with a common re-usable class to add the required functionality.",[22,23,28],"pre",{"className":24,"code":25,"language":26,"meta":27,"style":27},"language-csharp shiki shiki-themes everforest-light dracula","public class WebApplication : System.Web.HttpApplication {\n    private static readonlyDateTime pStartedAt = DateTime.Now;\n    private static long pSessionCount = 0;\n\n    public WebApplication() : base() { }\n\n    public override void Init () {\n        base.Init();\n        HookEventHandlers();\n    }\n\n    public static long SessionCount {\n        get { return pSessionCount; }\n    }\n\n    public static DateTime StartedAt {\n        get { return pStartedAt; }\n    }\n    public static TimeSpan Uptime {\n        get { return DateTime.Now.Subtract(pStartedAt); }\n    }\n\n    private void HookEventHandlers () {\n        IHttpModule httpModule = Modules[\"Session\"];\n        if (httpModule is SessionStateModule) {\n            SessionStateModule sessionStateModule = ((SessionStateModule) httpModule);\n            sessionStateModule.Start += new System.EventHandler(SessionStart);\n            sessionStateModule.End += new System.EventHandler(SessionEnd);\n        }\n    }\n\n    private void SessionStart (object sender, EventArgs e) {\n        Interlocked.Increment(ref pSessionCount);\n    }\n\n    private void SessionEnd (object sender, EventArgs e) {\n        Interlocked.Decrement(ref pSessionCount);\n    }\n}\n","csharp","",[17,29,30,69,97,119,126,145,150,167,181,189,195,200,212,227,232,237,250,262,267,280,301,306,311,323,353,371,391,417,438,444,449,454,485,503,508,513,537,551,556],{"__ignoreMap":27},[31,32,35,39,43,47,51,55,58,61,63,66],"span",{"class":33,"line":34},"line",1,[31,36,38],{"class":37},"s9HRq","public",[31,40,42],{"class":41},"smiwp"," class",[31,44,46],{"class":45},"sPLAf"," WebApplication",[31,48,50],{"class":49},"s6Vpi"," : ",[31,52,54],{"class":53},"snuxY","System",[31,56,57],{"class":49},".",[31,59,60],{"class":53},"Web",[31,62,57],{"class":49},[31,64,65],{"class":53},"HttpApplication",[31,67,68],{"class":49}," {\n",[31,70,72,75,78,81,84,87,90,94],{"class":33,"line":71},2,[31,73,74],{"class":37},"    private",[31,76,77],{"class":37}," static",[31,79,80],{"class":53}," readonlyDateTime",[31,82,83],{"class":49}," pStartedAt ",[31,85,86],{"class":37},"=",[31,88,89],{"class":49}," DateTime.",[31,91,93],{"class":92},"sSKRk","Now",[31,95,96],{"class":49},";\n",[31,98,100,102,104,108,111,113,117],{"class":33,"line":99},3,[31,101,74],{"class":37},[31,103,77],{"class":37},[31,105,107],{"class":106},"sXAHl"," long",[31,109,110],{"class":49}," pSessionCount ",[31,112,86],{"class":37},[31,114,116],{"class":115},"s3Ipq"," 0",[31,118,96],{"class":49},[31,120,122],{"class":33,"line":121},4,[31,123,125],{"emptyLinePlaceholder":124},true,"\n",[31,127,129,132,135,138,142],{"class":33,"line":128},5,[31,130,131],{"class":37},"    public",[31,133,46],{"class":134},"sS4Kt",[31,136,137],{"class":49},"() : ",[31,139,141],{"class":140},"stJs5","base",[31,143,144],{"class":49},"() { }\n",[31,146,148],{"class":33,"line":147},6,[31,149,125],{"emptyLinePlaceholder":124},[31,151,153,155,158,161,164],{"class":33,"line":152},7,[31,154,131],{"class":37},[31,156,157],{"class":37}," override",[31,159,160],{"class":106}," void",[31,162,163],{"class":134}," Init",[31,165,166],{"class":49}," () {\n",[31,168,170,173,175,178],{"class":33,"line":169},8,[31,171,172],{"class":140},"        base",[31,174,57],{"class":49},[31,176,177],{"class":134},"Init",[31,179,180],{"class":49},"();\n",[31,182,184,187],{"class":33,"line":183},9,[31,185,186],{"class":134},"        HookEventHandlers",[31,188,180],{"class":49},[31,190,192],{"class":33,"line":191},10,[31,193,194],{"class":49},"    }\n",[31,196,198],{"class":33,"line":197},11,[31,199,125],{"emptyLinePlaceholder":124},[31,201,203,205,207,209],{"class":33,"line":202},12,[31,204,131],{"class":37},[31,206,77],{"class":37},[31,208,107],{"class":106},[31,210,211],{"class":49}," SessionCount {\n",[31,213,215,218,221,224],{"class":33,"line":214},13,[31,216,217],{"class":106},"        get",[31,219,220],{"class":49}," { ",[31,222,223],{"class":41},"return",[31,225,226],{"class":49}," pSessionCount; }\n",[31,228,230],{"class":33,"line":229},14,[31,231,194],{"class":49},[31,233,235],{"class":33,"line":234},15,[31,236,125],{"emptyLinePlaceholder":124},[31,238,240,242,244,247],{"class":33,"line":239},16,[31,241,131],{"class":37},[31,243,77],{"class":37},[31,245,246],{"class":53}," DateTime",[31,248,249],{"class":49}," StartedAt {\n",[31,251,253,255,257,259],{"class":33,"line":252},17,[31,254,217],{"class":106},[31,256,220],{"class":49},[31,258,223],{"class":41},[31,260,261],{"class":49}," pStartedAt; }\n",[31,263,265],{"class":33,"line":264},18,[31,266,194],{"class":49},[31,268,270,272,274,277],{"class":33,"line":269},19,[31,271,131],{"class":37},[31,273,77],{"class":37},[31,275,276],{"class":53}," TimeSpan",[31,278,279],{"class":49}," Uptime {\n",[31,281,283,285,287,289,291,293,295,298],{"class":33,"line":282},20,[31,284,217],{"class":106},[31,286,220],{"class":49},[31,288,223],{"class":41},[31,290,89],{"class":49},[31,292,93],{"class":92},[31,294,57],{"class":49},[31,296,297],{"class":134},"Subtract",[31,299,300],{"class":49},"(pStartedAt); }\n",[31,302,304],{"class":33,"line":303},21,[31,305,194],{"class":49},[31,307,309],{"class":33,"line":308},22,[31,310,125],{"emptyLinePlaceholder":124},[31,312,314,316,318,321],{"class":33,"line":313},23,[31,315,74],{"class":37},[31,317,160],{"class":106},[31,319,320],{"class":134}," HookEventHandlers",[31,322,166],{"class":49},[31,324,326,329,332,334,337,340,344,348,350],{"class":33,"line":325},24,[31,327,328],{"class":53},"        IHttpModule",[31,330,331],{"class":49}," httpModule ",[31,333,86],{"class":37},[31,335,336],{"class":92}," Modules",[31,338,339],{"class":49},"[",[31,341,343],{"class":342},"sciFF","\"",[31,345,347],{"class":346},"sJQOs","Session",[31,349,343],{"class":342},[31,351,352],{"class":49},"];\n",[31,354,356,359,362,365,368],{"class":33,"line":355},25,[31,357,358],{"class":41},"        if",[31,360,361],{"class":49}," (httpModule ",[31,363,364],{"class":41},"is",[31,366,367],{"class":53}," SessionStateModule",[31,369,370],{"class":49},") {\n",[31,372,374,377,380,382,385,388],{"class":33,"line":373},26,[31,375,376],{"class":53},"            SessionStateModule",[31,378,379],{"class":49}," sessionStateModule ",[31,381,86],{"class":37},[31,383,384],{"class":49}," ((",[31,386,387],{"class":53},"SessionStateModule",[31,389,390],{"class":49},") httpModule);\n",[31,392,394,397,400,403,406,409,411,414],{"class":33,"line":393},27,[31,395,396],{"class":49},"            sessionStateModule.",[31,398,399],{"class":92},"Start",[31,401,402],{"class":37}," +=",[31,404,405],{"class":41}," new",[31,407,408],{"class":53}," System",[31,410,57],{"class":49},[31,412,413],{"class":53},"EventHandler",[31,415,416],{"class":49},"(SessionStart);\n",[31,418,420,422,425,427,429,431,433,435],{"class":33,"line":419},28,[31,421,396],{"class":49},[31,423,424],{"class":92},"End",[31,426,402],{"class":37},[31,428,405],{"class":41},[31,430,408],{"class":53},[31,432,57],{"class":49},[31,434,413],{"class":53},[31,436,437],{"class":49},"(SessionEnd);\n",[31,439,441],{"class":33,"line":440},29,[31,442,443],{"class":49},"        }\n",[31,445,447],{"class":33,"line":446},30,[31,448,194],{"class":49},[31,450,452],{"class":33,"line":451},31,[31,453,125],{"emptyLinePlaceholder":124},[31,455,457,459,461,464,467,470,474,477,480,483],{"class":33,"line":456},32,[31,458,74],{"class":37},[31,460,160],{"class":106},[31,462,463],{"class":134}," SessionStart",[31,465,466],{"class":49}," (",[31,468,469],{"class":106},"object",[31,471,473],{"class":472},"s7cAX"," sender",[31,475,476],{"class":49},", ",[31,478,479],{"class":53},"EventArgs",[31,481,482],{"class":472}," e",[31,484,370],{"class":49},[31,486,488,491,494,497,500],{"class":33,"line":487},33,[31,489,490],{"class":49},"        Interlocked.",[31,492,493],{"class":134},"Increment",[31,495,496],{"class":49},"(",[31,498,499],{"class":37},"ref",[31,501,502],{"class":49}," pSessionCount);\n",[31,504,506],{"class":33,"line":505},34,[31,507,194],{"class":49},[31,509,511],{"class":33,"line":510},35,[31,512,125],{"emptyLinePlaceholder":124},[31,514,516,518,520,523,525,527,529,531,533,535],{"class":33,"line":515},36,[31,517,74],{"class":37},[31,519,160],{"class":106},[31,521,522],{"class":134}," SessionEnd",[31,524,466],{"class":49},[31,526,469],{"class":106},[31,528,473],{"class":472},[31,530,476],{"class":49},[31,532,479],{"class":53},[31,534,482],{"class":472},[31,536,370],{"class":49},[31,538,540,542,545,547,549],{"class":33,"line":539},37,[31,541,490],{"class":49},[31,543,544],{"class":134},"Decrement",[31,546,496],{"class":49},[31,548,499],{"class":37},[31,550,502],{"class":49},[31,552,554],{"class":33,"line":553},38,[31,555,194],{"class":49},[31,557,559],{"class":33,"line":558},39,[31,560,561],{"class":49},"}\n",[10,563,564],{},"The next step is to ensure your web application’s class (as defined by global.asax) is of the new WebApplication type. A good approach is to have your own Global.asax.cs file inherit directly from the new WebApplication;",[22,566,568],{"className":24,"code":567,"language":26,"meta":27,"style":27},"public class App : WebApplication { ... }\n",[17,569,570],{"__ignoreMap":27},[31,571,572,574,576,579,581,584],{"class":33,"line":34},[31,573,38],{"class":37},[31,575,42],{"class":41},[31,577,578],{"class":45}," App",[31,580,50],{"class":49},[31,582,583],{"class":53},"WebApplication",[31,585,586],{"class":49}," { ... }\n",[10,588,589],{},"Now those sessions and uptime are being tracked how do you get at them?",[22,591,593],{"className":24,"code":592,"language":26,"meta":27,"style":27},"lblCurrentSessions.Text = WebApplication.SessionCount.ToString();\nlblUptime.Text = WebApplication.Uptime.ToString();\n",[17,594,595,619],{"__ignoreMap":27},[31,596,597,600,603,606,609,612,614,617],{"class":33,"line":34},[31,598,599],{"class":49},"lblCurrentSessions.",[31,601,602],{"class":92},"Text",[31,604,605],{"class":37}," =",[31,607,608],{"class":49}," WebApplication.",[31,610,611],{"class":92},"SessionCount",[31,613,57],{"class":49},[31,615,616],{"class":134},"ToString",[31,618,180],{"class":49},[31,620,621,624,626,628,630,633,635,637],{"class":33,"line":71},[31,622,623],{"class":49},"lblUptime.",[31,625,602],{"class":92},[31,627,605],{"class":37},[31,629,608],{"class":49},[31,631,632],{"class":92},"Uptime",[31,634,57],{"class":49},[31,636,616],{"class":134},[31,638,180],{"class":49},[640,641,642],"blockquote",{},[10,643,644],{},"This approach is only suitable for sites operating on a single web server.",[10,646,647],{},[648,649,650],"em",{},"[)amien",[652,653,654],"style",{},"html pre.shiki code .s9HRq, html code.shiki .s9HRq{--shiki-default:#F57D26;--shiki-dark:#FF79C6}html pre.shiki code .smiwp, html code.shiki .smiwp{--shiki-default:#F85552;--shiki-dark:#FF79C6}html pre.shiki code .sPLAf, html code.shiki .sPLAf{--shiki-default:#3A94C5;--shiki-dark:#8BE9FD}html pre.shiki code .s6Vpi, html code.shiki .s6Vpi{--shiki-default:#5C6A72;--shiki-dark:#F8F8F2}html pre.shiki code .snuxY, html code.shiki .snuxY{--shiki-default:#3A94C5;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .sSKRk, html code.shiki .sSKRk{--shiki-default:#35A77C;--shiki-dark:#F8F8F2}html pre.shiki code .sXAHl, html code.shiki .sXAHl{--shiki-default:#3A94C5;--shiki-dark:#FF79C6}html pre.shiki code .s3Ipq, html code.shiki .s3Ipq{--shiki-default:#DF69BA;--shiki-dark:#BD93F9}html pre.shiki code .sS4Kt, html code.shiki .sS4Kt{--shiki-default:#8DA101;--shiki-dark:#50FA7B}html pre.shiki code .stJs5, html code.shiki .stJs5{--shiki-default:#5C6A72;--shiki-default-font-style:inherit;--shiki-dark:#BD93F9;--shiki-dark-font-style:italic}html pre.shiki code .sciFF, html code.shiki .sciFF{--shiki-default:#8DA101;--shiki-dark:#E9F284}html pre.shiki code .sJQOs, html code.shiki .sJQOs{--shiki-default:#8DA101;--shiki-dark:#F1FA8C}html pre.shiki code .s7cAX, html code.shiki .s7cAX{--shiki-default:#5C6A72;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}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":27,"searchDepth":71,"depth":71,"links":656},[],"Development","2006-06-06T19:43:54+00:00","[object Object]","md",null,false,{},"\u002Fblog\u002F2006\u002Fextending_httpapplication_with_session_counts_and_uptime_in_c",{"title":5,"description":12},"blog\u002F2006\u002Fextending_httpapplication_with_session_counts_and_uptime_in_c",[668,669,670,671],".NET","ASP.NET","webdev","C#","\u002Fblog\u002F2006\u002Fextending_httpapplication_with_session_counts_and_uptime_in_c\u002F",409,"KOID48VPF3aukcLfAKJpY8hr3ak5N6rpRH8XCCeXG7w",[676,680,684],{"title":677,"date":678,"url":679},"Transactions in the MongoDB EF Core Provider","2025-10-25","\u002Fblog\u002F2025\u002Fmongodb-explicit-transactions\u002F",{"title":681,"date":682,"url":683},"Queryable Encryption with the MongoDB EF Core Provider","2025-09-22","\u002Fblog\u002F2025\u002Fmongodb-queryable-encryption\u002F",{"title":685,"date":686,"url":687},"Lazy Loading with EF Core Proxies","2025-04-02","\u002Fblog\u002F2025\u002Fef-proxies\u002F",[],1780900533242]