重写Sitecore时CPU峰值';s链接提供程序
我们的CPU在覆盖Sitecore的链接提供程序后出现峰值。我们正在覆盖GetItemUrl以获取特定类型模板的别名url,当网站上唯一的内容是keepalive页面时,它将占用80%的CPU 这是工作正常的默认链接提供程序的配置行:重写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"
<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;
}