如何以编程方式发布已使用编辑器更新的Sitecore项目

时间:2016-05-25 09:08:39

标签: c# .net sitecore sitecore6

我一直在尝试通过Sitecore编辑器中已更改的代码发布项目。如果我以编程方式更新字段值并发布这些更改,那么它可以正常工作。

我们的内容管理编辑定期在编辑器中进行更改,而不必发布它们。我们希望为他们提供一种功能,可以单击一个按钮来发布所有相关更改并清除Sitecore缓存。

我不想发布整个网站,只发布了几个预定义的项目。

我们目前正在使用Sitecore.NET 6.4.1(rev.110720)。我无法更新Sitecore。

我尝试了以下选项:

选项1:实例化新的发布商对象

Database master = Sitecore.Configuration.Factory.GetDatabase("master");
Database web = Sitecore.Configuration.Factory.GetDatabase("web");

Sitecore.Publishing.PublishOptions publishOptions = new Sitecore.Publishing.PublishOptions(master,
                        web,
                        Sitecore.Publishing.PublishMode.SingleItem,
                        item.Language,
                        System.DateTime.Now); 

Sitecore.Publishing.Publisher publisher = new Sitecore.Publishing.Publisher(publishOptions);

publisher.Options.RootItem = item;

publisher.Options.Deep = true;

publisher.Publish(); 

选项2:使用静态发布管理器

Database db = Sitecore.Configuration.Factory.GetDatabase("web");
Database[] databases = new Database[1] { db };

Sitecore.Handle publishHandle = Sitecore.Publishing.PublishManager.PublishItem(item, databases, db.Languages, true, false);

两种方法都包含在using语句中,以使用内容管理编辑使用的同一帐户。

string domainUser = @"sitecore\admin";

if (Sitecore.Security.Accounts.User.Exists(domainUser))
{
      Sitecore.Security.Accounts.User user =
      Sitecore.Security.Accounts.User.FromName(domainUser, false);

      using (new Sitecore.Security.Accounts.UserSwitcher(user))
      {
            // publish code ...
      }

}

根据我的判断,日志不会显示任何值得注意的内容

ManagedPoolThread #7 13:41:46 INFO  Job started: Publish to 'web'
ManagedPoolThread #7 13:41:46 INFO  HtmlCacheClearer clearing HTML caches for all sites (5).
ManagedPoolThread #7 13:41:46 INFO  HtmlCacheClearer done.
ManagedPoolThread #7 13:41:46 INFO  Job ended: Publish to 'web' (units processed: 2)
ManagedPoolThread #5 13:41:46 INFO  Job ended: Publish (units processed: )

它定义上不是缓存问题,因为在以编程方式清除缓存之前在编辑器中手动发布时,更改在代码中可见。

所以我正在寻找一种以编程方式发布预定义更新项目列表的方法,而忽略了编辑的方式。

3 个答案:

答案 0 :(得分:4)

这就是我在Sitecore 6.5解决方案中发布项目的方法。看起来非常类似于您的第一个解决方案,这对我来说仍然很好。您是否在sitecore日志中看到任何错误/信息日志?

        public void PublishItem(Database dbMaster, Database dbWeb, Item iParent) 
        {
            try
            {
                PublishOptions po = new PublishOptions(dbMaster, dbWeb, PublishMode.SingleItem, Sitecore.Context.Language, DateTime.Now);
                po.RootItem = iParent;
                po.Deep = true; // Publishing subitems

                (new Publisher(po)).Publish();
            }
            catch (Exception ex)
            {
                Sitecore.Diagnostics.Log.Error("Exception publishing items from custom pipeline! : " + ex, this);
            }
        }

关于缓存,应该由Web数据库上的发布操作自动处理。

有时当我在master数据库上以编程方式操作项目时,我强制Sitecore仅为具有以下代码的项目清除缓存:

        Item baseitem = Database.GetDatabase("master").SelectSingleItem(sitecore_path);
        if (baseitem != null)
        {
                    //Sitecore.Caching.CacheManager.ClearAllCaches();  
                    string load = String.Concat(new object[] { "item:load(id=", baseitem.ID, ",language=", baseitem.Language, ",version=", baseitem.Version, ")" });
                    Sitecore.Context.ClientPage.SendMessage(this, load);
                    String refresh = String.Format("item:refreshchildren(id={0})", baseitem.Parent.ID);
                    Sitecore.Context.ClientPage.ClientResponse.Timer(refresh, 2);
        }

答案 1 :(得分:2)

据我所知,在发布时清除所有缓存并不是一种实用的方法。它会对网站性能产生很大影响。

实际上,在编辑dbbrowser中的内容之后,您只需要清除特定于项目的缓存(仅适用于已编辑的项目)。要知道如何操作,请检查 - http://sitecoreblog.patelyogesh.in/2013/08/sitecore-partial-cache-clear-programmatically.html

你应该采取的措施,步骤: 1.编辑DBBrowser中的内容 2.在发布之前,清除发布项目的特定于项目的缓存 3.没有额外的" web"或者"掌握"缓存清算需要发布。

我确定这有助于您的解决方案。

答案 2 :(得分:1)

毕竟,这个问题实际上并不在代码中,只是错误的处理顺序和使用正确的数据库。

  1. 更新Sitecore编辑器中的字段
  2. 清除主数据库缓存
  3. 从主数据库中明确获取项目
  4. 以“web”数据库作为目标
  5. 发布项目
  6. 清除“网络”数据库缓存
  7. 发布项目的最终代码:

    using (new Sitecore.SecurityModel.SecurityDisabler())
    {
        string itemId = "E7A2DE22-4338-49A6-840F-4B3124F1FFBD";
    
        Database webdb = Sitecore.Configuration.Factory.GetDatabase("web");
        Database masterdb = Sitecore.Configuration.Factory.GetDatabase("master");
    
        ClearSitecoreDatabaseCache(masterdb);
    
        Item masterItem = masterdb.GetItem(new ID(itemId));
    
        // target databases
        Database[] databases = new Database[1] { webdb };
    
        Sitecore.Handle publishHandle = Sitecore.Publishing.PublishManager.PublishItem(masterItem, databases, webdb.Languages, true, false);
    
        ClearSitecoreDatabaseCache(webdb);
    }
    

    清除缓存的代码:

    public void ClearSitecoreDatabaseCache(Database db)
    {
        // clear html cache
        Sitecore.Context.Site.Caches.HtmlCache.Clear();
    
        db.Caches.ItemCache.Clear();
        db.Caches.DataCache.Clear();
    
        //Clear prefetch cache
        foreach (var cache in Sitecore.Caching.CacheManager.GetAllCaches())
        {
            if (cache.Name.Contains(string.Format("Prefetch data({0})", db.Name)))
            {
                cache.Clear();
            }
        }
    }