我正在使用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中绝对没有显示。他们还发出警告,“当前项目没有”英语:英语“的版本。
答案 0 :(得分:14)
可能问题是您的网络服务未在启用了工作流程的网站上下文中运行。
在代码中执行此操作的最简单方法是使用SiteContextSwitcher
更改为“shell”网站。
using (new SiteContextSwitcher(SiteContextFactory.GetSiteContext("shell")))
{
//do your publish
}
对于没有版本的已发布项目:理论上,即使是定期发布,这仍然会发生。工作流程限制项目版本的发布,而不是项目本身。在您的代码中,在迭代项目时以及在其他情况下,您需要在呈现之前检查item.Versions.Count > 0
。
答案 1 :(得分:4)
TL; DR 根内容节点包含其他语言的版本,删除该版本,或仅使用英语发布阻止以草稿模式发布项目
好的,所以在尝试了@ techphoria414的建议代码之后,很明显上下文不是问题。发布者毕竟坚持工作流程,但问题已经证明是具有另一种语言版本的根内容节点(日语 - 不要问我这是怎么到的),但后代节点没有日语版本一点都不实际上,我们的master数据库只配置为将英语作为一种语言,因此除了admin之外的用户甚至不可能用另一种语言添加一个版本。
我进行了一些测试,发现发布商忽略了另一种语言中存在的项目的工作流程。请考虑以下情形:
1)您添加一个文件夹和下面的任何项目(“测试工作流程项目”),其中包含工作流程。不要提交项目,将其保留在版本1,处于草稿模式(即不应发布)。 包含文件夹只有一种语言版本(英文):
2)您将具有深度发布的文件夹发布到您的Web数据库(使用我的问题中的代码)。这导致以下结果(添加了文件夹,但未添加草稿“测试工作流程项”)。这是预期的行为 - 耶!
3)使用其他语言向包含文件夹添加新版本。
4)现在选择日语作为语言,检查子项的工作流状态。请注意,在排水沟中它不再表示它处于草稿模式,但日语中没有任何版本(如右图所示)。
5)将所有语言的包含文件夹发布到Web数据库,与之前完全相同。现在请注意,“测试工作流程项目”已发布,但根本没有版本。 这是我们的发布所发生的事情,除了根本内容节点,这意味着无数项目已发布但不应发布
现在,为什么我们的根内容节点有一个日语版本是一个完全的谜,但至少我们已经弄清楚为什么我们的草案项目已经发布,所以我们可以在将来阻止它。我怀疑它与升级Sitecore有关,因为日语中有2个版本大致对应于过去2年的升级日期。