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在渲染之前.
TL;DR根内容节点具有另一种语言的版本,删除该版本,或者仅以英语发布阻止以草稿模式发布项目
好的,在尝试了 @techphoria414 的建议代码后,很明显上下文不是问题所在。出版商毕竟遵守了工作流程,但问题是根内容节点有另一种语言的版本(日语 - 不要问我这是怎么到那里的),但后代节点没有日语版本根本不。事实上,我们的主数据库仅配置为英语作为语言,因此除管理员之外的用户甚至不可能添加其他语言的版本。
我进行了一些测试,发现发布者忽略了以另一种语言存在的项目的工作流程。考虑以下场景:
1) 您添加一个文件夹以及下面具有工作流程的任何项目(“测试工作流程项目”)。不要提交该项目,将其保留为版本 1,处于草稿模式(即不应发布)。包含的文件夹只有一种语言(英语)的一个版本:

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

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

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

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

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