重写Sitecore时CPU峰值';s链接提供程序

重写Sitecore时CPU峰值';s链接提供程序,sitecore,Sitecore,我们的CPU在覆盖Sitecore的链接提供程序后出现峰值。我们正在覆盖GetItemUrl以获取特定类型模板的别名url,当网站上唯一的内容是keepalive页面时,它将占用80%的CPU 这是工作正常的默认链接提供程序的配置行: <add name="sitecore" type="Sitecore.Links.LinkProvider, Sitecore.Kernel" addAspxExtension="false" alwaysIncludeServerUrl="false"

我们的CPU在覆盖Sitecore的链接提供程序后出现峰值。我们正在覆盖GetItemUrl以获取特定类型模板的别名url,当网站上唯一的内容是keepalive页面时,它将占用80%的CPU

这是工作正常的默认链接提供程序的配置行:

<add name="sitecore" type="Sitecore.Links.LinkProvider, Sitecore.Kernel" addAspxExtension="false" alwaysIncludeServerUrl="false" encodeNames="true" languageEmbedding="never" languageLocation="filePath" shortenUrls="true" useDisplayName="false" />
这是GetAlias函数:

public static Item GetAlias(Item currentItem, Database database)
{
    Item aliasFolder = database.GetItem(ItemConstants.Common.SystemAliasFolder);

    Item alias =
        aliasFolder.Children.FirstOrDefault(
        x => ((LinkField) x.Fields["Linked item"]).TargetID == currentItem.ID);

    return alias;
}

有人知道为什么这会占用CPU吗?目前大约有600个别名,但我不认为这会造成如此大的峰值。

我猜是HasAlias和GetAlias的组合造成了您的问题。迭代600个sitecore项目确实可能导致CPU峰值,特别是在可能有多个链接提供程序调用的情况下。像ANTS这样的探查器可以让您确认


我建议不要每次调用都这样做,而是读取所有别名并缓存一个将项目与其别名关联的数据结构。添加、编辑或删除别名时,您需要清除缓存,但这将为您节省大量CPU周期。

我猜是HasAlias和GetAlias的组合导致了您的问题。迭代600个sitecore项目确实可能导致CPU峰值,特别是在可能有多个链接提供程序调用的情况下。像ANTS这样的探查器可以让您确认


我建议不要每次调用都这样做,而是读取所有别名并缓存一个将项目与其别名关联的数据结构。添加、编辑或删除别名时,您需要清除缓存,但这将为您节省大量的CPU周期。

Y您不使用探查器?您不使用探查器?谢谢,我认为这不会产生如此大的影响,但会将其缓存。:)我同意,这确实是一个伟大的解决方案!谢谢,我没想到会有这么大的影响,但会将其缓存起来。:)我同意,这确实是一个伟大的解决方案!
public class CustomLinkProvider : LinkProvider
{
    public override string GetItemUrl(Item item, UrlOptions options)
    {
        // check if item is factsheet or story, if it is then get the alias url
        if (item.TemplateID == ItemConstants.Pages.Factsheet.TemplateID 
        || item.TemplateID == ItemConstants.Pages.Story.TemplateID)
        {
            if (Sitecore.Context.Database != null)
            {
                if (SitecoreHelpers.HasAlias(item, Sitecore.Context.Database))
                {
                    Item alias = SitecoreHelpers.GetAlias(item, Sitecore.Context.Database);
                    string friendlyUrl = alias.Name;
                    return friendlyUrl;
                }
            }
        }
        return base.GetItemUrl(item, options);
    }
}
public static Item GetAlias(Item currentItem, Database database)
{
    Item aliasFolder = database.GetItem(ItemConstants.Common.SystemAliasFolder);

    Item alias =
        aliasFolder.Children.FirstOrDefault(
        x => ((LinkField) x.Fields["Linked item"]).TargetID == currentItem.ID);

    return alias;
}