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

the*_*man 8 c# publish sitecore sitecore6 sitecore-workflow

我正在使用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();
Run Code Online (Sandbox Code Playgroud)

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

如果我们从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))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

tec*_*414 14

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

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

using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext("shell")))
{
    //do your publish
}
Run Code Online (Sandbox Code Playgroud)

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


the*_*man 4

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

好的,在尝试了 @techphoria414 的建议代码后,很明显上下文不是问题所在。出版商毕竟遵守了工作流程,但问题是根内容节点有另一种语言的版本(日语 - 不要问我这是怎么到那里的),但后代节点没有日语版本根本不。事实上,我们的主数据库仅配置为英语作为语言,因此除管理员之外的用户甚至不可能添加其他语言的版本。

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

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

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

2)您将带有深度发布的文件夹发布到您的网络数据库(使用我问题中的代码)。这会产生以下结果(添加了文件夹,但未添加草稿“测试工作流程项目”)。这是预期的行为 - 耶!

您通过深度发布来发布文件夹

3) 将不同语言的新版本添加到包含文件夹中。

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

4) 现在选择日语作为语言,检查子项目的工作流程状态。请注意,在装订线中,它不再显示处于草稿模式,但根本没有日语版本(如右图所示)。

既然选择日语作为语言,请检查子项目的工作流程状态

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

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

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

  • 谢谢你。遇到了完全相同的问题。默认的“内容”节点有日语、德语和丹麦语版本……到底是什么?除了英语之外,系统/语言中没有定义其他语言。完全完全不同意我应该在每次渲染某些内容时明确检查 item.Versions.Count > 0 。荒谬的!特别是当这些版本没有出现在内容编辑器中时! (2认同)