如何显示asp.net缓存的内容?

时间:2011-05-04 13:50:21

标签: c# caching reflection dynamic casting

我们有一个使用HttpRuntime.Cache的asp.net MVC Web应用程序 对象保留一些静态查找值。我们希望能够监控什么是 实时缓存,以便我们查明一些可能的缓存问题。

由于此对象在读取时没有强类型,因此我们需要动态地使用 将每个条目转换为具体类型。

大多数缓存的项目都是IEnumerable,其中T可以是我们在中使用的任何类 随着项目的进一步发展,最终可以添加的项目或新项目 有人可以给我一个如何做到这一点的指针?

非常感谢。

4 个答案:

答案 0 :(得分:4)

使用ASP.NET MVC本身。

public ActionResult Index()
{
    return View(HttpRuntime.Cache)
}

和视图

Html.DisplayForModel()

您将需要使用自定义对象模板(基本上采用MVC模板并关闭深度限制)。

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-3-default-templates.html

在对象模板上,您需要更改

else if (ViewData.TemplateInfo.TemplateDepth > 1) { %>
    <%= ViewData.ModelMetadata.SimpleDisplayText %>

并更改&gt; 1要么是一个更高的数字,如5-10,要么只是完全删除这个深度检查(我可能从5开始,然后从那里开始)。

答案 1 :(得分:1)

您可以尝试使用JavaScriptSerializer类对Json进行序列化。这样您就不需要转换为原始类型,因为Serialize方法可以接受任何对象并以人类可读的JSON格式输出它。它可能会阻塞一些复杂类型,如果发生这种情况,您也可以尝试Newtonsoft Json.NET

答案 2 :(得分:0)

重要的是要强调缓存存在于MVC Web应用程序的App Domain中,因此无法在外部访问,您需要实现一些应用程序内监控或应用程序域间通信以启用外部应用程序从MVC应用程序域请求缓存数据。

答案 3 :(得分:0)

好吧,我认为你要求的是一种确定泛型类型参数在运行时的方法 - 在你的例子中,情况很复杂,因为你在接口之后没有一个对象实例。

尽管如此,这仍然非常简单,下面的例子至少应该指出你如何做到这一点的正确方向:

object obj= new List<string>();
Type type = obj.GetType();

Type enumerable = type.GetInterfaces().FirstOrDefault(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(IEnumerable<>));
if (enumerable != null)
{
    Type listType = enumerable.GetGenericArguments()[0];
    if (listType == typeof(string))
    {
        IEnumerable<string> e = obj as IEnumerable<string>;
    }
}

但我真的看不出这有助于您解决监控缓存的潜在问题?

在过去尝试监视缓存的性能时,我发现创建自己的简单Perfmon计数器非常有助于监视目的 - 作为一个基本示例从“#Entries”计数器开始(无论何时项目是添加到缓存并在每次从缓存中删除项目时递减),并添加您认为有用的计数器 - 缓存命中计数器和缓存未命中计数器通常也非常有用。

你也可以让你的Perfmon计数器通过拥有许多计数器实例来分解缓存信息,每个类型都被缓存一个(或者在你的情况下更可能是缓存的通用IEnumerable类型) - 就像“进程”perfmon计数器组为您系统上的每个进程都有一个实例,您将为缓存中的每个类型设置一个实例(另外还应添加“_Total”实例或类似实例)。

通过在缓存上记录操作来使用Perfmon计数器,您可以使用非常少的运行时性能开销,以相当多的细节监视缓存性能。