SiteMap: Refreshing It?

Last post 10-02-2006 1:54 PM by KenA. 2 replies.

Sort Posts:

  • SiteMap: Refreshing It?

    10-02-2006, 9:46 AM
    • Member
      562 point Member
    • KenA
    • Member since 04-02-2003, 1:43 AM
    • Brazil
    • Posts 157
    I have a custom sitemap provider and I´m not using SqlCacheDependency ... After I change/delete/add a link which is stored in my database I need to refresh my sitemap ... by default the provider model caches the sitemap, so I need to clear this cache and re-load the sitemap ... suppose I have a buttom in my masterpage in order to clear this cache ... how could I do it?
    »»» KenA
  • Re: SiteMap: Refreshing It?

    10-02-2006, 10:09 AM
    Answer
    • Contributor
      2,948 point Contributor
    • joeaudette
    • Member since 05-29-2006, 10:46 PM
    • Posts 593

    In my custom SiteMapProvider I use a file dependency and touch the file whenever I want to clear the cache.

    However an alternate approach is needed in a web farm environment. In that case I might have a dependency check by looking up a record in the db and then touch the file if its expired in the db, that way each node of the web farm will touch its own copy of the dependency file.

    Code like this works fine on a single server:


    // using a text file dependency

    public override SiteMapNode BuildSiteMap()
    {

        if (rootNode != null)
        {
        return rootNode;
        }

        lock (objLock)
        {

        menuPages = SiteUtils.GetMenuPages();

        if (menuPages != null)
        {
            rootNode = CreateRootNode();
            int i = 0;
            foreach (PageSettings page in menuPages)
            {

            if (page.ParentID <= -1)
            {
                SiteMapNode node = CreateSiteMapNode(page, i);
                AddNode(node, GetParentNode(page));
                if ((page.UseUrl) && (page.Url.StartsWith("http")))
                {
                node.Url = page.Url;
                }
            }

            i += 1;

            }


        }
        }

        CacheDependency cacheDependency = new CacheDependency(
        SiteUtils.GetPathToSiteMapCacheDependencyFile());

        HttpRuntime.Cache.Insert(
        cacheDependencyName,
        new object(),
        cacheDependency,
        Cache.NoAbsoluteExpiration,
        Cache.NoSlidingExpiration,
        CacheItemPriority.Normal,
           new CacheItemRemovedCallback(OnSiteMapChanged));



        return rootNode;
    }

    protected override void Clear()
    {
        lock (objLock)
        {
        this.rootNode = null;
        this.nodes.Clear();
        base.Clear();
        }
    }


    public void OnSiteMapChanged(string key, object item, CacheItemRemovedReason reason)
    {
        Clear();

    }

    After changing some thing I call:
    SiteUtils.ResetSiteMapCache();

    public static void ResetSiteMapCache()
    {
        TouchMenuCacheDependencyFile();
        String pathToCacheDependencyFile = GetPathToSiteMapCacheDependencyFile();
        if (pathToCacheDependencyFile != null)
        {
        if (File.Exists(pathToCacheDependencyFile))
        {
            File.SetLastWriteTimeUtc(pathToCacheDependencyFile, DateTime.Now);
        }
        else
        {
            StreamWriter streamWriter = File.CreateText(pathToCacheDependencyFile);
            streamWriter.Close();
        }
        }
    }

    Hope it helps,

    Joe 

  • Re: SiteMap: Refreshing It?

    10-02-2006, 1:54 PM
    • Member
      562 point Member
    • KenA
    • Member since 04-02-2003, 1:43 AM
    • Brazil
    • Posts 157

    Hi Joe,

    That´s a good trick and actually solved my issue. Thanx for the tip :-)

    »»» KenA
Page 1 of 1 (3 items)