2011-05-04 17 views
5

Abbiamo un'applicazione web MVV asp.net che utilizza l'oggetto HttpRuntime.Cache
per mantenere alcuni valori di ricerca statici. Vogliamo essere in grado di monitorare che cosa è
essere memorizzato nella cache in tempo reale per permetterci di individuare alcuni possibili problemi di memorizzazione nella cache.Come visualizzare il contenuto della cache di asp.net?

Dal momento che questo oggetto non viene digitato fortemente durante la lettura da esso, è necessario dinamicamente
trasmettere ogni voce al suo tipo concreto.

La maggior parte degli elementi memorizzati nella cache sono di IEnumerable dove T può essere qualsiasi classe che utilizziamo nel nostro progetto
o nuovi che potrebbero eventualmente essere aggiunti man mano che il progetto va oltre.
Qualcuno può darmi un puntatore su come farlo?

Grazie mille.

+0

Quale pensi che possa essere l'errore? Potrebbe aiutare con suggerimenti su come monitorarlo piuttosto che questo potenziale approccio da mazza. – Lazarus

+0

È per rilevare i problemi che "potrebbero" verificarsi, quindi non sappiamo in anticipo. –

risposta

4

Utilizzare ASP.NET MVC stesso.

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

e per la vista

Html.DisplayForModel() 

Si vuole utilizzare un modello di oggetto personalizzato (in pratica prendere il modello MVC e spegnere la restrizione di profondità).

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

Sul modello di oggetto che si vuole alterare

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

e cambiare il> 1 ad essere un numero superiore come 5-10 o semplicemente rimuovere completamente questo controllo di profondità (I' d probabilmente inizi con un 5 e vai da lì).

+0

Sembra il modo migliore per farlo ma, puoi approfondire un po 'di più su come mi suggerisce di farlo? Voglio dire, riguardo al modello, cosa devo fare per farlo funzionare? –

+0

È necessario creare il modello in Views

+0

Ma come questo modello scoprirà come visualizzare l'archivio informazioni nella cache? Voglio dire, dal momento che si tratta di un tipo di oggetto, nel modello, non posso accedere a nessuna proprietà e, dato che può essere qualsiasi cosa, come potrei essere in grado di fare tale cosa senza dover codificare il cast di tipo specifico per tipo? –

1

Si potrebbe provare a serializzare Json utilizzando la classe JavaScriptSerializer. In questo modo non è necessario eseguire il cast sul tipo originale poiché il metodo Serialize può prendere qualsiasi oggetto e visualizzarlo in un formato JSON leggibile. Potrebbe soffocare su alcuni tipi complessi e se ciò dovesse accadere si potrebbe anche provare il Newtonsoft Json.NET.

+0

Interessante! Ma sto avendo problemi a capire come usarlo per ottenere ciò di cui abbiamo bisogno. Puoi approfondire un po 'di più? –

+0

@ Stéphan, come questo: 'string result = new JavaScriptSerializer(). Serialize (someObjectInstance)'; dove 'someObjectInstance' può essere qualsiasi cosa. Quindi è possibile scorrere i valori nella cache e serializzarli in questo modo. –

+0

Come sospettavo, i miei grafici objet nella cache sono piuttosto grandi e ricevo un messaggio: Errore durante la serializzazione o la deserializzazione usando JavaScriptSerializer JSON. La lunghezza della stringa supera il valore impostato sulla proprietà maxJsonLength. Ho provato a impostare la proprietà MaxJsonLength del mio serializzatore. –

0

È importante sottolineare che la cache esiste nel dominio App per l'app Web MVC, quindi non sarebbe accessibile esternamente, sarebbe necessario implementare alcune funzionalità di monitoraggio in-app o comunicazioni inter-App Domain per abilitare un app esterna per richiedere i dati della cache dal dominio dell'app MVC.

+0

È vero, e per la cronaca, il nostro gestore della cache si troverebbe nella stessa app Web, quindi non è un problema, ma grazie per averlo chiarito ad altri che potrebbero saperlo. :) –

0

Bene, I penso quello che stai chiedendo è un modo per determinare quali sono i parametri di tipo di un tipo generico in fase di esecuzione - nel tuo esempio la situazione è complicata perché stai cercando un'interfaccia non un'istanza di oggetto.

Nethertheless questo è ancora piuttosto semplice, il seguente esempio dovrebbe almeno punto nella giusta direzione su come fare questo:

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>; 
    } 
} 

Ma non posso davvero vedere come questo aiuta a risolvere il sottostante problema di monitorare la cache?

In passato, quando si tentava di monitorare le prestazioni delle cache, ho trovato che creare i propri contatori Perfmon molto utili per il monitoraggio - come esempio di base inizia con un contatore "# Voci" (che si incrementa ogni volta che un elemento viene aggiunto alla cache e decrementa ogni volta che un elemento viene rimosso dalla cache) e aggiunge contatori come pensate sarebbe utile mentre si va - un contatore di visite cache e un contatore miss della cache sono normalmente piuttosto utili.

È anche possibile fare in modo che il contatore Perfmon analizzi le informazioni di memorizzazione nella cache disponendo di molte istanze dei contatori, uno per ogni tipo di cache (o nel caso più probabile il tipo generico IEnumerable in cache), proprio come il "Processo" il gruppo di contatori perfmon ha un'istanza per ogni processo nel sistema, si avrà un'istanza per ogni tipo nella cache (in più si dovrebbe aggiungere anche un'istanza "_Total" o simile).

L'utilizzo dei contatori Perfmon mediante operazioni di registrazione sulla cache consente di monitorare le prestazioni della cache in una discreta quantità di dettagli con un sovraccarico di prestazioni di runtime molto ridotto.

Problemi correlati