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); }