From 0fc0da0b71dc324709bf028d6420ec415d446578 Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Fri, 27 Aug 2021 18:09:24 +0200 Subject: [PATCH 1/9] [WIP] Use minimal APIs (+remove Startup.fs) for F# project templates - WebApi template --- .../WebApi-FSharp.fsproj.in | 1 - .../content/WebApi-FSharp/Program.fs | 24 +++++++---- .../content/WebApi-FSharp/Startup.fs | 42 ------------------- 3 files changed, 17 insertions(+), 50 deletions(-) delete mode 100644 src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Startup.fs diff --git a/src/ProjectTemplates/Web.ProjectTemplates/WebApi-FSharp.fsproj.in b/src/ProjectTemplates/Web.ProjectTemplates/WebApi-FSharp.fsproj.in index ec9d1aa17b6e..8a9f8ed0e2e5 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/WebApi-FSharp.fsproj.in +++ b/src/ProjectTemplates/Web.ProjectTemplates/WebApi-FSharp.fsproj.in @@ -9,7 +9,6 @@ - diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs index 91d8b747cdc5..6b8e6c6b16da 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs @@ -14,14 +14,24 @@ open Microsoft.Extensions.Logging module Program = let exitCode = 0 - let CreateHostBuilder args = - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(fun webBuilder -> - webBuilder.UseStartup() |> ignore - ) - [] let main args = - CreateHostBuilder(args).Build().Run() + + let builder = WebApplication.CreateBuilder(args) + + let app = builder.Build() + + if app.Environment.IsDevelopment() then + app.UseDeveloperExceptionPage() |> ignore + +#if (!NoHttps) + app.UseHttpsRedirection(); +#endif + + app.UseRouting() + app.UseAuthorization() + app.MapControllers() + + app.Run() exitCode diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Startup.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Startup.fs deleted file mode 100644 index 1a44dc3b0868..000000000000 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Startup.fs +++ /dev/null @@ -1,42 +0,0 @@ -namespace Company.WebApplication1 - -open System -open System.Collections.Generic -open System.Linq -open System.Threading.Tasks -open Microsoft.AspNetCore.Builder -open Microsoft.AspNetCore.Hosting -#if (!NoHttps) -open Microsoft.AspNetCore.HttpsPolicy; -#endif -open Microsoft.AspNetCore.Mvc -open Microsoft.Extensions.Configuration -open Microsoft.Extensions.DependencyInjection -open Microsoft.Extensions.Hosting - -type Startup(configuration: IConfiguration) = - member _.Configuration = configuration - - // This method gets called by the runtime. Use this method to add services to the container. - member _.ConfigureServices(services: IServiceCollection) = - // Add framework services. - services.AddControllers() |> ignore - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - member _.Configure(app: IApplicationBuilder, env: IWebHostEnvironment) = - if (env.IsDevelopment()) then - app.UseDeveloperExceptionPage() |> ignore -#if (!NoHttps) - app.UseHttpsRedirection() - .UseRouting() - .UseAuthorization() - .UseEndpoints(fun endpoints -> - endpoints.MapControllers() |> ignore - ) |> ignore -#else - app.UseRouting() - .UseAuthorization() - .UseEndpoints(fun endpoints -> - endpoints.MapControllers() |> ignore - ) |> ignore -#endif From 6c00de074e12b6a43f7a038b85da9eb5c6aa988f Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Fri, 27 Aug 2021 19:15:45 +0200 Subject: [PATCH 2/9] Apply suggestions from code review Co-authored-by: David Fowler --- .../Web.ProjectTemplates/content/WebApi-FSharp/Program.fs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs index 6b8e6c6b16da..6e5d205d7f0e 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs @@ -21,14 +21,11 @@ module Program = let app = builder.Build() - if app.Environment.IsDevelopment() then - app.UseDeveloperExceptionPage() |> ignore #if (!NoHttps) app.UseHttpsRedirection(); #endif - app.UseRouting() app.UseAuthorization() app.MapControllers() From 591250c010341151f99fe787910060bdefe3903c Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Fri, 27 Aug 2021 19:53:49 +0200 Subject: [PATCH 3/9] [WIP] Added missing imports, added #nowarn \20\ since many builder methods are returning something --- .../Web.ProjectTemplates/content/WebApi-FSharp/Program.fs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs index 6e5d205d7f0e..cf0d7a7c7e9c 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs @@ -6,7 +6,11 @@ open System.IO open System.Linq open System.Threading.Tasks open Microsoft.AspNetCore +open Microsoft.AspNetCore.Builder open Microsoft.AspNetCore.Hosting +#if (!NoHttps) +open Microsoft.AspNetCore.HttpsPolicy; +#endif open Microsoft.Extensions.Configuration open Microsoft.Extensions.Hosting open Microsoft.Extensions.Logging @@ -23,7 +27,7 @@ module Program = #if (!NoHttps) - app.UseHttpsRedirection(); + app.UseHttpsRedirection() #endif app.UseAuthorization() From 9780667d798625567090a8329076b5208d6106d1 Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Tue, 31 Aug 2021 16:22:12 +0200 Subject: [PATCH 4/9] [WIP] Remove Startup.fs from webapi baselines + fix for webapi builder --- .../Web.ProjectTemplates/content/WebApi-FSharp/Program.fs | 2 ++ src/ProjectTemplates/test/template-baselines.json | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs index cf0d7a7c7e9c..7e1d7a8ef533 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs @@ -23,6 +23,8 @@ module Program = let builder = WebApplication.CreateBuilder(args) + builder.Services.AddControllers() + let app = builder.Build() diff --git a/src/ProjectTemplates/test/template-baselines.json b/src/ProjectTemplates/test/template-baselines.json index eb3859aabb05..5f82e42b1d5e 100644 --- a/src/ProjectTemplates/test/template-baselines.json +++ b/src/ProjectTemplates/test/template-baselines.json @@ -631,7 +631,6 @@ "appsettings.Development.json", "appsettings.json", "Program.fs", - "Startup.fs", "WeatherForecast.fs", "Controllers/WeatherForecastController.fs", "Properties/launchSettings.json" From 043be4441e17a40bf2e952908c014b857ec39e21 Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Wed, 1 Sep 2021 12:51:48 +0200 Subject: [PATCH 5/9] Added back explicit call to UseDeveloperExceptionPage if development mode. --- .../Web.ProjectTemplates/content/WebApi-FSharp/Program.fs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs index 7e1d7a8ef533..94dd13c20970 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs @@ -27,6 +27,9 @@ module Program = let app = builder.Build() + if builder.Environment.IsDevelopment() then + app.UseDeveloperExceptionPage() |> ignore + #if (!NoHttps) app.UseHttpsRedirection() From 951a5fd20b636d2039369aa0984f13c3a7c54ee6 Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Wed, 1 Sep 2021 13:38:27 +0200 Subject: [PATCH 6/9] Use minimal APIs in the StarterWeb (mvc) template. --- .../StarterWeb-FSharp.fsproj.in | 1 - .../content/StarterWeb-FSharp/Program.fs | 41 +++++++++++++++---- .../content/WebApi-FSharp/Program.fs | 6 +-- .../test/template-baselines.json | 1 - 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in b/src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in index c6ddfee52e47..67cd7e941246 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in +++ b/src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-FSharp.fsproj.in @@ -9,7 +9,6 @@ - diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs index 91d8b747cdc5..bf399a052f4e 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs @@ -1,27 +1,52 @@ namespace Company.WebApplication1 - +#nowarn "20" open System open System.Collections.Generic open System.IO open System.Linq open System.Threading.Tasks open Microsoft.AspNetCore +open Microsoft.AspNetCore.Builder open Microsoft.AspNetCore.Hosting +#if (!NoHttps) +open Microsoft.AspNetCore.HttpsPolicy; +#endif open Microsoft.Extensions.Configuration +open Microsoft.Extensions.DependencyInjection open Microsoft.Extensions.Hosting open Microsoft.Extensions.Logging module Program = let exitCode = 0 - let CreateHostBuilder args = - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(fun webBuilder -> - webBuilder.UseStartup() |> ignore - ) - [] let main args = - CreateHostBuilder(args).Build().Run() + let builder = WebApplication.CreateBuilder(args) + + builder.Services.AddControllersWithViews().AddRazorRuntimeCompilation() + builder.Services.AddRazorPages() + + let app = builder.Build() + + if not(builder.Environment.IsDevelopment()) then + app.UseExceptionHandler("/Home/Error") + +#if (!NoHttps) + app.UseHsts() |> ignore // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + + app.UseHttpsRedirection() +#endif + + app.UseStaticFiles() + app.UseRouting() + app.UseAuthorization() + + app.MapControllerRoute( + name = "default", + pattern = "{controller=Home}/{action=Index}/{id?}") + + app.MapRazorPages(); + + app.Run() exitCode diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs index 94dd13c20970..ab24d73b7873 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs @@ -1,5 +1,5 @@ namespace Company.WebApplication1 - +#nowarn "20" open System open System.Collections.Generic open System.IO @@ -27,10 +27,6 @@ module Program = let app = builder.Build() - if builder.Environment.IsDevelopment() then - app.UseDeveloperExceptionPage() |> ignore - - #if (!NoHttps) app.UseHttpsRedirection() #endif diff --git a/src/ProjectTemplates/test/template-baselines.json b/src/ProjectTemplates/test/template-baselines.json index 5f82e42b1d5e..b707dcd78819 100644 --- a/src/ProjectTemplates/test/template-baselines.json +++ b/src/ProjectTemplates/test/template-baselines.json @@ -1141,7 +1141,6 @@ "appsettings.Development.json", "appsettings.json", "Program.fs", - "Startup.fs", "Controllers/HomeController.fs", "Models/ErrorViewModel.fs", "Properties/launchSettings.json", From ec072eff18934552f23874bcc63aef59f9f8a5be Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Wed, 1 Sep 2021 15:44:18 +0200 Subject: [PATCH 7/9] Removed Startup.fs --- .../content/StarterWeb-FSharp/Startup.fs | 55 ------------------- 1 file changed, 55 deletions(-) delete mode 100644 src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Startup.fs diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Startup.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Startup.fs deleted file mode 100644 index 607ec13b55bf..000000000000 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Startup.fs +++ /dev/null @@ -1,55 +0,0 @@ -namespace Company.WebApplication1 - -open System -open System.Collections.Generic -open System.Linq -open System.Threading.Tasks -open Microsoft.AspNetCore.Builder -open Microsoft.AspNetCore.Hosting -#if (!NoHttps) -open Microsoft.AspNetCore.HttpsPolicy; -#endif -open Microsoft.AspNetCore.Mvc -open Microsoft.Extensions.Configuration -open Microsoft.Extensions.DependencyInjection -open Microsoft.Extensions.Hosting - -type Startup private () = - new (configuration: IConfiguration) as this = - Startup() then - this.Configuration <- configuration - - // This method gets called by the runtime. Use this method to add services to the container. - member this.ConfigureServices(services: IServiceCollection) = - // Add framework services. - services.AddControllersWithViews().AddRazorRuntimeCompilation() |> ignore - services.AddRazorPages() |> ignore - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - member this.Configure(app: IApplicationBuilder, env: IWebHostEnvironment) = - - if (env.IsDevelopment()) then - app.UseDeveloperExceptionPage() |> ignore - else - app.UseExceptionHandler("/Home/Error") |> ignore -#if (!NoHttps) - // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. - app.UseHsts() |> ignore - - app.UseHttpsRedirection() |> ignore -#else - -#endif - app.UseStaticFiles() |> ignore - - app.UseRouting() |> ignore - - app.UseAuthorization() |> ignore - - app.UseEndpoints(fun endpoints -> - endpoints.MapControllerRoute( - name = "default", - pattern = "{controller=Home}/{action=Index}/{id?}") |> ignore - endpoints.MapRazorPages() |> ignore) |> ignore - - member val Configuration : IConfiguration = null with get, set From 3b399a69487d94db8b2cbb38342a0c9b260f73ac Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Fri, 17 Sep 2021 12:07:26 +0200 Subject: [PATCH 8/9] PR comments --- .../content/StarterWeb-FSharp/Program.fs | 23 +++++++++++-------- .../content/WebApi-FSharp/Program.fs | 6 ++--- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs index bf399a052f4e..07d261f44762 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs @@ -1,5 +1,7 @@ namespace Company.WebApplication1 + #nowarn "20" + open System open System.Collections.Generic open System.IO @@ -8,8 +10,8 @@ open System.Threading.Tasks open Microsoft.AspNetCore open Microsoft.AspNetCore.Builder open Microsoft.AspNetCore.Hosting -#if (!NoHttps) -open Microsoft.AspNetCore.HttpsPolicy; +#if !NoHttps +open Microsoft.AspNetCore.HttpsPolicy #endif open Microsoft.Extensions.Configuration open Microsoft.Extensions.DependencyInjection @@ -23,15 +25,18 @@ module Program = let main args = let builder = WebApplication.CreateBuilder(args) - builder.Services.AddControllersWithViews().AddRazorRuntimeCompilation() + builder + .Services + .AddControllersWithViews() + .AddRazorRuntimeCompilation() + builder.Services.AddRazorPages() let app = builder.Build() - if not(builder.Environment.IsDevelopment()) then + if not (builder.Environment.IsDevelopment()) then app.UseExceptionHandler("/Home/Error") - -#if (!NoHttps) +#if !NoHttps app.UseHsts() |> ignore // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHttpsRedirection() @@ -41,11 +46,9 @@ module Program = app.UseRouting() app.UseAuthorization() - app.MapControllerRoute( - name = "default", - pattern = "{controller=Home}/{action=Index}/{id?}") + app.MapControllerRoute(name = "default", pattern = "{controller=Home}/{action=Index}/{id?}") - app.MapRazorPages(); + app.MapRazorPages() app.Run() diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs index ab24d73b7873..1abd30332163 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs @@ -8,8 +8,8 @@ open System.Threading.Tasks open Microsoft.AspNetCore open Microsoft.AspNetCore.Builder open Microsoft.AspNetCore.Hosting -#if (!NoHttps) -open Microsoft.AspNetCore.HttpsPolicy; +#if !NoHttps +open Microsoft.AspNetCore.HttpsPolicy #endif open Microsoft.Extensions.Configuration open Microsoft.Extensions.Hosting @@ -27,7 +27,7 @@ module Program = let app = builder.Build() -#if (!NoHttps) +#if !NoHttps app.UseHttpsRedirection() #endif From 16068eed0b167d935557f88f69cb812156f9f950 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Fri, 17 Sep 2021 14:49:52 -0700 Subject: [PATCH 9/9] open DI in F# webapi project template --- .../Web.ProjectTemplates/content/WebApi-FSharp/Program.fs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs index 1abd30332163..0593d5111bd0 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs +++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs @@ -12,6 +12,7 @@ open Microsoft.AspNetCore.Hosting open Microsoft.AspNetCore.HttpsPolicy #endif open Microsoft.Extensions.Configuration +open Microsoft.Extensions.DependencyInjection open Microsoft.Extensions.Hosting open Microsoft.Extensions.Logging