HomeDev GuideRecipesAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunityOptimizely AcademySubmit a ticketLog In
Dev Guide

Sites-to-applications and routing breaking changes

Breaking changes related to the SiteDefinition-to-Application migration, URL routing, UriSupport replacement, and URL segment changes in CMS 13.

This article covers SiteDefinition-to-Application migration, URL routing, and UriSupport replacement breaking changes in CMS 13.

Sites-to-applications migration

CMS 13 replaces the SiteDefinition model with a new Application model. The following types are obsoleted:

  • EPiServer.Web.SiteDefinition – Obsolete in favor of Application.
  • EPiServer.Web.SiteDefinitionEventArgs – Obsolete in favor of ApplicationEvent.
  • EPiServer.Web.SiteDefinitionUpdatedEventArgs – Obsolete in favor of ApplicationUpdatedEvent.
  • EPiServer.Web.ISiteDefinitionRepository – Obsolete in favor of IApplicationRepository. A temporary shim layer loads applications as site definitions during the transition.
  • EPiServer.Web.ISiteDefinitionResolver – Obsolete in favor of IApplicationResolver.
  • EPiServer.DataAbstraction.ISiteConfigurationRepository – No longer used by CMS and obsoleted. No implementation is registered.

Host configuration changes

  • Wildcard site host definition (*) is replaced with a default application. The Application.IsDefault property controls this behavior.
  • Database migration preserves existing sites, but the new application model requires explicit "Default" host configuration. You may need to configure this manually in Admin > Config > Manage Applications. See Application framework to understand available applications types.

Constructor and parameter changes

When upgrading code that depends on SiteDefinition or ISiteDefinitionResolver:

  • Replace ISiteDefinitionResolver with IApplicationResolver in constructor injection.
  • EPiServer.Cms.Shell.Search.ContentSearchProviderBase<TContentData, TContentType> – Changed constructor argument from ISiteDefinitionResolver to IApplicationResolver.
  • EPiServer.Web.Routing.EditUrlResolver – Methods accepting SiteDefinition as a parameter were obsoleted in favor of new overloads accepting Application.
  • EPiServer.Web.SimpleAddressResolveContext – The SiteId property is obsolete in favor of the new ApplicationName property.

Routing context changes

  • EPiServer.Core.Routing.Pipeline.UrlResolverContext – The HostDefinition property is obsolete in favor of the new ApplicationHost property.
  • EPiServer.Core.Routing.Pipeline.UrlGeneratorContext – The Host property is obsolete in favor of ApplicationHost. The CurrentHost property is obsolete in favor of CurrentApplicationHost.
  • EPiServer.Web.Routing.ContentRouteData – New constructor parameter Application. Constructor parameter HostDefinition was replaced with ApplicationHost.
  • EPiServer.Web.Routing.RoutingOptions – Property UsePrimaryHostForOutgoingUrls was obsoleted. The system now always prefers primary hosts for URL generation (except in edit or preview mode with relative URLs). Property UseEditHostForOutgoingMediaUrls was obsoleted. Configure application host with type Media instead.

UI URL segment change

The default UI URL segment has changed from /EPiServer to /Optimizely.

Module-specific URL segments have also been updated to remove EPiServer branding. The following module paths have changed:

CMS 12 module pathCMS 13 module path
/EPiServer/EPiServer.Cms.UI.Admin//Optimizely/Settings/
/EPiServer/EPiServer.Cms.UI.Settings//Optimizely/Profile/
/EPiServer/EPiServer.Cms.UI.VisitorGroups//Optimizely/VisitorGroups/
/EPiServer/EPiServer.Cms.UI.ContentManager//Optimizely/ContentManager/
/EPiServer/EPiServer.Cms.Forms.UI//Optimizely/Forms/
/EPiServer/EPiServer.Cms.UI.Webhooks//Optimizely/Webhooks/
/EPiServer/EPiServer.Cms.UI.Credentials//Optimizely/Credentials/
/EPiServer/Optimizely.Graph.Cms//Optimizely/GraphQL/
/EPiServer/Optimizely.Cms.OpalChat//Optimizely/OpalChat/
/EPiServer/EPiServer.Cms.TinyMce//Optimizely/TinyMce/
/EPiServer/EPiServer.Cms.UI.Extensibility//Optimizely/Extensibility/
/EPiServer/EPiServer.Cms.DamIntegration.UI//Optimizely/DamIntegration/

