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;
}