2011-05-04 78 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計數器,您可以通過很少的運行時性能開銷來監控緩存性能的大量細節。