Способ один раз загрузить XML-файлы .net c # - PullRequest
1 голос
/ 07 сентября 2011

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

Проблема в том, что я загружаю эти файлы примерно 20 раз на страницу, и когда я хочу получить к ним доступ из файлов классов / ashx, я просто продолжаю открывать их. Есть ли способ загрузить XML-файлы, которые были глобальными ресурсами, и получить доступ к содержимому из моих файлов классов / cs / ashx?

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

Спасибо.

Ответы [ 3 ]

3 голосов
/ 07 сентября 2011

Вы можете хранить свои файлы в кэше , сеансе , приложении или ViewState объектах.

Я думаю, что наиболее предпочтительным для является Cache объект, потому что вы можете добавить некоторые зависимости на основе файлов , и ваши объекты будут автоматически обновлены:

Cache.Insert("CacheItem4", "Cached Item 4", new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml")));
2 голосов
/ 07 сентября 2011

В подобных ситуациях я использую помощника:

public class CacheUtil
{
    private static readonly object locker=new object();
    public static T GetCachedItem<T>(string cacheKey,
                                     Func<T> valueCreateFunc, 
                                     TimeSpan duration)
    {
        var expirationTime = DateTime.UtcNow + duration;
        var cachedItem = HttpRuntime.Cache[cacheKey];
        if (cachedItem == null)
        {
            lock(locker)
            {
                cachedItem = HttpRuntime.Cache[cacheKey];
                if (cachedItem == null)
                {
                    cachedItem = valueCreateFunc();
                    HttpRuntime.Cache.Add(cacheKey,
                                          cachedItem,
                                          null,
                                          expirationTime,
                                          Cache.NoSlidingExpiration,
                                          CacheItemPriority.High,
                                          null);
                }
            }

        }
        return (T) cachedItem;
    }
}

, который я бы использовал примерно так:

CacheUtil.GetCachedItem(
    "someUniqueKey",
    ()=>{ //fetch resource from disk
          return value;},
    TimeSpan.FromDays(1)
)

Предоставленный делегат будет вызываться только один раз в день.Если элемент уже находится в кэше, делегат больше не будет вызываться.

0 голосов
/ 07 сентября 2011

Вам нужно создать оболочку для доступа к вашим файлам, которая будет иметь такие свойства, как:

public class MyMarkupProvider
{
    public XDocument HomePageLayout {get;set;}
}

Также она будет создана для кэширования этих файлов.Взгляните на использование кеша и файла CacheDependency: Кэширование файлов с использованием ASP.NET Cache Dependency

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