Как отобразить содержимое кеша asp.net? - PullRequest
5 голосов
/ 04 мая 2011

У нас есть веб-приложение asp.net MVC, которое использует объект HttpRuntime.Cache
для хранения некоторых статических значений поиска.Мы хотим иметь возможность отслеживать то, что
кэшируется в режиме реального времени, чтобы мы могли определить некоторые возможные проблемы с кэшированием.

Поскольку этот объект не является строго типизированным при чтении из него, нам нужно динамически
привести каждую запись к его конкретному типу.

Большинство кэшируемых элементов имеют IEnumerable, где T может быть любыми классами, которые мы используем в нашем
проекте, или новыми, которые в конечном итоге могут быть добавлены по мере продвижения проекта.
Может кто-нибудь дать мнеуказатель на как это сделать?

Большое спасибо.

Ответы [ 4 ]

4 голосов
/ 04 мая 2011

Использовать сам 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, или просто полностью удалите эту проверку глубины (я бы, вероятно, начал с 5 и пошел оттуда).

1 голос
/ 04 мая 2011

Вы можете попытаться Json сериализовать его, используя класс JavaScriptSerializer .Таким образом, вам не нужно приводить к исходному типу, так как метод Serialize может взять любой объект и вывести его в удобочитаемом формате JSON.Это может подавить некоторые сложные типы, и если это произойдет, вы также можете попробовать Newtonsoft Json.NET .

0 голосов
/ 04 мая 2011

Ну, я думаю, , что вы запрашиваете, - это способ определения параметров типа универсального типа во время выполнения - в вашем примере ситуация сложна, потому что вы после интерфейса, а не экземпляр объекта.

Тем не менее, это все еще довольно просто, следующий пример должен по крайней мере указать вам правильное направление, как это сделать:

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 при записи операций в кеш позволяет вам контролировать производительность вашего кеша с достаточной детализацией при очень небольшом снижении производительности во время выполнения.

0 голосов
/ 04 мая 2011

Важно подчеркнуть, что кэш существует в домене приложения для веб-приложения MVC, поэтому он не будет доступен извне, вам потребуется либо реализовать некоторый мониторинг в приложении, либо обмен данными между доменами приложения для включения внешнего приложение для запроса данных кэша из вашего домена приложения MVC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...