为什么解决方案中的一个 Sitecore 站点具有 "lang" cookie 密钥,而另一个站点返回 null?



我有两个站点都由一个Sitecore解决方案提供服务,并且遇到了以下代码强制语言嵌入两个站点之一的URL中的问题,因为下面来自基本LinkProvider的带双星号的代码返回true("lang"cookie键返回null)。

private bool EmbedLanguage()
{
if (this._options.LanguageEmbedding == LanguageEmbedding.Always)
{
return true;
}
if (this._options.LanguageEmbedding == LanguageEmbedding.Never)
{
return false;
}
SiteContext site = Context.Site;
return ((site == null) || **((WebUtil.GetOriginalCookieValue(site.GetCookieKey("lang")) == null)** || this._options.EmbedLanguage(Context.Language)));
}

这只适用于两个站点中的一个,而不适用于另一个。Web.config中linkManager中的languageEmbedding值为"asNeeded"。第一个(正在运行的)站点是多语言的,另一个(未运行的)不是。

目前还不清楚为什么行为不端的一个得到了"lang"饼干集,而另一个却没有。他们都共享了相当多的代码,除了布局、新的子网站等之外,这个有问题的网站与原来的网站没有太大的差异。

任何想法都将受到欢迎。也许这是我真正明显缺少的东西?


首先让我澄清一下我是否正确理解了你的问题
您有两个站点在同一代码上运行。(多站点)
一个是多语言,它表现良好(设置Lang cookie)另一个是Single Language,它的行为很奇怪,并且没有设置Lang cookie。
您是如何实现多站点的?

看起来您正在使用上面提到的函数将语言嵌入某个类的URL中。因此,建议我们实施一种变通方法。

有时IE8会删除cookie,这就是我们将多站点解决方案从languageEmbedding=asNeeded改为Never的原因。

我们覆盖了LinkManager类,当我们为网站生成URL时,我们会检查网站主页上的设置。如果网站是多语言的,那么我们会将languageEmbedding设置为始终。否则就永远不会了。

这样我们就永远不会遇到语言cookie的问题。

是的,当它是单语言网站并且languageEmbedding设置为never时,它不会设置cookie。

我们最终解决此问题的方法是向web.config中的问题站点添加自定义的"embedLanguageInUrl"属性,并将其设置为"从不"。然后,我们使用SiteContextExtensions类公开该值(Sitecore.Context.site.embedLanguageInUrl()),然后根据需要适当调整urlOptions.LanguageEmbedding值。看起来效果不错。:)

最新更新