2011-05-04 72 views
5

我们有一个asp.net MVC web应用程序,它使用HttpRuntime.Cache
对象来保留一些静态查找值。我们希望能够实时监控什么是
,以便我们确定一些可能的缓存问题。如何显示asp.net缓存的内容?

由于该对象在读取时没有强类型,我们需要动态地将每个条目转换为它的具体类型

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

非常感谢。

+0

您认为这个错误可能是什么?它可以帮助提供关于如何监控它的建议,而不是这种潜在的大锤方法。 – Lazarus 2011-05-04 13:59:40

+0

这是为了检测“可能”发生的问题,所以我们不提前知道。 – 2011-05-04 14:42:28

回答

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 %> 

,并更改> 1或者是更高的数字,如5-10,或只是完全删除这个深度检查(I” d可能以5开头,然后从那里开始)。

+0

这似乎是最好的方法,但是,你能否详细说明你如何建议我这么做?我的意思是,关于模板,我需要做些什么来实现这个目标? – 2011-05-04 14:15:34

+0

您需要在Views 2011-05-04 14:30:11

+0

但是如何这个模板将弄清楚如何显示缓存中的信息存储?我的意思是,因为它是一个对象类型,所以在模板中,我无法访问任何属性和旁边的任何属性,因为它可以是任何东西,我怎么能够做到这样的事情,而不必为每个类型代码编写特定的类型转换? – 2011-05-04 15:04:33

1

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

+0

有趣!但是我在解决如何使用它来实现我们需要的问题时遇到了问题。你能再详细一点吗? – 2011-05-04 14:10:48

+0

@Stéphan,像这样:'string result = new JavaScriptSerializer()。Serialize(someObjectInstance)';其中'someObjectInstance'可以是任何东西。所以你可以遍历缓存中的值并像这样序列化它们。 – 2011-05-04 14:12:45

+0

正如我怀疑的那样,缓存中的objet图很大,我收到一条消息:在使用JSON JavaScriptSerializer进行序列化或反序列化期间出现错误。字符串的长度超过maxJsonLength属性中设置的值。我试图设置我的序列化程序的MaxJsonLength属性。 – 2011-05-04 14:25:35

0

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

+0

确实如此,并且为了记录,我们的缓存管理器将位于同一个Web应用程序中,所以这不是一个问题,但是,感谢您为可能知道这一点的其他人澄清此问题。 :) – 2011-05-04 14:26:43

0

嗯,我认为你所要求的是确定一个泛型类型的类型参数在运行时什么样的方式 - 在您的示例的情况是复杂的,因为你是一个接口,而不是一个对象实例后。

Nethertheless这仍然是非常简单的,下面的例子中至少应该点你在正确的方向上如何做到这一点:

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计数器,您可以通过很少的运行时性能开销来监控缓存性能的大量细节。