Tuesday, April 30, 2019

EPiServer, C# - Create External Content Url


 public static string ContentExternalUrl(ContentReference contentLink, CultureInfo contentLanguage, bool absoluteUrl)
        {
            var result = ServiceLocator.Current.GetInstance
<UrlResolver>().GetUrl(
                contentLink,
                contentLanguage.Name,
                new VirtualPathArguments
                {
                    ContextMode = ContextMode.Default,
                    ForceCanonical = absoluteUrl
                });


            if (absoluteUrl)
            {
                Uri relativeUri;

                if (Uri.TryCreate(result, UriKind.RelativeOrAbsolute, out relativeUri))
                {
                    if (!relativeUri.IsAbsoluteUri)
                    {
                        var siteDefinitionResolver = ServiceLocator.Current.GetInstance
 <ISiteDefinitionResolver>();
                        var siteDefinition = siteDefinitionResolver.GetByContent(contentLink, true, true);
                        var hosts = siteDefinition.GetHosts(contentLanguage, true).ToList();

                        var host = hosts.FirstOrDefault(h => h.Type == HostDefinitionType.Primary)
                            ?? hosts.FirstOrDefault(h => h.Type == HostDefinitionType.Undefined);

                        var basetUri = siteDefinition.SiteUrl;

                        if (host != null && host.Name.Equals("*") == false)
                        {
                            Uri.TryCreate(siteDefinition.SiteUrl.Scheme + "://" + host.Name, UriKind.Absolute, out basetUri);
                        }

                        var absoluteUri = new Uri(basetUri, relativeUri);

                        return absoluteUri.AbsoluteUri;
                    }
                }
            }

            return result;
        }




OR:
  public static string ExternalUrl(this ContentReference contentLink)
        {
            var locator = ServiceLocator.Current.GetInstance<IContentLoader>();
            var pd = locator.Get<PageData>(contentLink);

            var urlString = UrlResolver.Current.GetUrl(contentLink, ((ILocalizable) pd).Language.Name, new VirtualPathArguments { ForceCanonical = true });
            if (string.IsNullOrEmpty(urlString))
            {
                return urlString;
            }

            var uri = new Uri(urlString, UriKind.RelativeOrAbsolute);
            if (uri.IsAbsoluteUri)
            {
                return urlString;
            }

            if (!uri.IsAbsoluteUri)
            {
                var siteDefResolver = ServiceLocator.Current.GetInstance<ISiteDefinitionResolver>();
                SiteDefinition siteDefinition = siteDefResolver.GetByContent(
                    contentLink: contentLink,
                    fallbackToWildcard: true,
                    fallbackToEmpty: true);

                return new Uri(siteDefinition.SiteUrl, uri).ToString();
            }

            return urlString;
        }

No comments:

Post a Comment