public string GenerateProductLink(long?productId, out object matchingProductPage) { string ret; var cacheKey = string.Format("{0} {1} {2} {3}", WebSession.Current.SiteId, WebSession.Current.LanguageCode, "ProductLink", productId); if (!_urlCache.TryGet(cacheKey, out ret)) { try { var prodPages = CmsFinder.FindDescendentsOrFallbackOfCurrentPageLanguageRoot <ProductPage>(); if (prodPages.All(pp => !string.IsNullOrEmpty(pp.ProductID))) { // find a product page from the root level that has no product ID var page = CmsFinder.FindAllNonSiteDescendentsOfRoot <ProductPage>() .LastOrDefault(pp => string.IsNullOrEmpty(pp.ProductID)); if (page != null) { prodPages.Add(page); } } var targetProductPage = prodPages.FirstOrDefault( pp => pp.ProductID.Split().Any(pid => pid.Equals(productId.ToString(), StringComparison.InvariantCultureIgnoreCase))) ?? prodPages.LastOrDefault(pp => pp.ProductID.Length == 0); if (targetProductPage == null) { ret = null; } else { var url = new Url(GetNormalizedPageUrl(targetProductPage)); if ((string.IsNullOrEmpty(targetProductPage.ProductID) || targetProductPage.ProductID.Split().Length > 1) && productId != null) { url = url.Append(productId.ToString()); } ret = url.ToString(); } AddCache(cacheKey, ret, targetProductPage); } catch (Exception e) { _logger.Error(e, "Unable to create product link for product {0}", productId); } } _itemCache.TryGet(cacheKey, out matchingProductPage); return(ret); }