我意识到这是一个老问题,但我最近从核心服务的角度与同样的问题作斗争,并想分享我采取的路线(可能有人会在我将其部署到生产之前指出我可能出错的地方)。
在使用 Core Service 尝试了几种不同的方法后,我决定将最终手动活动添加到我的工作流中,并将自定义逻辑添加到前面的自动活动中。在自动活动的核心服务逻辑中,我完成当前的自动活动(返回最终的手动活动实例),模拟原始作者,启动最终的活动实例(作为作者)并完成最终的活动实例(再次,作为作者)。
我正在使用 SessionAwareCoreServiceClient 并在 Content Manager 机器本身上运行。我必须在 Tridion Content Manager 配置实用程序的 Impersonation Users 中添加“NT AUTHORITY\SYSTEM”(使用 Impersonate 可能存在安全隐患,因此请确保它对您的环境有意义):
代码看起来像这样(虽然我省略了一些东西,比如获取当前活动实例,从第一个手动活动中检索原始作者,我添加了 using SessionAwareCoreServiceClient 以提供一些上下文):
using (SessionAwareCoreServiceClient client = new SessionAwareCoreServiceClient())
{
ActivityFinishData activityFinish = new ActivityFinishData()
{
Message = message,
NextAssignee = new LinkToTrusteeData() { IdRef = authorUser.IdRef }
};
// Finish current automatic activity
ActivityInstanceData finalActivity = client.FinishActivity(activityInstance.Id, activityFinish, new ReadOptions());
// Impersonate original author
client.Impersonate(authorUser.Title);
// Start final (manual) activity as author - if you don't start it, then non-Administrators can't finish them.
client.StartActivity(finalActivity.Id, null);
// Finish final (manual) activity as author
client.FinishActivity(finalActivity.Id, activityFinish, null);
}
希望我没有做任何太愚蠢的事情,并且可能这个答案会帮助像我这样不得不从各种其他问题/博客/参考资料中拼凑起来并执行一些试错法的人(这可能会使工作流程变得乏味)。