在Sitecore中的特定时间发布的最佳方式

时间:2015-04-02 01:45:16

标签: sitecore

据我所知,开箱即用的Sitecore没有办法在特定时间发布内容。我的意思是一天中的精确时间。

根据我的理解,你通过设置一个间隔来打开发布代理...让我们说每半个小时(似乎不是一个好主意自动发布比这更频繁)。然后,您的作者会对项目设置发布限制。当该限制通过时,下次发布代理运行时将发布该项。正确的吗?

上述方案不允许在特定时间发布某些内容。如果我有一个页面需要在明天早上8点上线,那么它可能会在上午8:30左右开始生效,具体取决于间隔时间是否与上午8点相关。我有正确的吗?

设置内容的最佳方法是什么,以便作者可以在一天的特定时间发布项目?

4 个答案:

答案 0 :(得分:5)

您对发布代理是正确的。所有Sitecore的代理都是基于时间间隔的,并且不保证在特定时间运行。您可以缩短间隔时间,但由于发布大部分是串行任务,如果您的间隔是5分钟,而您的网站发布需要7分钟,那么您将获得一堆发布作业(每隔5分钟将一个人放在队列中。

在特定时间保证发布的唯一方法是让某人通过内容编辑器在那时进行。自动化方面,Sitecore对此没有任何帮助。在过去,时钟时间对于工作运行至关重要,我已经看到Windows计划任务运行并点击网站上的URL以启动它。

如果时间非常重要,那么您可以为内容采取的另一种方法是在基本模板上设置日期时间字段,然后在ItemResolver之后运行httpBeginRequest管道步骤。让该步骤读取该字段的时间,然后关于管道,如果该项目不是"生活"爱好。

答案 1 :(得分:2)

Sitecore Marketplace中有一个模块:

https://marketplace.sitecore.net/en/Modules/Automated_Publisher.aspx

每次作者为项目设置发布限制时,模块都会添加新的计划任务并在特定时间发布项目。

答案 2 :(得分:2)

您可以按照此link中的说明触发特定时间的任务,您必须编写发布任务的代码,例如:

PublishOptions options = 
       new PublishOptions(master, web, PublishMode.Smart, 
       Sitecore.Globalization.Language.Parse("en"), DateTime.Now) 
            {
                Deep = true;
            };

Publisher publisher = new Publisher(options);
publisher.PublishAsync();

答案 3 :(得分:0)

我也必须完成这项任务。您不能使用标准的sitecore调度程序,因为它们只运行x个周期,这可能会有所不同,具体取决于站点核心的Apppool何时被回收等等。我最后跳过以下箍:

在您的网站上构建一个类:

public  class PublishCommand
{
    public void RunFullPublish()
    {
        using (new SecurityDisabler())
        {
            var source = Factory.GetDatabase("master");
            var target = Factory.GetDatabase("web");

            List<PublishOptions> options = new List<PublishOptions>();
            foreach (Language language in source.Languages)
            {
                options.Add(new PublishOptions(source, target, PublishMode.Full, language, DateTime.Now));
            }

            PublishManager.Publish(options.ToArray());
        }
    }
}

这需要以某种方式暴露在您的网站上。我建了一个我可以打电话的网页。然后,您需要一种机制来调用网页。我写了一个powershell脚本(RunUrl.ps1):

param([string]$url="https:/mywebsite/RunFullPublish.aspx")

Write-Host "calling URL $url"
$request = [System.Net.WebRequest]::Create($url)
$response = $request.GetResponse()
$response.Close()

Powershell基于this answer

然后我可以使用标准的Windows调度程序每隔x个时间调用powershell脚本。