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

时间:2012-09-05 15:41:09

标签: c# sitecore publish 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();

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

如果我们在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中绝对没有显示。他们还发出警告,“当前项目没有”英语:英语“的版本。

2 个答案:

答案 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,处于草稿模式(即不应发布)。 包含文件夹只有一种语言版本(英文):

You add a folder and any item underneath which has workflow Folder has english version only

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

You publish the folder with a deep publish

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

Add a new version to the containing folder in a different language

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

Check the workflow state of the child item now that Japanese is selected as the language

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

Publish again using the exact same code

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