diff --git a/src/Umbraco.Web.Common/ApplicationBuilder/IUmbracoApplicationBuilder.cs b/src/Umbraco.Web.Common/ApplicationBuilder/IUmbracoApplicationBuilder.cs
index edb103c7c3..2c817d9eb8 100644
--- a/src/Umbraco.Web.Common/ApplicationBuilder/IUmbracoApplicationBuilder.cs
+++ b/src/Umbraco.Web.Common/ApplicationBuilder/IUmbracoApplicationBuilder.cs
@@ -5,14 +5,14 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
public interface IUmbracoApplicationBuilder
{
///
- /// EXPERT/OPTIONAL call to replace the default middlewares that Umbraco installs by default.
+ /// EXPERT call to replace the middlewares that Umbraco installs by default with a completely custom pipeline.
///
///
///
- IUmbracoApplicationBuilder WithCustomDefaultMiddleware(Action configureUmbracoMiddleware);
+ IUmbracoEndpointBuilder WithCustomMiddleware(Action configureUmbracoMiddleware);
///
- /// Called to include umbraco middleware
+ /// Called to include default middleware to run umbraco.
///
///
///
diff --git a/src/Umbraco.Web.Common/ApplicationBuilder/IUmbracoApplicationBuilderContext.cs b/src/Umbraco.Web.Common/ApplicationBuilder/IUmbracoApplicationBuilderContext.cs
index 23346e7aa8..913ffe07a7 100644
--- a/src/Umbraco.Web.Common/ApplicationBuilder/IUmbracoApplicationBuilderContext.cs
+++ b/src/Umbraco.Web.Common/ApplicationBuilder/IUmbracoApplicationBuilderContext.cs
@@ -5,6 +5,11 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
public interface IUmbracoApplicationBuilderContext : IUmbracoApplicationBuilderServices
{
- Action RegisterDefaultRequiredMiddleware { get; }
+ void UseUmbracoCoreMiddleware();
+
+ void RunPrePipeline();
+ void RunPostPipeline();
+
+ void RegisterDefaultRequiredMiddleware();
}
}
diff --git a/src/Umbraco.Web.Common/ApplicationBuilder/UmbracoApplicationBuilder.cs b/src/Umbraco.Web.Common/ApplicationBuilder/UmbracoApplicationBuilder.cs
index 9ea1bee0a1..a2074ac7e4 100644
--- a/src/Umbraco.Web.Common/ApplicationBuilder/UmbracoApplicationBuilder.cs
+++ b/src/Umbraco.Web.Common/ApplicationBuilder/UmbracoApplicationBuilder.cs
@@ -13,25 +13,30 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
///
public class UmbracoApplicationBuilder : IUmbracoApplicationBuilder, IUmbracoEndpointBuilder, IUmbracoApplicationBuilderContext
{
- private Action _customMiddlewareRegistration;
+ private readonly IOptions _umbracoPipelineStartupOptions;
public UmbracoApplicationBuilder(IApplicationBuilder appBuilder)
{
ApplicationServices = appBuilder.ApplicationServices;
RuntimeState = appBuilder.ApplicationServices.GetRequiredService();
AppBuilder = appBuilder ?? throw new ArgumentNullException(nameof(appBuilder));
- RegisterDefaultRequiredMiddleware = RegisterRequiredMiddleware;
+ _umbracoPipelineStartupOptions = ApplicationServices.GetRequiredService>();
}
public IServiceProvider ApplicationServices { get; }
public IRuntimeState RuntimeState { get; }
public IApplicationBuilder AppBuilder { get; }
- public Action RegisterDefaultRequiredMiddleware { get; set; }
///
- public IUmbracoApplicationBuilder WithCustomDefaultMiddleware(Action configureUmbracoMiddleware)
+ public IUmbracoEndpointBuilder WithCustomMiddleware(Action configureUmbracoMiddleware)
{
- _customMiddlewareRegistration = configureUmbracoMiddleware;
+ if (configureUmbracoMiddleware is null)
+ {
+ throw new ArgumentNullException(nameof(configureUmbracoMiddleware));
+ }
+
+ configureUmbracoMiddleware(this);
+
return this;
}
@@ -43,20 +48,11 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
throw new ArgumentNullException(nameof(configureUmbracoMiddleware));
}
- IOptions startupOptions = ApplicationServices.GetRequiredService>();
+ RunPrePipeline();
- RunPrePipeline(startupOptions.Value);
+ RegisterDefaultRequiredMiddleware();
- if (_customMiddlewareRegistration != null)
- {
- _customMiddlewareRegistration(this);
- }
- else
- {
- RegisterRequiredMiddleware();
- }
-
- RunPostPipeline(startupOptions.Value);
+ RunPostPipeline();
configureUmbracoMiddleware(this);
@@ -67,7 +63,7 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
public void WithEndpoints(Action configureUmbraco)
{
IOptions startupOptions = ApplicationServices.GetRequiredService>();
- RunPreEndpointsPipeline(startupOptions.Value);
+ RunPreEndpointsPipeline();
AppBuilder.UseEndpoints(endpoints =>
{
@@ -82,14 +78,9 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
/// Registers the default required middleware to run Umbraco
///
///
- private void RegisterRequiredMiddleware()
+ public void RegisterDefaultRequiredMiddleware()
{
- AppBuilder.UseUmbracoCore();
- AppBuilder.UseUmbracoRequestLogging();
-
- // We need to add this before UseRouting so that the UmbracoContext and other middlewares are executed
- // before endpoint routing middleware.
- AppBuilder.UseUmbracoRouting();
+ UseUmbracoCoreMiddleware();
AppBuilder.UseStatusCodePages();
@@ -118,25 +109,35 @@ namespace Umbraco.Cms.Web.Common.ApplicationBuilder
// endpoints are terminating middleware. All of our endpoints are declared in ext of IUmbracoApplicationBuilder
}
- private void RunPrePipeline(UmbracoPipelineOptions startupOptions)
+ public void UseUmbracoCoreMiddleware()
{
- foreach (IUmbracoPipelineFilter filter in startupOptions.PipelineFilters)
+ AppBuilder.UseUmbracoCore();
+ AppBuilder.UseUmbracoRequestLogging();
+
+ // We need to add this before UseRouting so that the UmbracoContext and other middlewares are executed
+ // before endpoint routing middleware.
+ AppBuilder.UseUmbracoRouting();
+ }
+
+ public void RunPrePipeline()
+ {
+ foreach (IUmbracoPipelineFilter filter in _umbracoPipelineStartupOptions.Value.PipelineFilters)
{
filter.OnPrePipeline(AppBuilder);
}
}
- private void RunPostPipeline(UmbracoPipelineOptions startupOptions)
+ public void RunPostPipeline()
{
- foreach (IUmbracoPipelineFilter filter in startupOptions.PipelineFilters)
+ foreach (IUmbracoPipelineFilter filter in _umbracoPipelineStartupOptions.Value.PipelineFilters)
{
filter.OnPostPipeline(AppBuilder);
}
}
- private void RunPreEndpointsPipeline(UmbracoPipelineOptions startupOptions)
+ private void RunPreEndpointsPipeline()
{
- foreach (IUmbracoPipelineFilter filter in startupOptions.PipelineFilters)
+ foreach (IUmbracoPipelineFilter filter in _umbracoPipelineStartupOptions.Value.PipelineFilters)
{
filter.OnEndpoints(AppBuilder);
}