From 33dccaba584eb9a7bd6be433468cf92a7b53036f Mon Sep 17 00:00:00 2001 From: Joe Mayberry Date: Fri, 1 Mar 2019 13:44:55 -0700 Subject: [PATCH 1/5] added Local Object Cache functionality --- .../Controllers/LocalObjectCacheController.cs | 80 ++++++++++++ DeveloperTools/Core/DeveloperMenuProvider.cs | 6 +- DeveloperTools/DeveloperTools.csproj | 6 + DeveloperTools/Models/LocalObjectCache.cs | 15 +++ .../Params/HttpParamActionAttribute.cs | 21 ++++ .../EPiServer.DeveloperTools.zip | Bin 0 -> 19882 bytes .../Views/LocalObjectCache/Index.aspx | 114 ++++++++++++++++++ 7 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 DeveloperTools/Controllers/LocalObjectCacheController.cs create mode 100644 DeveloperTools/Models/LocalObjectCache.cs create mode 100644 DeveloperTools/Params/HttpParamActionAttribute.cs create mode 100644 DeveloperTools/modules/_protected/EPiServer.DeveloperTools/EPiServer.DeveloperTools.zip create mode 100644 DeveloperTools/modules/_protected/EPiServer.DeveloperTools/Views/LocalObjectCache/Index.aspx diff --git a/DeveloperTools/Controllers/LocalObjectCacheController.cs b/DeveloperTools/Controllers/LocalObjectCacheController.cs new file mode 100644 index 0000000..e1205a4 --- /dev/null +++ b/DeveloperTools/Controllers/LocalObjectCacheController.cs @@ -0,0 +1,80 @@ +using System.Linq; +using System.Web.Mvc; +using DeveloperTools.Models; +using EPiServer.PlugIn; +using System.Collections; +using EPiServer.Core; +using EPiServer.Framework.Cache; + +namespace DeveloperTools.Cache.Controllers +{ + [Authorize(Roles = "CmsAdmins")] + [GuiPlugIn(Area = PlugInArea.AdminMenu, Url = "~/localobjectcache", DisplayName = "Clear Local Object Cache")] + public class LocalObjectCacheController : Controller + { + private readonly ISynchronizedObjectInstanceCache cache; + + public LocalObjectCacheController(ISynchronizedObjectInstanceCache cache) + { + this.cache = cache; + } + + public ActionResult Index(string FilteredBy) + { + var model = new LocalObjectCache(); + + var cachedEntries = HttpContext.Cache.Cast(); + + switch (FilteredBy) + { + case "pages": + model.CachedItems = cachedEntries.Where(item => item.Value is PageData); + break; + case "content": + model.CachedItems = cachedEntries.Where(item => item.Value is IContent); + break; + default: + model.CachedItems = cachedEntries; + break; + } + + model.FilteredBy = FilteredBy; + + model.Choices = new[] + { + new SelectListItem { Text = "All Cached Objects", Value = "all" }, + new SelectListItem { Text = "Any Content", Value = "content" }, + new SelectListItem { Text = "Pages Only", Value = "pages" } + }; + + return View(model); + } + + [HttpParamAction] + public ActionResult RemoveLocalCache(string[] cacheKey, LocalObjectCache model) + { + if (cacheKey != null) + { + foreach (string key in cacheKey) + { + cache.RemoveLocal(key); + } + } + return RedirectToAction("Index"); + } + + [HttpParamAction] + public ActionResult RemoveLocalRemoteCache(string[] cacheKey) + { + if (cacheKey != null) + { + foreach(string key in cacheKey) + { + cache.RemoveLocal(key); + cache.RemoveRemote(key); + } + } + return RedirectToAction("Index"); + } + } +} \ No newline at end of file diff --git a/DeveloperTools/Core/DeveloperMenuProvider.cs b/DeveloperTools/Core/DeveloperMenuProvider.cs index 776d4ee..2ccface 100644 --- a/DeveloperTools/Core/DeveloperMenuProvider.cs +++ b/DeveloperTools/Core/DeveloperMenuProvider.cs @@ -49,6 +49,8 @@ public class DeveloperMenuProvider : IMenuProvider const string ModuleDependenciesTitle = "Module Dependencies"; const string ModuleDependenciesPath = "global/DeveloperTools/ModuleDependencies"; + const string LocalObjectCacheTitle = "Local Object Cache"; + const string LocalObjectCachePath = "global/DeveloperTools/LocalObjectCache"; public IEnumerable GetMenuItems() { // Create the top menu section @@ -69,6 +71,7 @@ public IEnumerable GetMenuItems() var routes = CreateUrlMenuItem(RoutesTitle, RoutesPath, Paths.ToResource(ModuleName, "Routes")); var viewLocations = CreateUrlMenuItem(ViewLocationsTitle, ViewLocationsPath, Paths.ToResource(ModuleName, "ViewEngineLocations")); var moduleDependencies = CreateUrlMenuItem(ModuleDependenciesTitle, ModuleDependenciesPath, Paths.ToResource(ModuleName, "ModuleDependencies")); + var localobjectcache = CreateUrlMenuItem(LocalObjectCacheTitle, LocalObjectCachePath, Paths.ToResource(ModuleName, "LocalObjectCache")); return new MenuItem[] { @@ -84,7 +87,8 @@ public IEnumerable GetMenuItems() remoteEventViewer, routes, viewLocations, - moduleDependencies + moduleDependencies, + localobjectcache }; } diff --git a/DeveloperTools/DeveloperTools.csproj b/DeveloperTools/DeveloperTools.csproj index 2814a90..83a7791 100644 --- a/DeveloperTools/DeveloperTools.csproj +++ b/DeveloperTools/DeveloperTools.csproj @@ -206,6 +206,7 @@ + @@ -222,6 +223,7 @@ + @@ -232,6 +234,7 @@ + @@ -242,6 +245,9 @@ ASPXCodeBehind + + ASPXCodeBehind + ASPXCodeBehind diff --git a/DeveloperTools/Models/LocalObjectCache.cs b/DeveloperTools/Models/LocalObjectCache.cs new file mode 100644 index 0000000..515bc35 --- /dev/null +++ b/DeveloperTools/Models/LocalObjectCache.cs @@ -0,0 +1,15 @@ +using System.Collections; +using System.Collections.Generic; +using System.Web.Mvc; + +namespace DeveloperTools.Models +{ + public class LocalObjectCache + { + public IEnumerable CachedItems { get; set; } + + public string FilteredBy { get; set; } + + public IEnumerable Choices { get; set; } + } +} \ No newline at end of file diff --git a/DeveloperTools/Params/HttpParamActionAttribute.cs b/DeveloperTools/Params/HttpParamActionAttribute.cs new file mode 100644 index 0000000..2213e47 --- /dev/null +++ b/DeveloperTools/Params/HttpParamActionAttribute.cs @@ -0,0 +1,21 @@ +using System; +using System.Reflection; +using System.Web.Mvc; + +namespace DeveloperTools.Cache +{ + public class HttpParamActionAttribute : ActionNameSelectorAttribute + { + public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) + { + if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase)) + return true; + + if (!actionName.Equals("Action", StringComparison.InvariantCultureIgnoreCase)) + return false; + + var request = controllerContext.RequestContext.HttpContext.Request; + return request[methodInfo.Name] != null; + } + } +} \ No newline at end of file diff --git a/DeveloperTools/modules/_protected/EPiServer.DeveloperTools/EPiServer.DeveloperTools.zip b/DeveloperTools/modules/_protected/EPiServer.DeveloperTools/EPiServer.DeveloperTools.zip new file mode 100644 index 0000000000000000000000000000000000000000..74f60a154f154baa7c89a4038ab28abc1769928e GIT binary patch literal 19882 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 z zl@n{4pS6exHc;Nld}jCMh;!fQZdBICGEVEBehBGCY&5|mP;fM0^nq6nh9g?mT#Tr8 zH&8)G)|fR(7@3^UmUxBa(;(L&a$S`I3HTnFMaf}C-SXkbfKl>CpwL#!UY`R+rvdlL1?1p11uNuz7;?8 zmcpxlpiK~qEVh^Oi~Pj?BG7d>$KWG!tyEd#+5z^B91WSN>UQt7++ z2i1j;+;4vi&pk)lpXDd$*y+ar0~xE{@jB}N2c*RoxB?07P`$C$&nOq%7= zrgv__IGbbVZz2`OIYk+P6X9@@6*92a_`NZGBoR0G&63P9=&=U!vRK32471vh3d(>lg=j&RB!3HFeP;gK~W z?{*xKr@!ZywVH>29R0+6JP<17s&GmzHL*EIBKdjd7&PN?%h)i~vk>ezmo}jKLJxZhc~Mjmj~xc@Du%gl0m@RBqJy0D zoM1dz5Hn`4YhGWiT-)?O>u7>_u?@82_jowvo*yE5`mhI#a_(u`RcU3F6<0Rl zl>?wbP34Fw61_U@L*-A|U(k(sd%gIvv=EIQI93rqB6HYpCBqI+@dq2-D~dgRaprgG zt~?@@^fKwTfY7pCcmM3OM!^TLp1m6QUYDFfpq1130oI;F5zpMzK!}cS^_q1fum)6t zCngrL%X3GZXs*U>@*t%hc^vk=rS)^}8gjj+csrfjsjbAWMMWU~+kMwh4Z0FfvuS$% zy!+`v3!n3fISLNlWv9&39Gi!)CE=o|-MnW(8O-TySl3I9c9IQ_yv}1A~y&j(VWW3ruk^sJDNV=bsa%GjY3o1k%?a+S>&g|*;tPUS2if%)EGouti zX&-(qP3o}z7T7JisBxgUv66nl4G72N#;80qAn9PkqnKlR+6X`078V0is}(4gCxU@g zCeq@gc!_58Rg-&DZKM8$!%g5FA}O(^WoagPnR}5}V+!wyvS;lb(2rH*_plMdPd28} zH|Ov#!J-g_$ZGhPTp>u!5xPdi*j8kXPJv0GfU_x&Unz3H)=|D7E=fqpQNqm zgEnMCvy+2IzF{+G+Jf2jKA(RT49ijzCJ0;E+>kK@7#*I(Cm4lPvv)uYHWh0D3gYh! z20>RSeDMuQrF7VE1tJyD1ye^Rkl64taib!&m;Lo35p_hP0mMk+C|S?}-J&rX2QILg zNOMY=3;_zn0nwcqi=jw$rNH@`s+k8->l~1~;~{Hfwo$|GZ)753b#Y-`36|_T#f29j z&p|Rf%;dN1_axBu&RlvdVz`aLc&-}W$zbsxXtxJ}ej+sxJA++&z*QMXWG$B13z_cwLW6U1ZHmI|v?tPU z{>d&X+~PtF`Qb1_fMiI(#i!iZ&tD7iZ9tihU3n_Q+l*<>L}hn)+GFGUP^^X$?$y(A zb@3)!JJkmauyw{ehvp4K!~AkGt8xgq6q6<$a9grKxr`+`!Hd&j@-63zLhkO=ULo)eX?K9UQoxHN@#Z)~hZIscjHD}-M|SUaqm>MH;~Yx zIdSN{s@g%i8adD6UJkVeh0D)r7FoQV`bod3ttCZ}wDfRgXK`aPV$pW&xFhkJ25{Z0 zW=?y`fRWgA&7sWaH3(}qU3{!55jj?jynBR54m)>08s--WErLceerKak8)J3>>xoNY z2DFM_{4BTn#!0Y|fb*iw(%iP7s3ViWZGs3mHt5gWEp;}FieR{5V26Y*t>6tI*P7Kn7A)fOmYC{s8}m1-ZEfWaAEdk;Tg3=# z&=CfPkwcf`iofsYws#_3T8GC+Ecd({HI7>7Hczcy&h)XUJ)^LD%GM)2$EdubhmM9kEa-?1JZN=iAH07XI6f#U@%4!> zqZLqk8(bR-zRUz44HF88Z-&!6k1i*Ah-6_LTAV})rxBPI!5{U*Q-}~eSKLRH(he2t z>R7S)$P6+YN#AZUR7dSZ{&JlL9KOvwExxNk<Iz-$ZljEKYX~cm_7``n9{a%YOnoVQNg4T?l>@JJfK@k1Q~$Hqicn);XFsM4B$IN zrcNI4{+SQ9Nr*2*K)|3Lp&W;nO#S0M)r=0FG5_bjO=Z7(M-ig(AlU0yBQ3WJ5JPa! z|G~ETVXa91E4e3VU~TY{&$86}YuF7<(LY-JB}D!S4*-DZhrIpuv>$ReqPlPUB6rWL zg$Rbp!~&Jwu%hyjwkYKBdTc>>p=CW{`a>eN{O|7dAJ<}>L6xdC7ppP~mNEx>s+3Bk zn^$pd+q|CYJ$6VrI*@&FH?5JnN5&VpEpl4N$$Tlfhv zMcMC)b z0m5-K^uY=M=U3coFDMM%z`O*YT^uw1$=s?iH-s*>(_Z@1--U z)1~)%ltKCMKrsQ$+Cg0v>&d&e6J*?U zW{wRC#xY*|dwG&UQrf>#j32N7&m;rF%^*tBfvh_4l>$VJAGJW|X#m(2^42k0^qKHI z!Vv5~mM7IZM&r?5(k=CC%VsPVp+yzPl#+SyflBtkS_}Nr2(d7W+wq|95R-sU3lvyL zpz2-SO*`53Ab7V_1K+5Sae;Zq@m_`RtbjWHoILx}!bBs2Axys1vLjMe>K#+KZi3X8 zVsH_BYc81t^AUam;?S-!cEhTj=HQTRg&X%|-C-|*E~2k#F1RvL+0Ecr0Xd(u7$?yg zn^F=cR|C!14Ms4xsbgzclE{TEL#le!_n|N;hyxztFlO~TSl-mnC95!>f#^Y6(|1apW0OhSae7yQLJ?q- zVEWPriOjvOL~~ZcNnp6JXCf&#CDVBj6vtw~SSKPl_az4{jo%9sRNrZ`b zq-9Gz))j^GFYh%qIoSJP-RuX)xi)P%c-fPd4zQ(19{m+S|5NUyK!zAnT7n&Ko+lWd z!;qrA)H@r2+fJn!W~WLZHpNq@J$4SH^~B7#FcQJ zj=M$P+osFZ!EXxtm)X20b)|zp4h6Thwk};Rl-a(n;}}d-UcOECN8a|!+&D2$X1gv)kZ#Au?Bx0j93w64_A@E zVJ-vP3W8vjVL5={I<#yE_()MB+TD8=TxlK=aTC3#2EDIFSc5v#yW&b9S(Y@O&7WwL zxzba`p)D&4Xo#nI!W@d5*#oTi?u=tfWB}g#h@Y{V-jUf$OE(L=v91myw|fC!MaQI0 z-Q3$JU=6y-5-T)o;A?w-J;R#DotX}ehIYV6n0L$#_TH3AJa8)D8ik=?3Yvqf9m9@pmM&>HntB+ zp4taJySp#LhO4JkocGf$hSpZw6GN#@+ewfE2T(iUi09WkBX*hOp*+*95o0Z>$>6hK ztx;`iPVS!&v94g|RGD5akMT`mBJ7xU~wl6uJk>I-!x?DB{`C=~Z_soM5oYco>Rf13Z(P6HH^kPj9B)~Ds^cV%36<4R|18X(2;i75jmr_eIL+Q_#*oS_t5M`+1?=l ztINkQ?a6d5tJcK0^$qN^l&~-=@v`7j)vQjzmrS@k+g7A`WVcwNW;%op={O$rbgC6H zM%9fZt>8yT&77zCa&8YKLlslL5*_S7TdzRqd2(@Vgq>#dydzfrl)|u;Y7gox+ODHI zn-4itYq^AAoT2&J=dQadZAlWcJdq>|ivdChV{&)mtM*(ESUT5H{XYfye-Fen{X`pR!X|JknF4@^F7#~`(7ZfWb`+q-W9%)vI#OxpNW(9MwqTB+iBHCk z;k*OTdLDw!zJ%QO1#$8q?J=?UI91u>lNBh9FaU#(A3NB%+^<9r#vKfG=nF)HeeKURj)=@Y^ z(&_CbwR0(sc4JR@l{j@$YO8}igBWEjUdz{5>xT=Lek|6-q^WDIrZHMcOXR3#2{G_U z>TnWTM!eu?_u`041`-YE4X%Dt<-AFXVt)>?@fK1_gc>-?ktR(s4;{-E*1PD+lIWna z^0w^I0F6Y{{qV@zd@Nnm7G_s=jO#$+(1_(Z9d_R(;#x~N2I8wsdxydxag)*=7E8k? z$ud>Z_(hflLt5ijalZSsWVA!VcVN7etQbZ5ZOk_xUY0$UcTSSU9$uA1O9Cmrj`)uB zD^jf*ouxob>1pSB!UrU7=6NSmmmps1!+y)z3pIH~LVE&oqEKQe8W3CPQ(;Uu-9F=2 zyM4N9A1HcpG7b4Z@}D!a&*G8DF$s6%*tf0ReG&!JPgqCT+@K?P0o&t(jybZYB{p}w^lpbTh+W@KBjzNly}JO^1Li{mfNwb z?4ka!8R+l3q=uWpJI3}#Dk_9FfsoY;$XLwSxr$YXmueWT&u#`%H*i*wSluu94C=`q zu@dnf>v4<#lv=*3A_}a1y^!YQtK2fe<5SHBob6JL3|^w#5#;hmvv#8gdp+Ujq4j9i zpzZ>(uLu4EssrYVO`LBC3fn;(6kAyvMOS#axcSLYCq@gROWeM+9 zxcRi7b{395xzL_#wQhXqvBW19Uc=UEDG76ZP(;a4jw2}0xoVI`kZtER-n2uWArGnE zUl~+i``q^0B<20Jw`%E`gO}_9)5^PZ%o~agwWFpR4o}PR`UlPVD%l6wQKMTJfwD;g zm#2FMN_lVb{WR8H)~ZViVS-H>pepEcZ1ZkxU#Q=*;&KsJ+(8XMmn)Ot_FbJziWzbM zQ?+7E-OaiTdpeUuZmDqh5P!eD^Lp#kl5xllX zJcqETp$>b2Y|q>yl>i#kt%7l4YKyMW;TXw04f5@VP_S>9)MpPzR*2KpDlr2E&VT8^ zhQ=K%Et?6%8N=K$2Nv#wk+gSJEbhDU%X)<`DzFSEqh~^D5O4Nt@!8qs&0R!F_t?Jr zYRZ@tnHAvWwrJdx3{Ir8KtbhJ{)LS{ItaME&pYrHL_b0$D8N+nMoQTZ7rz97JW?KD zBy6!p;A*Bs>(~=}WhumR&~-7y5LYOy55wa2T#=z1#N=^t*zSfs$*6sI1qxt#7fZXL z8D?}@n9W^&7xf?hrtte8s-d1lOh#r<0+Mpwd_z^r%BNPWg@9ZAg2M3spg@P=Y_pSEzx z!dp)+wxQ28PBr`Q_}@npS5-82T_G{D1w!xNk`;+|*-V??Hyq9$!i@)f4B7fpV3+IZ z{r*Fgqo87EGY^3tR6tAI&WY^42WQvU;9{ycje8dRYirfo%{=LUUYNc7nMrwyTltF93HpNCbH`|&_K(hCi z^>7c_N_h|DyLNiqa2T#{c|5sVC5r%(CZ)41PxX*BnvuSc;5!Z`_z5JVWh?WzrLRMA zgmzy?JYc+N0C2$03Zgm2R;K=|tfUq9=q{tWNM8I^VR*}{F`5am#ti2mLd}^`)u|A4 ztCLooOa&MOvIbGNqr+#djE@GW!po~j#9qMvtRcRYbN^B2C}-th|CbUgH+33nsuz1n znW(%f!O)Zj&+6ypmh%u$C#6EF~0w8$0Ei z%!2`r8>0MOfPxemo7$W_1XAKT;CXltSI zW-*Q$b3{qv;31^kRVl)oBCnYw`CrC;H<5-SNf;aXgIU8vrrU^Rs= zoE6(-NXKo{v3}=!dZg3pDiCFRx2T;~_A}P& z^M(2h1j-)DnZ;tgciH5gjXXUO{*wDdj!el>W6u>%MWozf#q9ia!?I1qI%j3H?6%Fb zj0YaLs1x2Tmbhv4goCPT2^klg>`e$}wwnT*4k4rgwPlkj9`ibgghawd?!cE=BBrSW zk}~E}f!L%BPf5;S6dxu+=XO>oVUbN6w70h!E?*cbY?{bJdT|euLwT%j@ZLU`O=Db> zzhuuQZ!O)OWXm?mxre?{;c`zYfATq#hva|1EW=V;35EfU9G1bk|Myu=c+ z$3$U3%!(v7D=m?dItT{7YKLKB%zHmdFsw?D zvE1{%$EYY{hTU9pgo!TAcC-#KF#MD*g}@m&brLVZS_hoeGP-IK*=`bk&set*pTMRA zocVzAf<|jrO*NQjZ4=BR^twc}iBWHG7ZjJd_mou4)Xth1wb)GuV0tte4%gDTR~SS@ znXW9r@z6b7xFD4CHAuuA%=v0J7kmBtXfzxdk&xqT2NrWsRwmyp8c%YO`aZn!0Fe3-K7;WRm{?XLy#6q{nh^5h$<7H?mTcQ~%=hF8ZA7tTz@6=RKyqD0p+agW zvIvQUHGxyR^C&wC1?;uSokeaj=g85~OzFg*=1%)PZYAu>lazMdX_SqMHT;7M8Jo&R zsYRFQxvK7lbtHXfnaTLiM9$^vK3p=)Hd7}I%2FDJis8|i&s9{tHC(BEN8YgNkv=7m zzLjlgpg<$(g)?C7PvdE z{vg4ubtDt{(W=*#_xFQbhD#>|C6753X)kz-%RJ84 z4V+qa;D>Z;Rkt?Wsp+e^JX=@UD7}ezkIEhE5Ktq@E$0$oIE{aLEFQWWG20+>#(a8k z%(TJ3=$2pjE_L0Gg1tVCi65x$lO0olyUkD`)W};Kul^MJ={qNPHpqPNMUSFqfPa2i zf7F5~7+6@F>-=@;Oq{NGtNCJ6L%!J5KN^mHjQ+8DMkq;+ehW1G*)9|u`wD?K7Xo1% z%Ks(Mkizn8ee{kqz?%&NIOk)oz(c zD^n_66?wwh?UH_xAtTrr=)~uaGZjjxK9|~ofL?0XV0DE8!Dgnn>?=SRFh+jSn=RxK z*Ju2%_QYahcX|C-c>GivZSOn2B_JPlx<1katDCGN?+mbm>>bgeRPoSL3Sf=DBp@qn zkoOFMv+0!Nygo`Zll7zFh3 z1G#^KcF4!DwdY%^Heu?rp81rq$F$qt@x}TBmo-H!D)%>EZWxDL-5T8;@xp#nJhs0YVd??2Hl6CJpE9<T$*kEXZ0LV5H1-inTK`kyjdScRX#3w{AY>j!=U@3~Fk`-SypD=_BYLh~9%+Cr>pdF2X5(uGrwgIx)VJi#T! z!wi)JdKAarGpZ=)?<+%ThKP(lekcg%^1K#3!SfByOb@L{mmA-^c(qEt)f}WA%HHLravAwu9IH-f&yw7s(nRhA4Gw_QXBsvbMRw%{^kk`SsIyG8c0~_>DZfC zS^lmPDpLCnE?&&g?qB+W|L(jWy5U%>z)ttAmsi0isSf~Ats8%5%xNw5Uq zjkP1GYOwy51u1-fcUAbOyl4LY<}`DBL<CZ(-IcC(5sgVWdD2KO;P7QHpiDF#T(J7gPkqsEt#SapIx~zdn;mLF5Ue z--p%&(4#8$9+R3f^vW)PR+yN9mrf+CUmY)hlzxCF(v>>2C!ukhnD4zbHgfS@f}SY0A~AgRODe(6C#$ z!W>8)vgj5{cV@9*QEdUHSl!*E-GK{T5x*?|DZoR~R^epB&dNkvg)YGLIioCO{d93% z?K5xn#L(jVXDvsDI4Lsw38$v~i`|R~g`_c1`;XSj8<@h# zz^U}A?N+{l4XX#7hepL7-{$T4bKbw(6C+VMo{(EkJZL<3g`R)0ugZaVjx9+*0xqW}Ye?R{G@cp$h z?>i9w3(&zo1N}X><=|y{&7WlJJM<68zdm^gzudQnmr{f8_w9Ql$j_vHm!$81|3LWT z`TMn92gDz2 zeyzj)nN8;3LHzyA`9AsY#~)yS<%97HpSc%D?T@eSZz@^;8(zQGyZ+1z?xlp}AEEwt z{E&X(m-=!Ae}Mj6=JMYV`?VP6XJViJ7UO@%2=y06WfVUc{hFozZ&>}B%l?_w`ak0Q z@0h{vfvzJD+c=?st#;zajRk-~KZ(81Das_1`l5 + + + + + + + + + + + + + + + +
+
+

Local Object Cache

+

This tool shows all of the current items in the local object cache, and allows the deletion of one or more cached items.

+
+ +
+ <%using (Html.BeginForm("Index", "LocalObjectCache", FormMethod.Post)) + { %> + <%= Html.AntiForgeryToken() %> + + + + + + + +
Filter By<%= Html.DropDownListFor(m => m.FilteredBy, Model.Choices) %> + + + +
+ + <% } %> + <% using (Html.BeginForm("Action", "LocalObjectCache", FormMethod.Post)) + { %> +
+ + + + + + +
+ + + + + + + + <%----%> + + + + <% foreach (DictionaryEntry item in Model.CachedItems) + { %> + + + + + <%----%> + + <% } %> + +
KeyType@(string.IsNullOrWhiteSpace(Model.FilteredBy) ? "Value" : "Name (ID) Published")
<%= item.Key %><%= item.Value.GetType() %> + <% if (item.Value is IContent) + { + (item.Value as IContent).Name; + %> + <%((item.Value as IContent).ContentLink.ID); %> + <% + } + if (item.Value is PageData) + { + ((item.Value as PageData).StartPublish); + } %> +
+ +
+ + + + + + +
+ <% } %> +
+
+ + +
\ No newline at end of file From 80b0e6f1322f3b6db6ca17d996112485c93a3f4f Mon Sep 17 00:00:00 2001 From: valdisiljuconoks Date: Sat, 2 Mar 2019 14:08:10 +0200 Subject: [PATCH 2/5] some minor code fixes and refactorings --- .../Controllers/LocalObjectCacheController.cs | 132 ++++++------ DeveloperTools/Core/DeveloperMenuProvider.cs | 11 +- .../Core/HttpParamActionAttribute.cs | 21 ++ DeveloperTools/DeveloperTools.csproj | 2 +- DeveloperTools/EPiServer.DeveloperTools.zip | Bin 15649 -> 33627 bytes .../Params/HttpParamActionAttribute.cs | 21 -- DeveloperTools/Properties/AssemblyInfo.cs | 6 +- .../Views/LocalObjectCache/Index.aspx | 203 +++++++++--------- 8 files changed, 197 insertions(+), 199 deletions(-) create mode 100644 DeveloperTools/Core/HttpParamActionAttribute.cs delete mode 100644 DeveloperTools/Params/HttpParamActionAttribute.cs diff --git a/DeveloperTools/Controllers/LocalObjectCacheController.cs b/DeveloperTools/Controllers/LocalObjectCacheController.cs index e1205a4..73af762 100644 --- a/DeveloperTools/Controllers/LocalObjectCacheController.cs +++ b/DeveloperTools/Controllers/LocalObjectCacheController.cs @@ -1,80 +1,82 @@ -using System.Linq; +using System.Collections; +using System.Linq; using System.Web.Mvc; +using DeveloperTools.Core; using DeveloperTools.Models; -using EPiServer.PlugIn; -using System.Collections; using EPiServer.Core; using EPiServer.Framework.Cache; +using EPiServer.PlugIn; -namespace DeveloperTools.Cache.Controllers +namespace DeveloperTools.Controllers { - [Authorize(Roles = "CmsAdmins")] - [GuiPlugIn(Area = PlugInArea.AdminMenu, Url = "~/localobjectcache", DisplayName = "Clear Local Object Cache")] - public class LocalObjectCacheController : Controller - { - private readonly ISynchronizedObjectInstanceCache cache; + [Authorize(Roles = "CmsAdmins")] + [GuiPlugIn(Area = PlugInArea.AdminMenu, Url = "~/localobjectcache", DisplayName = "Clear Local Object Cache")] + public class LocalObjectCacheController : DeveloperToolsController + { + private readonly ISynchronizedObjectInstanceCache cache; + + public LocalObjectCacheController(ISynchronizedObjectInstanceCache cache) + { + this.cache = cache; + } - public LocalObjectCacheController(ISynchronizedObjectInstanceCache cache) - { - this.cache = cache; - } + public ActionResult Index(string FilteredBy) + { + var model = new LocalObjectCache(); - public ActionResult Index(string FilteredBy) - { - var model = new LocalObjectCache(); + var cachedEntries = HttpContext.Cache.Cast(); - var cachedEntries = HttpContext.Cache.Cast(); + switch (FilteredBy) + { + case "pages": + model.CachedItems = cachedEntries.Where(item => item.Value is PageData); + break; + case "content": + model.CachedItems = cachedEntries.Where(item => item.Value is IContent); + break; + default: + model.CachedItems = cachedEntries; + break; + } - switch (FilteredBy) - { - case "pages": - model.CachedItems = cachedEntries.Where(item => item.Value is PageData); - break; - case "content": - model.CachedItems = cachedEntries.Where(item => item.Value is IContent); - break; - default: - model.CachedItems = cachedEntries; - break; - } + model.FilteredBy = FilteredBy; + model.Choices = new[] + { + new SelectListItem { Text = "All Cached Objects", Value = "all" }, + new SelectListItem { Text = "Any Content", Value = "content" }, + new SelectListItem { Text = "Pages Only", Value = "pages" } + }; - model.FilteredBy = FilteredBy; + return View(model); + } - model.Choices = new[] - { - new SelectListItem { Text = "All Cached Objects", Value = "all" }, - new SelectListItem { Text = "Any Content", Value = "content" }, - new SelectListItem { Text = "Pages Only", Value = "pages" } - }; + [HttpParamAction] + public ActionResult RemoveLocalCache(string[] cacheKeys, LocalObjectCache model) + { + if(cacheKeys != null) + { + foreach (string key in cacheKeys) + { + cache.RemoveLocal(key); + } + } - return View(model); - } + return RedirectToAction("Index"); + } - [HttpParamAction] - public ActionResult RemoveLocalCache(string[] cacheKey, LocalObjectCache model) - { - if (cacheKey != null) - { - foreach (string key in cacheKey) - { - cache.RemoveLocal(key); - } - } - return RedirectToAction("Index"); - } + [HttpParamAction] + public ActionResult RemoveLocalRemoteCache(string[] cacheKeys) + { + if(cacheKeys != null) + { + foreach (string key in cacheKeys) + { + cache.RemoveLocal(key); + cache.RemoveRemote(key); + } + } - [HttpParamAction] - public ActionResult RemoveLocalRemoteCache(string[] cacheKey) - { - if (cacheKey != null) - { - foreach(string key in cacheKey) - { - cache.RemoveLocal(key); - cache.RemoveRemote(key); - } - } - return RedirectToAction("Index"); - } - } -} \ No newline at end of file + return RedirectToAction("Index"); + } + } +} diff --git a/DeveloperTools/Core/DeveloperMenuProvider.cs b/DeveloperTools/Core/DeveloperMenuProvider.cs index 2ccface..18a59c2 100644 --- a/DeveloperTools/Core/DeveloperMenuProvider.cs +++ b/DeveloperTools/Core/DeveloperMenuProvider.cs @@ -49,8 +49,9 @@ public class DeveloperMenuProvider : IMenuProvider const string ModuleDependenciesTitle = "Module Dependencies"; const string ModuleDependenciesPath = "global/DeveloperTools/ModuleDependencies"; - const string LocalObjectCacheTitle = "Local Object Cache"; - const string LocalObjectCachePath = "global/DeveloperTools/LocalObjectCache"; + const string LocalObjectCacheTitle = "Local Object Cache"; + const string LocalObjectCachePath = "global/DeveloperTools/LocalObjectCache"; + public IEnumerable GetMenuItems() { // Create the top menu section @@ -71,7 +72,7 @@ public IEnumerable GetMenuItems() var routes = CreateUrlMenuItem(RoutesTitle, RoutesPath, Paths.ToResource(ModuleName, "Routes")); var viewLocations = CreateUrlMenuItem(ViewLocationsTitle, ViewLocationsPath, Paths.ToResource(ModuleName, "ViewEngineLocations")); var moduleDependencies = CreateUrlMenuItem(ModuleDependenciesTitle, ModuleDependenciesPath, Paths.ToResource(ModuleName, "ModuleDependencies")); - var localobjectcache = CreateUrlMenuItem(LocalObjectCacheTitle, LocalObjectCachePath, Paths.ToResource(ModuleName, "LocalObjectCache")); + var localobjectcache = CreateUrlMenuItem(LocalObjectCacheTitle, LocalObjectCachePath, Paths.ToResource(ModuleName, "LocalObjectCache")); return new MenuItem[] { @@ -87,8 +88,8 @@ public IEnumerable GetMenuItems() remoteEventViewer, routes, viewLocations, - moduleDependencies, - localobjectcache + moduleDependencies, + localobjectcache }; } diff --git a/DeveloperTools/Core/HttpParamActionAttribute.cs b/DeveloperTools/Core/HttpParamActionAttribute.cs new file mode 100644 index 0000000..ed454cb --- /dev/null +++ b/DeveloperTools/Core/HttpParamActionAttribute.cs @@ -0,0 +1,21 @@ +using System; +using System.Reflection; +using System.Web.Mvc; + +namespace DeveloperTools.Core +{ + public class HttpParamActionAttribute : ActionNameSelectorAttribute + { + public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) + { + if(actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase)) + return true; + + if(!actionName.Equals("Action", StringComparison.InvariantCultureIgnoreCase)) + return false; + + var request = controllerContext.RequestContext.HttpContext.Request; + return request[methodInfo.Name] != null; + } + } +} diff --git a/DeveloperTools/DeveloperTools.csproj b/DeveloperTools/DeveloperTools.csproj index 83a7791..e677ccb 100644 --- a/DeveloperTools/DeveloperTools.csproj +++ b/DeveloperTools/DeveloperTools.csproj @@ -220,6 +220,7 @@ + @@ -234,7 +235,6 @@ - diff --git a/DeveloperTools/EPiServer.DeveloperTools.zip b/DeveloperTools/EPiServer.DeveloperTools.zip index 19118d883a56ab4eb2e73fb295e937de3f92cab7..911eb212065a4a2f757bde499afb16ce119a8400 100644 GIT binary patch delta 18697 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 delta 555 zcmccJ#TnP8!1h zRVO7o7wF3H)Fi#+{JgZx^Z;*0CJ_dR%Yp8kY*;VNWW_kyuii)j=vqI;XMb|Tm>C$p zb1;Av0rf%wKkMWL^-2mrpZKjyIK2BKP*DLl1A`(=9!yW?n9T2?Jb6_Uj{?xEe)}Gk z{gY#5VDRN*V30&nc${Z)LxVaf7$&c3kY$sEHA*w_C{JG9s0Rwo$#+0p z^~paQRY74oS+Pl)sX}|QU6TPQWG5E_x&L%0_cdvN!gumcAa{Y` +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" MasterPageFile="../Shared/DeveloperTools.Master" %> + + + + + + + - - +
+ <%using (Html.BeginForm("Index", "LocalObjectCache", FormMethod.Post)) + { %> + <%= Html.AntiForgeryToken() %> - - - - - - - - -
-
-

Local Object Cache

-

This tool shows all of the current items in the local object cache, and allows the deletion of one or more cached items.

-
+ + + + + + +
Filter By<%= Html.DropDownListFor(m => m.FilteredBy, Model.Choices) %> + + + +
+ <% } %> + + <% using (Html.BeginForm("Action", "LocalObjectCache", FormMethod.Post)) + { %> +
+ + + + + + +
-
- <%using (Html.BeginForm("Index", "LocalObjectCache", FormMethod.Post)) - { %> - <%= Html.AntiForgeryToken() %> - - - - - - - -
Filter By<%= Html.DropDownListFor(m => m.FilteredBy, Model.Choices) %> - - - -
- - <% } %> - <% using (Html.BeginForm("Action", "LocalObjectCache", FormMethod.Post)) - { %> -
- - - - - - -
+ + + + + + + <%----%> + + + + <% foreach (DictionaryEntry item in Model.CachedItems) + { %> + + + + + <%----%> + + <% } %> + +
KeyType@(string.IsNullOrWhiteSpace(Model.FilteredBy) ? "Value" : "Name (ID) Published")
<%= item.Key %><%= item.Value.GetType() %> + <% if (item.Value is IContent) + { + (item.Value as IContent).Name; + %> + <%((item.Value as IContent).ContentLink.ID); %> + <% + } + if (item.Value is PageData) + { + ((item.Value as PageData).StartPublish); + } %> +
- - - - - - - <%----%> - - - - <% foreach (DictionaryEntry item in Model.CachedItems) - { %> - - - - - <%----%> - - <% } %> - -
KeyType@(string.IsNullOrWhiteSpace(Model.FilteredBy) ? "Value" : "Name (ID) Published")
<%= item.Key %><%= item.Value.GetType() %> - <% if (item.Value is IContent) - { - (item.Value as IContent).Name; - %> - <%((item.Value as IContent).ContentLink.ID); %> - <% - } - if (item.Value is PageData) - { - ((item.Value as PageData).StartPublish); - } %> -
+
+ + + + + + +
+ <% } %> +
+
-
- - - - - - -
- <% } %> -
- - - +
\ No newline at end of file From 7cfa4d3cea874e4866fa587971bdde9b34e54068 Mon Sep 17 00:00:00 2001 From: valdisiljuconoks Date: Sat, 2 Mar 2019 15:07:45 +0200 Subject: [PATCH 3/5] added object size --- .../Controllers/LocalObjectCacheController.cs | 53 ++++++++++++++---- DeveloperTools/DeveloperTools.csproj | 4 +- DeveloperTools/EPiServer.DeveloperTools.zip | Bin 33627 -> 17364 bytes DeveloperTools/Models/LocalObjectCache.cs | 26 ++++++--- .../EPiServer.DeveloperTools.zip | Bin 19882 -> 0 bytes .../Views/LocalObjectCache/Index.aspx | 11 +++- 6 files changed, 69 insertions(+), 25 deletions(-) delete mode 100644 DeveloperTools/modules/_protected/EPiServer.DeveloperTools/EPiServer.DeveloperTools.zip diff --git a/DeveloperTools/Controllers/LocalObjectCacheController.cs b/DeveloperTools/Controllers/LocalObjectCacheController.cs index 73af762..824d184 100644 --- a/DeveloperTools/Controllers/LocalObjectCacheController.cs +++ b/DeveloperTools/Controllers/LocalObjectCacheController.cs @@ -1,5 +1,9 @@ -using System.Collections; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Runtime.Serialization.Formatters.Binary; using System.Web.Mvc; using DeveloperTools.Core; using DeveloperTools.Models; @@ -13,11 +17,11 @@ namespace DeveloperTools.Controllers [GuiPlugIn(Area = PlugInArea.AdminMenu, Url = "~/localobjectcache", DisplayName = "Clear Local Object Cache")] public class LocalObjectCacheController : DeveloperToolsController { - private readonly ISynchronizedObjectInstanceCache cache; + private readonly ISynchronizedObjectInstanceCache _cache; public LocalObjectCacheController(ISynchronizedObjectInstanceCache cache) { - this.cache = cache; + _cache = cache; } public ActionResult Index(string FilteredBy) @@ -29,13 +33,13 @@ public ActionResult Index(string FilteredBy) switch (FilteredBy) { case "pages": - model.CachedItems = cachedEntries.Where(item => item.Value is PageData); + model.CachedItems = ConvertToListItem(cachedEntries.Where(item => item.Value is PageData)); break; case "content": - model.CachedItems = cachedEntries.Where(item => item.Value is IContent); + model.CachedItems = ConvertToListItem(cachedEntries.Where(item => item.Value is IContent)); break; default: - model.CachedItems = cachedEntries; + model.CachedItems = ConvertToListItem(cachedEntries); break; } @@ -50,14 +54,22 @@ public ActionResult Index(string FilteredBy) return View(model); } + private IEnumerable ConvertToListItem(IEnumerable cachedEntries) => + cachedEntries.Select(e => new LocalObjectCacheItem + { + Key = e.Key.ToString(), + Value = e.Value, + Size = GetObjectSize(e.Value) + }).ToList(); + [HttpParamAction] - public ActionResult RemoveLocalCache(string[] cacheKeys, LocalObjectCache model) + public ActionResult RemoveLocalCache(string[] cacheKeys) { if(cacheKeys != null) { foreach (string key in cacheKeys) { - cache.RemoveLocal(key); + _cache.RemoveLocal(key); } } @@ -71,12 +83,33 @@ public ActionResult RemoveLocalRemoteCache(string[] cacheKeys) { foreach (string key in cacheKeys) { - cache.RemoveLocal(key); - cache.RemoveRemote(key); + _cache.RemoveLocal(key); + _cache.RemoveRemote(key); } } return RedirectToAction("Index"); } + + private static long GetObjectSize(object obj) + { + if(obj == null) + return 0; + + try + { + using (Stream s = new MemoryStream()) + { + var formatter = new BinaryFormatter(); + formatter.Serialize(s, obj); + + return s.Length; + } + } + catch (Exception) + { + return -1; + } + } } } diff --git a/DeveloperTools/DeveloperTools.csproj b/DeveloperTools/DeveloperTools.csproj index e677ccb..becd72b 100644 --- a/DeveloperTools/DeveloperTools.csproj +++ b/DeveloperTools/DeveloperTools.csproj @@ -245,9 +245,7 @@ ASPXCodeBehind - - ASPXCodeBehind - + ASPXCodeBehind diff --git a/DeveloperTools/EPiServer.DeveloperTools.zip b/DeveloperTools/EPiServer.DeveloperTools.zip index 911eb212065a4a2f757bde499afb16ce119a8400..0fa36758401dd5e7c8e30753a38c079830ceff0a 100644 GIT binary patch delta 1816 zcmV+z2j}?Ph62=w0kd2`(F_u{cw$Zk*n@&41^@uw82|tw0FyC*BY*7~+iu%7^u0j; z;Xs8k8;z-^dl;73UX!?8yd`ax1ntAH2U?;nB^2qAloPMWm+fJnv|rdEC0nv=%TBie zEl@th(&4%B+^PKi=U<)1E4ZLz24_@^Q+()pC(k?>h={4!=&pA)(}pGF0~?a_X+Yk` z?9SqM`fSR$oG^7QC4blCT!svP&SXIOyWtHB%n1!5*7M+;A_HY<-ozZ)6XIV*RI$*n zvT%qVGALzxVUBu8KXYD}pG!gB)I5ZJ_EPuA`a=-)l_C@2c*m$t| zE|_Se;t7fw%5Vlo9S9S(gDB=<6OSueRgOa%+>Vt@MQ8;}bpX#sFGep%FP8UzFUZ|FTi9RxE$ zC`cd^2l8)zPk))3k&qgCZLO>QeeykdVTo7wh-2w5{1u=jOMObPJ@QJdaC zgzVni1Anht;t*yr&Y6j1NG_x{t=2M6fREs+8dO%N(FG^xNSGLzj4@)a0=r}* zg*9-Vy*eExF_s%a6MP%F!+Q{i#q*T%6t~{wuTms3)l6aywmB3N+w(Hs*gJ8@+Vm7N zfiu-Km{hHTCN(Q0mrOIWiO%0w3c)rOSCR=H)&w$wHze6nU=#mS zvwsZJY;Bh9UJn-}8_S(ESiS;m*T$Boa!ERH>72*DgAZJ#I2b*tjC<$N%$F`vR-t*yWE+t6CAS66lAlKs)h5qp zX?|50+M3p|k`p%Vt#gHK(;3niQA9`{wF^&W5YG?=a1)N1Naf7E{=D>%&;LI zL9@^n@NPE9FZ?y0uda`~quNy#NJ|2V&6C4N@Y)uC<+aplhcp~BaDUr(R0($>?lhVk zHOn8)VsT3_j}M(kwhYBf(i^*L`mj6ds`uN%0ssJ$+kQC$odA;-e>MU-0h3ODPy!DHlc0Y< z0+$Gr4@e`Es)7t4ws>Mr1=xdvB?bTh-WdP@ApigX00000000000074flQDoz0xJ`f zfPh5;fEbh6R~?h8f)JDRfEoh98yla7K$0t7gdU3VRms)7)cH+v8a0000000000008VelOKaF4iEqk0G0#*04P5I G0000dMpYdE delta 18195 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 vEfL_NFd)tl_MeG?l>!(Y38 CachedItems { get; set; } + public class LocalObjectCache + { + public IEnumerable CachedItems { get; set; } - public string FilteredBy { get; set; } + public string FilteredBy { get; set; } - public IEnumerable Choices { get; set; } - } -} \ No newline at end of file + public IEnumerable Choices { get; set; } + } + + public class LocalObjectCacheItem + { + public string Key { get; set; } + + public object Value { get; set; } + + public long Size { get; set; } + } +} diff --git a/DeveloperTools/modules/_protected/EPiServer.DeveloperTools/EPiServer.DeveloperTools.zip b/DeveloperTools/modules/_protected/EPiServer.DeveloperTools/EPiServer.DeveloperTools.zip deleted file mode 100644 index 74f60a154f154baa7c89a4038ab28abc1769928e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19882 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 z 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 -
+
+

Total count of cached items: <%= Model.CachedItems.Count() %>

+
+
@@ -58,16 +61,18 @@ Key Type + Size <%--@(string.IsNullOrWhiteSpace(Model.FilteredBy) ? "Value" : "Name (ID) Published")--%> - <% foreach (DictionaryEntry item in Model.CachedItems) + <% foreach (var item in Model.CachedItems) { %> <%= item.Key %> <%= item.Value.GetType() %> + <%= item.Size %> <%-- <% if (item.Value is IContent) { @@ -82,7 +87,7 @@ } %> --%> - <% } %> + <% } %> From 45d8c3593c3163994caa76596d0b285987e95b66 Mon Sep 17 00:00:00 2001 From: valdisiljuconoks Date: Wed, 13 Mar 2019 08:21:57 +0200 Subject: [PATCH 4/5] Added ViewObjectSize as optional action --- .../Controllers/LocalObjectCacheController.cs | 88 +++++++++++-------- DeveloperTools/Models/LocalObjectCache.cs | 2 + .../Views/LocalObjectCache/Index.aspx | 22 ++--- 3 files changed, 59 insertions(+), 53 deletions(-) diff --git a/DeveloperTools/Controllers/LocalObjectCacheController.cs b/DeveloperTools/Controllers/LocalObjectCacheController.cs index 824d184..fe3f435 100644 --- a/DeveloperTools/Controllers/LocalObjectCacheController.cs +++ b/DeveloperTools/Controllers/LocalObjectCacheController.cs @@ -5,16 +5,14 @@ using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Web.Mvc; +using System.Web.Routing; using DeveloperTools.Core; using DeveloperTools.Models; using EPiServer.Core; using EPiServer.Framework.Cache; -using EPiServer.PlugIn; namespace DeveloperTools.Controllers { - [Authorize(Roles = "CmsAdmins")] - [GuiPlugIn(Area = PlugInArea.AdminMenu, Url = "~/localobjectcache", DisplayName = "Clear Local Object Cache")] public class LocalObjectCacheController : DeveloperToolsController { private readonly ISynchronizedObjectInstanceCache _cache; @@ -24,7 +22,47 @@ public LocalObjectCacheController(ISynchronizedObjectInstanceCache cache) _cache = cache; } - public ActionResult Index(string FilteredBy) + public ActionResult Index(string FilteredBy, bool os = false) + { + return View(PrepareViewModel(FilteredBy, os)); + } + + [HttpParamAction] + public ActionResult RemoveLocalCache(string[] cacheKeys, bool os) + { + if(cacheKeys != null) + { + foreach (string key in cacheKeys) + { + _cache.RemoveLocal(key); + } + } + + return RedirectToAction("Index", new RouteValueDictionary(new { os })); + } + + [HttpParamAction] + public ActionResult RemoveLocalRemoteCache(string[] cacheKeys, bool os) + { + if(cacheKeys != null) + { + foreach (string key in cacheKeys) + { + _cache.RemoveLocal(key); + _cache.RemoveRemote(key); + } + } + + return RedirectToAction("Index", new RouteValueDictionary(new { os })); + } + + [HttpParamAction] + public ActionResult ViewObjectSize() + { + return RedirectToAction("Index", new RouteValueDictionary(new { os = true })); + } + + private LocalObjectCache PrepareViewModel(string FilteredBy, bool viewObjectSize) { var model = new LocalObjectCache(); @@ -33,13 +71,13 @@ public ActionResult Index(string FilteredBy) switch (FilteredBy) { case "pages": - model.CachedItems = ConvertToListItem(cachedEntries.Where(item => item.Value is PageData)); + model.CachedItems = ConvertToListItem(cachedEntries.Where(item => item.Value is PageData), viewObjectSize); break; case "content": - model.CachedItems = ConvertToListItem(cachedEntries.Where(item => item.Value is IContent)); + model.CachedItems = ConvertToListItem(cachedEntries.Where(item => item.Value is IContent), viewObjectSize); break; default: - model.CachedItems = ConvertToListItem(cachedEntries); + model.CachedItems = ConvertToListItem(cachedEntries, viewObjectSize); break; } @@ -51,46 +89,18 @@ public ActionResult Index(string FilteredBy) new SelectListItem { Text = "Pages Only", Value = "pages" } }; - return View(model); + model.ViewObjectSize = viewObjectSize; + return model; } - private IEnumerable ConvertToListItem(IEnumerable cachedEntries) => + private IEnumerable ConvertToListItem(IEnumerable cachedEntries, bool viewObjectSize) => cachedEntries.Select(e => new LocalObjectCacheItem { Key = e.Key.ToString(), Value = e.Value, - Size = GetObjectSize(e.Value) + Size = viewObjectSize ? GetObjectSize(e.Value) : 0 }).ToList(); - [HttpParamAction] - public ActionResult RemoveLocalCache(string[] cacheKeys) - { - if(cacheKeys != null) - { - foreach (string key in cacheKeys) - { - _cache.RemoveLocal(key); - } - } - - return RedirectToAction("Index"); - } - - [HttpParamAction] - public ActionResult RemoveLocalRemoteCache(string[] cacheKeys) - { - if(cacheKeys != null) - { - foreach (string key in cacheKeys) - { - _cache.RemoveLocal(key); - _cache.RemoveRemote(key); - } - } - - return RedirectToAction("Index"); - } - private static long GetObjectSize(object obj) { if(obj == null) diff --git a/DeveloperTools/Models/LocalObjectCache.cs b/DeveloperTools/Models/LocalObjectCache.cs index a7015ae..9fb8e64 100644 --- a/DeveloperTools/Models/LocalObjectCache.cs +++ b/DeveloperTools/Models/LocalObjectCache.cs @@ -10,6 +10,8 @@ public class LocalObjectCache public string FilteredBy { get; set; } public IEnumerable Choices { get; set; } + + public bool ViewObjectSize { get; set; } } public class LocalObjectCacheItem diff --git a/DeveloperTools/modules/_protected/EPiServer.DeveloperTools/Views/LocalObjectCache/Index.aspx b/DeveloperTools/modules/_protected/EPiServer.DeveloperTools/Views/LocalObjectCache/Index.aspx index 64a5c36..af66879 100644 --- a/DeveloperTools/modules/_protected/EPiServer.DeveloperTools/Views/LocalObjectCache/Index.aspx +++ b/DeveloperTools/modules/_protected/EPiServer.DeveloperTools/Views/LocalObjectCache/Index.aspx @@ -53,6 +53,9 @@ + + +
@@ -62,7 +65,6 @@ - <%----%> @@ -73,19 +75,6 @@ - <%----%> <% } %> @@ -98,7 +87,12 @@ + + + + + <% } %> From 3f3c41c3976de46c3db054ef75cc688df3bbaa93 Mon Sep 17 00:00:00 2001 From: valdisiljuconoks Date: Wed, 13 Mar 2019 17:50:00 +0200 Subject: [PATCH 5/5] Added .Take(10k) to prevent potential out of mem case for installations with HUGE cache sizes --- DeveloperTools/Controllers/LocalObjectCacheController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DeveloperTools/Controllers/LocalObjectCacheController.cs b/DeveloperTools/Controllers/LocalObjectCacheController.cs index fe3f435..bb02d4a 100644 --- a/DeveloperTools/Controllers/LocalObjectCacheController.cs +++ b/DeveloperTools/Controllers/LocalObjectCacheController.cs @@ -66,7 +66,7 @@ private LocalObjectCache PrepareViewModel(string FilteredBy, bool viewObjectSize { var model = new LocalObjectCache(); - var cachedEntries = HttpContext.Cache.Cast(); + var cachedEntries = HttpContext.Cache.Cast().Take(10_000); switch (FilteredBy) {
Key Type Size@(string.IsNullOrWhiteSpace(Model.FilteredBy) ? "Value" : "Name (ID) Published")
<%= item.Key %> <%= item.Value.GetType() %> <%= item.Size %> - <% if (item.Value is IContent) - { - (item.Value as IContent).Name; - %> - <%((item.Value as IContent).ContentLink.ID); %> - <% - } - if (item.Value is PageData) - { - ((item.Value as PageData).StartPublish); - } %> -