Routing: Add DocumentUrlAliasService for optimized URL alias lookups (closes #21383)#21396
Merged
Routing: Add DocumentUrlAliasService for optimized URL alias lookups (closes #21383)#21396
DocumentUrlAliasService for optimized URL alias lookups (closes #21383)#21396Conversation
Contributor
There was a problem hiding this comment.
Pull request overview
This PR introduces DocumentUrlAliasService to optimize URL alias lookups in Umbraco CMS. Previously, finding content by URL alias required traversing the entire content tree on every request. The new implementation uses an in-memory cache with O(1) dictionary lookups backed by a new umbracoDocumentUrlAlias database table.
Changes:
- Adds
DocumentUrlAliasServicewith in-memory caching for fast URL alias resolution - Creates new database table
umbracoDocumentUrlAliaswith optimized indexes for alias lookups - Updates
ContentFinderByUrlAliasto use the new service instead of tree traversal - Integrates with
ContentCacheRefresherfor automatic cache synchronization on content changes
Reviewed changes
Copilot reviewed 21 out of 21 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
DocumentUrlAliasService.cs |
Core service implementation with concurrent dictionaries for caching and scope-based deferred updates |
IDocumentUrlAliasService.cs |
Service interface defining alias lookup and management operations |
DocumentUrlAliasServiceInitializerNotificationHandler.cs |
Handles service initialization on application startup |
DocumentUrlAliasRepository.cs |
Repository implementation for database operations with optimized SQL queries |
IDocumentUrlAliasRepository.cs |
Repository interface and raw data model |
DocumentUrlAliasDto.cs |
DTO with unique and lookup indexes for performance |
PublishedDocumentUrlAlias.cs |
Model class for published document URL aliases |
AddDocumentUrlAlias.cs |
Migration to add the new table and lock record |
ContentFinderByUrlAlias.cs |
Updated to use service instead of tree traversal, with backward-compatible constructors |
ContentCacheRefresher.cs |
Integration for cache synchronization on content changes |
ContentFinderByUrlAliasTests.cs |
14 unit tests covering various alias lookup scenarios |
DocumentUrlAliasServiceTests.cs |
27 integration tests covering CRUD operations and edge cases |
LanguageRepository.cs |
Cleanup aliases when language is deleted |
DocumentRepository.cs |
Cleanup aliases when document is deleted |
UmbracoPlan.cs |
Registers the migration in the upgrade plan |
DatabaseSchemaCreator.cs |
Includes DTO in schema creation |
DatabaseDataCreator.cs |
Adds lock record during installation |
UmbracoBuilder.Repositories.cs |
Registers repository in DI container |
UmbracoBuilder.cs |
Registers service and initialization handler in DI container |
Constants-Locks.cs |
Adds DocumentUrlAliases lock constant |
Constants-DatabaseSchema.cs |
Adds DocumentUrlAlias table constant |
Extract CreateOrUpdateAliasesInternalAsync to process documents without creating their own scope. Both CreateOrUpdateAliasesAsync and CreateOrUpdateAliasesWithDescendantsAsync now create a single scope and call the internal method, avoiding unnecessary nested scope creation. Co-Authored-By: Claude Opus 4.5 <[email protected]>
creating their own scope.
…/umbraco/Umbraco-CMS into v17/feature/document-alias-cache
…found under the domain of the current request.
DocumentUrlAliasService for optimized URL alias lookups (closes #21383)
Migaroez
requested changes
Jan 20, 2026
src/Umbraco.Core/Services/DocumentUrlAliasServiceInitializerNotificationHandler.cs
Show resolved
Hide resolved
src/Umbraco.Infrastructure/Persistence/Dtos/DocumentUrlAliasDto.cs
Outdated
Show resolved
Hide resolved
Migaroez
approved these changes
Jan 21, 2026
This was referenced Feb 23, 2026
Merged
alexsee
pushed a commit
to alexsee/umbraco-container
that referenced
this pull request
Feb 23, 2026
Updated [Umbraco.Cms](https://github.com/umbraco/Umbraco-CMS) from 17.1.0 to 17.2.0. <details> <summary>Release notes</summary> _Sourced from [Umbraco.Cms's releases](https://github.com/umbraco/Umbraco-CMS/releases)._ ## 17.2.0 ## What's Changed Since 17.2.0-rc2 ### 📦 Dependencies * build(deps): bumps @umbraco-ui/uui to 1.17.0 by @iOvergaard in umbraco/Umbraco-CMS#21765 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc2...release-17.2.0 ## What's Changed Since 17.2.0-rc ### 🐛 Bug Fixes * Block Workspace: rename root-tab to 'generic' by @nielslyngsoe in umbraco/Umbraco-CMS#21699 * Block Workspace: Tabs navigation, Cherry-pick from #21672 by @nielslyngsoe in umbraco/Umbraco-CMS#21693 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2 ## What's Changed Since the Last Release (17.1.0) ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 ... (truncated) ## 17.2.0-rc2 ## What's Changed Since 17.2.0-rc ### 🐛 Bug Fixes * Block Workspace: rename root-tab to 'generic' by @nielslyngsoe in umbraco/Umbraco-CMS#21699 * Block Workspace: Tabs navigation, Cherry-pick from #21672 by @nielslyngsoe in umbraco/Umbraco-CMS#21693 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2 ## What's Changed Since the Last Release (17.1.0) ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 * Backoffice Performance: Use import maps to save requests by @nielslyngsoe in umbraco/Umbraco-CMS#21363 * Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent duplicate initialization (closes #21337) by @AndyButland in umbraco/Umbraco-CMS#21379 * Performance: Fix thread safety and optimize cache updates in `PublishStatusService` after content changes by @AndyButland in umbraco/Umbraco-CMS#21415 * Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering by @leekelleher in umbraco/Umbraco-CMS#21070 * Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups (closes #21383) by @AndyButland in umbraco/Umbraco-CMS#21396 * Performance: Optimize property retrieval and authorization checks in collection views (closes #21367) by @AndyButland in umbraco/Umbraco-CMS#21470 ... (truncated) ## 17.2.0-rc ## What's Changed ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 * Backoffice Performance: Use import maps to save requests by @nielslyngsoe in umbraco/Umbraco-CMS#21363 * Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent duplicate initialization (closes #21337) by @AndyButland in umbraco/Umbraco-CMS#21379 * Performance: Fix thread safety and optimize cache updates in `PublishStatusService` after content changes by @AndyButland in umbraco/Umbraco-CMS#21415 * Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering by @leekelleher in umbraco/Umbraco-CMS#21070 * Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups (closes #21383) by @AndyButland in umbraco/Umbraco-CMS#21396 * Performance: Optimize property retrieval and authorization checks in collection views (closes #21367) by @AndyButland in umbraco/Umbraco-CMS#21470 ### 🧪 Testing * E2E: QA Replaced unreliable Thread.Sleep(500) with a counter/gate pattern that ensures both transactions are initialized before releasing them to compete for locks by @andr317c in umbraco/Umbraco-CMS#21165 * E2E QA: Updated integration test that was missing directory setup by @andr317c in umbraco/Umbraco-CMS#21167 * E2E: QA Added acceptance tests for removing a not-found content picker by @nhudinh0309 in umbraco/Umbraco-CMS#21177 * E2E: QA Fixed failing tests for the current user profile by @nhudinh0309 in umbraco/Umbraco-CMS#21214 * Upgrade MSW from 1.3.5 to 2.12.4 by @madsrasmussen in umbraco/Umbraco-CMS#21096 * E2E: QA Added acceptance tests for rendering content with invariant blocks by @nhudinh0309 in umbraco/Umbraco-CMS#21180 * E2E: QA Added acceptance tests for content delivery API by @nhudinh0309 in umbraco/Umbraco-CMS#21095 ... (truncated) Commits viewable in [compare view](umbraco/Umbraco-CMS@release-17.1.0...release-17.2.0). </details> Updated [Umbraco.Cms.Persistence.Sqlite](https://github.com/umbraco/Umbraco-CMS) from 17.1.0 to 17.2.0. <details> <summary>Release notes</summary> _Sourced from [Umbraco.Cms.Persistence.Sqlite's releases](https://github.com/umbraco/Umbraco-CMS/releases)._ ## 17.2.0 ## What's Changed Since 17.2.0-rc2 ### 📦 Dependencies * build(deps): bumps @umbraco-ui/uui to 1.17.0 by @iOvergaard in umbraco/Umbraco-CMS#21765 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc2...release-17.2.0 ## What's Changed Since 17.2.0-rc ### 🐛 Bug Fixes * Block Workspace: rename root-tab to 'generic' by @nielslyngsoe in umbraco/Umbraco-CMS#21699 * Block Workspace: Tabs navigation, Cherry-pick from #21672 by @nielslyngsoe in umbraco/Umbraco-CMS#21693 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2 ## What's Changed Since the Last Release (17.1.0) ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 ... (truncated) ## 17.2.0-rc2 ## What's Changed Since 17.2.0-rc ### 🐛 Bug Fixes * Block Workspace: rename root-tab to 'generic' by @nielslyngsoe in umbraco/Umbraco-CMS#21699 * Block Workspace: Tabs navigation, Cherry-pick from #21672 by @nielslyngsoe in umbraco/Umbraco-CMS#21693 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2 ## What's Changed Since the Last Release (17.1.0) ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 * Backoffice Performance: Use import maps to save requests by @nielslyngsoe in umbraco/Umbraco-CMS#21363 * Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent duplicate initialization (closes #21337) by @AndyButland in umbraco/Umbraco-CMS#21379 * Performance: Fix thread safety and optimize cache updates in `PublishStatusService` after content changes by @AndyButland in umbraco/Umbraco-CMS#21415 * Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering by @leekelleher in umbraco/Umbraco-CMS#21070 * Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups (closes #21383) by @AndyButland in umbraco/Umbraco-CMS#21396 * Performance: Optimize property retrieval and authorization checks in collection views (closes #21367) by @AndyButland in umbraco/Umbraco-CMS#21470 ... (truncated) ## 17.2.0-rc ## What's Changed ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 * Backoffice Performance: Use import maps to save requests by @nielslyngsoe in umbraco/Umbraco-CMS#21363 * Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent duplicate initialization (closes #21337) by @AndyButland in umbraco/Umbraco-CMS#21379 * Performance: Fix thread safety and optimize cache updates in `PublishStatusService` after content changes by @AndyButland in umbraco/Umbraco-CMS#21415 * Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering by @leekelleher in umbraco/Umbraco-CMS#21070 * Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups (closes #21383) by @AndyButland in umbraco/Umbraco-CMS#21396 * Performance: Optimize property retrieval and authorization checks in collection views (closes #21367) by @AndyButland in umbraco/Umbraco-CMS#21470 ### 🧪 Testing * E2E: QA Replaced unreliable Thread.Sleep(500) with a counter/gate pattern that ensures both transactions are initialized before releasing them to compete for locks by @andr317c in umbraco/Umbraco-CMS#21165 * E2E QA: Updated integration test that was missing directory setup by @andr317c in umbraco/Umbraco-CMS#21167 * E2E: QA Added acceptance tests for removing a not-found content picker by @nhudinh0309 in umbraco/Umbraco-CMS#21177 * E2E: QA Fixed failing tests for the current user profile by @nhudinh0309 in umbraco/Umbraco-CMS#21214 * Upgrade MSW from 1.3.5 to 2.12.4 by @madsrasmussen in umbraco/Umbraco-CMS#21096 * E2E: QA Added acceptance tests for rendering content with invariant blocks by @nhudinh0309 in umbraco/Umbraco-CMS#21180 * E2E: QA Added acceptance tests for content delivery API by @nhudinh0309 in umbraco/Umbraco-CMS#21095 ... (truncated) Commits viewable in [compare view](umbraco/Umbraco-CMS@release-17.1.0...release-17.2.0). </details> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This was referenced Feb 23, 2026
|
This pull request has been mentioned on Umbraco community forum. There might be relevant details there: |
This was referenced Mar 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
This PR addresses the concern raised in #21383 (and also indirectly the cause of #21205), which is that the "content finder by URL alias" that Umbraco ships with does a call to
.Descendents()to try to find a document that has the umbracoUrlAlias configured. It will be called when content isn't matched through normal routing, and exit when it find a match.In doing so though it'll load any content not currently held in memory via the hybrid cache from the database. And so if not finding a match, this will be all documents - thus negating the benefit of not having to load all documents into memory for large websites.
To address this is seems to make sense to do something similar to what we do for URL segments, which are all loaded upfront and cached, for URL aliases.
This PR introduces that - an analogous database table, migration, cache, repository and service for URL aliases.
Change Summary
This PR introduces
DocumentUrlAliasServiceto optimize the performance ofContentFinderByUrlAlias. Previously, finding content by URL alias required traversing the entire content tree on every request, which was extremely slow on large sites.Key changes:
DocumentUrlAliasService- In-memory cache for URL aliases with O(1) lookupsumbracoDocumentUrlAlias- Persists aliases with optimized indexesContentFinderByUrlAlias- Uses the new service instead of tree traversalContentCacheRefresherfor automatic updatesTesting
Unit and integration tests have been added under
ContentFinderByUrlAliasandDocumentUrlAliasServicerespectively.Manual testing carried out and for review includes:
umbracoDocumentUrlAliastable is correctly created.umbracoUrlAliasproperty is loaded into the database, with one record created per alias (multiple aliases in this property can be added as comma delimited).umbracoUrlAliasproperty correctly updates the database table.Known Potential Issues
select value from umbracoKeyValue where [key] = 'UmbracoUrlAliasGeneration'and restarting Umbraco). Seems this would be a good option to have for an administrator, either as part of, or as a separate but related action, triggered from Settings > Published Status > Rebuild Database Cache. Again, this is the same situation for the document URL service database table, and so we should consider adding this for both services.