diff --git a/src/Umbraco.Core/UriExtensions.cs b/src/Umbraco.Core/UriExtensions.cs
index 0452373d55..ea846f7f7a 100644
--- a/src/Umbraco.Core/UriExtensions.cs
+++ b/src/Umbraco.Core/UriExtensions.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.IO;
using System.Linq;
using Microsoft.Extensions.Logging;
@@ -100,16 +100,13 @@ namespace Umbraco.Core
return false;
}
- //if its anything else we can assume it's back office
+ // if its anything else we can assume it's back office
return true;
}
///
/// Checks if the current uri is an install request
///
- ///
- ///
- ///
public static bool IsInstallerRequest(this Uri url, IHostingEnvironment hostingEnvironment)
{
var authority = url.GetLeftPart(UriPartial.Authority);
@@ -117,18 +114,14 @@ namespace Umbraco.Core
.TrimStart(authority)
.TrimStart("/");
- //check if this is in the umbraco back office
+ // check if this is in the umbraco back office
return afterAuthority.InvariantStartsWith(hostingEnvironment.ToAbsolute(Constants.SystemDirectories.Install).TrimStart("/"));
}
///
/// Checks if the uri is a request for the default back office page
///
- ///
- ///
- ///
- ///
- internal static bool IsDefaultBackOfficeRequest(this Uri url, GlobalSettings globalSettings, IHostingEnvironment hostingEnvironment)
+ public static bool IsDefaultBackOfficeRequest(this Uri url, GlobalSettings globalSettings, IHostingEnvironment hostingEnvironment)
{
var backOfficePath = globalSettings.GetBackOfficePath(hostingEnvironment);
if (url.AbsolutePath.InvariantEquals(backOfficePath.TrimEnd("/"))
@@ -138,6 +131,7 @@ namespace Umbraco.Core
{
return true;
}
+
return false;
}
diff --git a/src/Umbraco.Web.Common/Extensions/HttpRequestExtensions.cs b/src/Umbraco.Web.Common/Extensions/HttpRequestExtensions.cs
index 69fae56d32..fe61941e5c 100644
--- a/src/Umbraco.Web.Common/Extensions/HttpRequestExtensions.cs
+++ b/src/Umbraco.Web.Common/Extensions/HttpRequestExtensions.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.IO;
using System.Net;
using System.Text;
@@ -18,27 +18,20 @@ namespace Umbraco.Extensions
///
/// Check if a preview cookie exist
///
- ///
- ///
public static bool HasPreviewCookie(this HttpRequest request)
- {
- return request.Cookies.TryGetValue(Constants.Web.PreviewCookieName, out var cookieVal) && !cookieVal.IsNullOrWhiteSpace();
- }
+ => request.Cookies.TryGetValue(Constants.Web.PreviewCookieName, out var cookieVal) && !cookieVal.IsNullOrWhiteSpace();
public static bool IsBackOfficeRequest(this HttpRequest request, GlobalSettings globalSettings, IHostingEnvironment hostingEnvironment)
- {
- return new Uri(request.GetEncodedUrl(), UriKind.RelativeOrAbsolute).IsBackOfficeRequest(globalSettings, hostingEnvironment);
- }
+ => new Uri(request.GetEncodedUrl(), UriKind.RelativeOrAbsolute).IsBackOfficeRequest(globalSettings, hostingEnvironment);
public static bool IsClientSideRequest(this HttpRequest request)
- {
- return new Uri(request.GetEncodedUrl(), UriKind.RelativeOrAbsolute).IsClientSideRequest();
- }
+ => new Uri(request.GetEncodedUrl(), UriKind.RelativeOrAbsolute).IsClientSideRequest();
+
+ public static bool IsDefaultBackOfficeRequest(this HttpRequest request, GlobalSettings globalSettings, IHostingEnvironment hostingEnvironment)
+ => new Uri(request.GetEncodedUrl(), UriKind.RelativeOrAbsolute).IsDefaultBackOfficeRequest(globalSettings, hostingEnvironment);
public static string ClientCulture(this HttpRequest request)
- {
- return request.Headers.TryGetValue("X-UMB-CULTURE", out var values) ? values[0] : null;
- }
+ => request.Headers.TryGetValue("X-UMB-CULTURE", out var values) ? values[0] : null;
///
/// Determines if a request is local.
diff --git a/src/Umbraco.Web.Website/Extensions/UmbracoWebsiteApplicationBuilderExtensions.cs b/src/Umbraco.Web.Website/Extensions/UmbracoWebsiteApplicationBuilderExtensions.cs
index 32d84088c1..438ad154ed 100644
--- a/src/Umbraco.Web.Website/Extensions/UmbracoWebsiteApplicationBuilderExtensions.cs
+++ b/src/Umbraco.Web.Website/Extensions/UmbracoWebsiteApplicationBuilderExtensions.cs
@@ -38,10 +38,10 @@ namespace Umbraco.Extensions
{
app.UseEndpoints(endpoints =>
{
- endpoints.MapDynamicControllerRoute("/{**slug}");
-
NoContentRoutes noContentRoutes = app.ApplicationServices.GetRequiredService();
noContentRoutes.CreateRoutes(endpoints);
+
+ endpoints.MapDynamicControllerRoute("/{**slug}");
});
return app;
diff --git a/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs b/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs
index be7c9f7409..c41f34acc6 100644
--- a/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs
+++ b/src/Umbraco.Web.Website/Routing/UmbracoRouteValueTransformer.cs
@@ -4,14 +4,18 @@ using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
using Umbraco.Core;
using Umbraco.Core.Composing;
+using Umbraco.Core.Configuration.Models;
+using Umbraco.Core.Hosting;
using Umbraco.Core.Models.PublishedContent;
using Umbraco.Core.Strings;
using Umbraco.Extensions;
@@ -42,6 +46,8 @@ namespace Umbraco.Web.Website.Routing
private readonly IShortStringHelper _shortStringHelper;
private readonly IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;
private readonly IPublishedRouter _publishedRouter;
+ private readonly GlobalSettings _globalSettings;
+ private readonly IHostingEnvironment _hostingEnvironment;
///
/// Initializes a new instance of the class.
@@ -52,7 +58,9 @@ namespace Umbraco.Web.Website.Routing
IUmbracoRenderingDefaults renderingDefaults,
IShortStringHelper shortStringHelper,
IActionDescriptorCollectionProvider actionDescriptorCollectionProvider,
- IPublishedRouter publishedRouter)
+ IPublishedRouter publishedRouter,
+ IOptions globalSettings,
+ IHostingEnvironment hostingEnvironment)
{
_logger = logger;
_umbracoContextAccessor = umbracoContextAccessor;
@@ -60,19 +68,32 @@ namespace Umbraco.Web.Website.Routing
_shortStringHelper = shortStringHelper;
_actionDescriptorCollectionProvider = actionDescriptorCollectionProvider;
_publishedRouter = publishedRouter;
+ _globalSettings = globalSettings.Value;
+ _hostingEnvironment = hostingEnvironment;
}
///
public override async ValueTask TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
+ // will be null for any client side requests like JS, etc...
if (_umbracoContextAccessor.UmbracoContext == null)
{
- throw new InvalidOperationException($"There is no current UmbracoContext, it must be initialized before the {nameof(UmbracoRouteValueTransformer)} executes, ensure that {nameof(UmbracoRequestMiddleware)} is registered prior to 'UseRouting'");
+ return values;
+ // throw new InvalidOperationException($"There is no current UmbracoContext, it must be initialized before the {nameof(UmbracoRouteValueTransformer)} executes, ensure that {nameof(UmbracoRequestMiddleware)} is registered prior to 'UseRouting'");
+ }
+
+ // Check for back office request
+ // TODO: This is how the module was doing it before but could just as easily be part of the RoutableDocumentFilter
+ // which still needs to be migrated.
+ if (httpContext.Request.IsDefaultBackOfficeRequest(_globalSettings, _hostingEnvironment))
+ {
+ return values;
}
bool routed = RouteRequest(_umbracoContextAccessor.UmbracoContext, out IPublishedRequest publishedRequest);
if (!routed)
{
+ return values;
// TODO: Deal with it not being routable, perhaps this should be an enum result?
}