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

标签 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 桌面中完全没有显示字段或元数据方面的任何内容。他们还显示警告“当前项目没有“英语:英语”版本”。

最佳答案

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

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

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

关于无版本的发布项目:理论上,即使是正常发布,也会出现这种情况。工作流限制项目版本的发布,而不是项目本身。在您的代码中,在迭代项目时以及在其他情况下,您需要在渲染之前检查 item.Versions.Count > 0 是否。

关于c# - 为什么 Sitecore 从 C# API 发布草稿项目,我该如何阻止它这样做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12285080/

相关文章:

c# - 如何记录一条消息以便我可以在 VS2013 中看到它?

c# - 不同的 .NET 程序集引用取决于 32-64 位

sitecore 分析 pdf 下载跟踪

mysql - 使用 Django 在服务器上运行 mySQL

c# - 命名空间的奇怪问题

security - 配置一个 sitecore 角色来访问系统文件夹

sitecore - 访问 HttpRequest 管道中的 session

visual-studio-2015 - 如何在 VS 2015 中发布 Visual Studio 数据库项目

javascript - this.userId 在 Meteor.publish 中返回 undefined

c# - 如何在 .NET Core DI 中强制创建类的实例?