V13 - Custom url provider and content Finder

I need to change the url for some content nodes based on custom table in db.

It is working for frontend where pages are rendered with proper url and content.

But i hit the issue in backoffice some node when i want to publish them, i am getting warning :

and then the url are not properly generated:

i can only see:

this is my url provider :

    if (current.AbsolutePath.StartsWith("/umbraco", StringComparison.OrdinalIgnoreCase))
    {
        return new UrlInfo(current.OriginalString, true, culture);
    }

    var defaultUrl = base.GetUrl(content, mode, culture, current);

    if (defaultUrl?.Text is null)
    {
        return defaultUrl;
    }

    var normalizedPath = defaultUrl.Text.TrimStart('/').ToLowerInvariant();

    var overrideEntry = Helpers
        .GetOverrides()
        .FirstOrDefault(f =>
            f.OverrideUrl.ToLowerInvariant().Equals(normalizedPath) && !f.Url.Contains("default.aspx", StringComparison.OrdinalIgnoreCase)
        );

    if (overrideEntry is not null)
    {
        var customUrl = overrideEntry.Url.StartsWith('/') ? overrideEntry.Url : "/" + overrideEntry.Url;
        return new UrlInfo(customUrl, true, culture);
    }

    return defaultUrl;
}

and content finder:

    var path = request.Uri.AbsolutePath;
    if (
        path.StartsWith("/umbraco", StringComparison.OrdinalIgnoreCase)
        || path.StartsWith("/media", StringComparison.OrdinalIgnoreCase)
        || path.StartsWith("/App_Plugins", StringComparison.OrdinalIgnoreCase)
    )
    {
        return Task.FromResult(false);
    }

    if (!contextAccessor.TryGetUmbracoContext(out var context))
    {
        return Task.FromResult(false);
    }

    var normalizedPath = path.TrimStart('/').TrimEnd('/').ToLowerInvariant();

    var overrideEntry = Helpers
        .GetOverrides()
        .FirstOrDefault(f => f.Url.TrimStart('/').TrimEnd('/').ToLowerInvariant().Equals(normalizedPath));

    var segments = request.Uri.Segments.ToList();

    if (overrideEntry is null && !IsBookingRequest(request))
    {
        return Task.FromResult(false);
    }

    segments = overrideEntry is null ? segments : ConvertUrlToUrlSegments(overrideEntry.OverrideUrl).ToList();

    var content = RouteHelpers.FindSegmentMatch(context.Content?.GetAtRoot().ToList(), segments);

    if (content is null)
    {
        return Task.FromResult(false);
    }

    request.SetPublishedContent(content);

    return Task.FromResult(true);
}

When i change the url provider more like in umbraco docs: Outbound request pipeline | CMS 13.latest (LTS) | Umbraco Documentation, the frontend still working but i am not able to open the backoffice content node i am getting error:

image

the code of updated url provider:

public override UrlInfo? GetUrl(IPublishedContent content, UrlMode mode, string? culture, Uri current)
{
// Get the default URL from Umbraco
var defaultUrl = base.GetUrl(content, mode, culture, current);

if (defaultUrl is null)
{
return null;
}

var normalizedPath = defaultUrl.Text.TrimStart('/').ToLowerInvariant();

var overrideEntry = Helpers
.GetOverrides()
.FirstOrDefault(f =>
f.OverrideUrl.ToLowerInvariant().Equals(normalizedPath) && !f.Url.Contains("default.aspx", StringComparison.OrdinalIgnoreCase)
);

if (overrideEntry is not null)
{
if (!(defaultUrl?.IsUrl ?? false))
{
return defaultUrl;
}

var customUrl = overrideEntry.Url.StartsWith('/') ? overrideEntry.Url : "/" + overrideEntry.Url;
return new UrlInfo(customUrl, true, culture);
}

return null;
}

DO you know maybe what i am doing wrong ?

If your provider inherits DefaultUrlProvider and you’re effectively acting as “the default provider + overrides”, then return the default URL when you don’t override:

public override UrlInfo? GetUrl(IPublishedContent content, UrlMode mode, string? culture, Uri current)
{
var defaultUrl = base.GetUrl(content, mode, culture, current);
if (defaultUrl?.Text is null) return defaultUrl;

var normalizedPath = defaultUrl.Text.TrimStart('/').ToLowerInvariant();

var overrideEntry = Helpers.GetOverrides()
    .FirstOrDefault(f =>
        f.OverrideUrl.ToLowerInvariant().Equals(normalizedPath) &&
        !f.Url.Contains("default.aspx", StringComparison.OrdinalIgnoreCase));

if (overrideEntry is not null)
{
   
    if (!defaultUrl.IsUrl) return defaultUrl;

    var customUrl = overrideEntry.Url.StartsWith('/') ? overrideEntry.Url : "/" + overrideEntry.Url;
    return new UrlInfo(customUrl, true, culture);
}


return defaultUrl;

}