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



我一直试图通过Sitecore编辑器中更改的代码发布项目。如果我用程序更新字段值并发布这些更改,它仍然可以正常工作。

我们的内容管理编辑器定期对编辑器进行更改,而不必发布这些更改。我们希望为他们提供点击一个按钮的功能,发布所有相关更改并清除Sitecore缓存。

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

我们目前正在使用Sitecore.NET 6.4.1(修订版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 = @"sitecoreadmin";
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: )

这显然不是缓存问题,因为在用程序清除缓存之前,在编辑器中手动发布时,更改在代码中可见。

因此,我正在寻找一种方法,以程序的方式发布一个预定义的更新项目列表,而不考虑编辑的方式。

这就是我过去在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. 更新Sitecore编辑器中的字段
  2. 清除master数据库缓存
  3. 从master数据库显式获取项
  4. 以"web"数据库为目标发布项目
  5. 清除"web"数据库缓存

发布项目的最终代码:

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

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

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

你应该采取的手段和步骤:1.从DBBrowser编辑内容2.发布前,清除发布项目的项目特定缓存3.不需要发布额外的"web"或"master"缓存清除。

我相信这将有助于你的解决方案。

最新更新