为什么Sitecore会从C#API发布草稿项目,我该如何阻止它呢?

我正在使用Sitecore发布API运行我的Sitecore主数据库的预定发布。 我在一天中按计划的时间间隔调用一个Web服务,它运行以下代码(为了便于阅读,略微精简):

// grab the root content node from sitecore Item contentNode = dbSource.Items[ID.Parse("{0DE95AE4-41AB-4D01-9EB0-67441B7C2450}")]; PublishOptions options = new PublishOptions(sourceDatabase, targetDatabase, PublishMode.Smart, lang, DateTime.Now); options.RootItem = contentNode; options.Deep = true; Publisher p = new Publisher(options); p.PublishAsync(); 

当我们运行上面的代码时,它会发布内容节点中的所有内容,包括所有后代,而不管工作流状态如何。 这就像它完全忽略了工作流程。 这不是我们所追求的,并且在我们的实时网站上造成了很多问题。

如果我们从Sitecore Desktop中运行相同的操作,它将发布内容节点中的所有内容,包括可发布的所有后代(即最终工作流阶段)。 它不会在树中发布仍处于草稿模式的任何项目。 这是必需的行为。

我已尝试通过使用以下using语句包含上述代码来将代码实现为非管理员用户:

 string userName = @"sitecore\******"; Sitecore.Security.Accounts.User user = Sitecore.Security.Accounts.User.FromName(userName, true); user.RuntimeSettings.IsAdministrator = false; using (new Sitecore.Security.Accounts.UserSwitcher(user)) { ... } 

不幸的是,这没有任何效果。

有没有明显的我错过了,或者我做得对,Sitecore做错了吗? 有人可以帮忙吗?

我注意到的一个奇怪的事情是,在实时数据库中查看时发布的草稿项目在字段或元数据方面在Sitecore Desktop中绝对没有显示。 他们还发出警告说“当前项目没有”英语:英语版“。

可能的问题是您的Web服务未在启用了工作流的站点上下文中运行。

在代码中执行此操作的最简单方法是使用SiteContextSwitcher更改为“shell”站点。

 using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext("shell"))) { //do your publish } 

至于没有版本的已发表项目:理论上,即使是定期发布,这仍然会发生。 工作流程限制项目版本的发布,而不是项目本身。 在您的代码中,在迭代项目时和其他情况下,您需要在呈现之前检查item.Versions.Count > 0是否item.Versions.Count > 0

TL; DR根内容节点具有另一种语言的版本,删除该版本,或者仅以英语发布阻止以草稿模式发布项目

好的,所以在尝试了@ techphoria414的建议代码后,很明显上下文不是问题。 发布者毕竟坚持工作流程,但问题已经certificate是具有另一种语言版本的根内容节点(日语 – 不要问我这是怎么到的),但后代节点没有日语版本一点都不 事实上,我们的master数据库只配置为将英语作为一种语言,因此除了admin之外的用户甚至不可能用另一种语言添加一个版本。

我进行了一些测试,发现发布者忽略了另一种语言中存在的项目的工作流程。 请考虑以下情形:

1)您添加一个文件夹和下面的任何项目(“测试工作流程项目”),其中包含工作流程。 不要提交项目,将其保留为版本1,处于草稿模式(即不应发布)。 包含文件夹只有一种语言版本(英语):

您添加一个文件夹以及包含工作流程的任何项目文件夹只有英文版

2)您将具有深度发布的文件夹发布到您的Web数据库(使用我的问题中的代码)。 这导致以下内容(添加了文件夹,但未添加草稿“测试工作流程项”)。 这是预期的行为 – 耶!

您使用深度发布发布文件夹

3)使用其他语言将新版本添加到包含文件夹

使用其他语言将新版本添加到包含文件夹

4)现在选择日语作为语言,检查子项的工作流状态。 请注意,在排水沟中它不再表示它处于草稿模式,但日语中根本没有任何版本(如右图所示)。

现在,选择日语作为语言,检查子项的工作流状态

5)将所有语言的包含文件夹发布到Web数据库,与以前完全相同。 现在请注意,“测试工作流程项目”已发布,但根本没有版本。 这是我们的发布所发生的事情,除了从根内容节点开始,这意味着无数的项目已经发布,不应该发布

使用完全相同的代码再次发布

现在,为什么我们的根内容节点有一个日语版本是一个完全的谜,但至少我们已经弄清楚为什么我们的草案项目已经发布,所以我们可以在将来阻止它。 我怀疑它与升级Sitecore有关,因为日语中有2个版本大致对应于过去2年的升级日期。