Update any bookmarks, integrations, scripts, or hard-coded references that rely on the previous /EPiServer/ URL format.

UriSupport replacement

The EPiServer.UriSupport class is obsolete. Resolve a singleton instance of IUriSupport from the DI container as a replacement. Members have been moved to dedicated classes:

Removed membersReplacement
HttpLocalhostUri, SiteDefinitionResolver, RemoveQueryStringDelimeter, ClearRemoved (no longer used)
SiteUrlEPiServer.Web.SiteDefinition.SiteUrl
UIUrl, UtilUrl, ResolveUrlFromUIBySettings, ResolveUrlFromUIAsRelativeOrAbsolute, AbsoluteUrlFromUIBySettings, ResolveUrlFromUtilBySettings, AbsoluteUrlFromUtilBySettingsEPiServer.Web.UIPathResolver
InternalUIUrl, InternalUtilUrlEPiServer.Web.UIOption
IsStringWellFormedUri, IsSchemeSpecified, Combine, BuildQueryString, AddQueryString, AddLanguageSelection, Split, SplitNoDelim, IsDataUriEPiServer.Web.UriUtil
AddValuesToCollectionSystem.Collections.Specialized.NameValueCollection
EscapeUriSegmentsEPiServer.UrlEncode

EPiServer.Web routing changes

  • EPiServer.Web.HttpRequestSupport – Method IsSystemDirectory was removed in favor of EPiServer.Web.UIPathResolver.IsSystemPath.

  • EPiServer.Web.PermanentLinkUtility – Method TryParseGuid was removed in favor of System.Guid.TryParse.

  • EPiServer.Web.PropertyControls.FileSortOrder – Values DateLastAccessed and DateLastAccessedDesc were removed because they are no longer used.

  • EPiServer.Web.Routing.AncestorReferencesLoader – Parameter contentEvents was removed in the constructor.

  • EPiServer.Web.Routing.RoutingConstants – Constant NodeKey was removed because it is no longer used.

  • EPiServer.Web.Routing.RoutingOptions – Method ConfigureForExternalTemplates was removed in favor of EPiServer.Web.Templating.TemplateOptions.ConfigureForExternalTemplates.

  • EPiServer.Web.UIPathResolver – The parameterless constructor was removed. The static Instance method was obsoleted. Inject or retrieve the UIPathResolver singleton instance from the service container.

IContentRouteEvents removal

  • EPiServer.Web.Routing.IContentRouteEvents – Interface removed. Use IContentUrlResolverEvents or IContentUrlGeneratorEvents instead. The individual events map as follows:
    • CreatingVirtualPathIContentUrlGeneratorEvents.GeneratingUrl
    • CreatedVirtualPathIContentUrlGeneratorEvents.GeneratedUrl
    • RoutingContentIContentUrlResolverEvents.ResolvingUrl
    • RoutedContentIContentUrlResolverEvents.ResolvedUrl

EPiServer.Cms.AspNetCore routing

  • EPiServer.Core.Routing.Pipeline.UrlResolverContext – Property RemainingPath was removed in favor of property RemainingSegments.

  • EPiServer.Core.Routing.Pipeline.UrlResolverContextExtensions – Extension method GetNextRemainingSegment was removed in favor of method GetNextSegment.

  • EPiServer.Cms.AspNetCore.Routing.ControllerActionEndpointSelectorPolicy – Behavioral breaking change: when no action name constraint exists in the route, the "Index" method is selected first (if available) instead of the first valid endpoint by method sorting.

  • System.Web.IHttpHandler – This feature was removed.

CMS routing behavioral changes

  • When a page has two language versions, and one language version is configured to use the other as a fallback, if the primary language version expires, CMS 13 displays the fallback language instead of showing a 404.

  • EPiServer.Web.Routing.ContentRouter – The Instance field was changed to a property.

  • EPiServer.Web.Routing.RoutedContentEvaluationResult – The NotFound and OK fields were changed to properties.

  • EPiServer.Globalization.IUpdateCurrentLanguage – Methods UpdateLanguage and UpdateReplacementLanguage were removed in favor of method SetRoutedContent.

  • RouteArguments.MatchWildcardHost – Obsolete. Use MatchHost instead.