From 0871e037d836790941dec4ecc758340002f70f92 Mon Sep 17 00:00:00 2001 From: Tommy Parnell Date: Wed, 9 Nov 2022 11:43:42 -0500 Subject: [PATCH] dotnet 7 --- .vscode/launch.json | 2 +- Dockerfile | 2 +- Dockerfile.old | 2 +- .../TerribleDev.Blog.CLI.csproj | 2 +- .../Controllers/HomeController.cs | 45 ++++++++------ .../Controllers/SeoController.cs | 1 + .../Controllers/TagsController.cs | 5 +- src/TerribleDev.Blog.Web/Dockerfile | 4 +- src/TerribleDev.Blog.Web/Startup.cs | 59 +++++++++---------- .../TerribleDev.Blog.Web.csproj | 11 ++-- 10 files changed, 72 insertions(+), 61 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 30e8198..4ef0a96 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,7 @@ "type": "coreclr", "request": "launch", "preLaunchTask": "build", - "program": "${workspaceFolder}/src/TerribleDev.Blog.Web/bin/Debug/netcoreapp3.1/TerribleDev.Blog.Web.dll", + "program": "${workspaceFolder}/src/TerribleDev.Blog.Web/bin/Debug/net7.0/TerribleDev.Blog.Web.dll", "args": [], "cwd": "${workspaceFolder}/src/TerribleDev.Blog.Web", "stopAtEntry": false, diff --git a/Dockerfile b/Dockerfile index c2b5591..5eb6fbe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ COPY ./src/TerribleDev.Blog.Web/ . RUN dotnet publish -c release -o /app -r linux-musl-x64 --self-contained true --no-restore /p:PublishTrimmed=true /p:PublishReadyToRunComposite=true /p:PublishSingleFile=true RUN date +%s > /app/buildtime.txt # final stage/image -FROM mcr.microsoft.com/dotnet/runtime-deps:6.0-alpine-amd64 +FROM mcr.microsoft.com/dotnet/runtime-deps:7.0-alpine-amd64 WORKDIR /app COPY --from=build /app ./ diff --git a/Dockerfile.old b/Dockerfile.old index 6cf455a..2b80d32 100644 --- a/Dockerfile.old +++ b/Dockerfile.old @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build +FROM mcr.microsoft.com/dotnet/sdk:7.0-alpine AS build WORKDIR /app # Copy everything else and build diff --git a/src/TerribleDev.Blog.CLI/TerribleDev.Blog.CLI.csproj b/src/TerribleDev.Blog.CLI/TerribleDev.Blog.CLI.csproj index d99641b..ae869a9 100644 --- a/src/TerribleDev.Blog.CLI/TerribleDev.Blog.CLI.csproj +++ b/src/TerribleDev.Blog.CLI/TerribleDev.Blog.CLI.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp6.0 + netcoreapp7.0 true true tempo diff --git a/src/TerribleDev.Blog.Web/Controllers/HomeController.cs b/src/TerribleDev.Blog.Web/Controllers/HomeController.cs index a3b0903..2b16b25 100644 --- a/src/TerribleDev.Blog.Web/Controllers/HomeController.cs +++ b/src/TerribleDev.Blog.Web/Controllers/HomeController.cs @@ -9,16 +9,19 @@ using System.IO; using Microsoft.AspNetCore.Html; using TerribleDev.Blog.Web.Filters; using Microsoft.Extensions.Logging; +using Microsoft.AspNetCore.OutputCaching; namespace TerribleDev.Blog.Web.Controllers { [Http2PushFilter] public class HomeController : Controller { + private readonly ILogger logger; private readonly PostCache postCache; - public HomeController(PostCache postCache) + public HomeController(PostCache postCache, ILogger logger) { + this.logger = logger; this.postCache = postCache; } @@ -27,18 +30,26 @@ namespace TerribleDev.Blog.Web.Controllers [Route("/index.html", Order = 2)] [Route("/")] [Route("/page/{pageNumber:required:int:min(1)}")] - [OutputCache(Duration = 31536000, VaryByParam = "pageNumber")] + [OutputCache(Duration = 31536000, VaryByRouteValueNames = new string[] { "pageNumber" })] [ResponseCache(Duration = 900)] public IActionResult Index(int pageNumber = 1) { - if(!postCache.PostsByPage.TryGetValue(pageNumber, out var result)) + this.logger.LogWarning("Viewing page", pageNumber); + if (!postCache.PostsByPage.TryGetValue(pageNumber, out var result)) { return Redirect($"/404/?from=/page/{pageNumber}/"); } - return View(new HomeViewModel() { Posts = result, Page = pageNumber, HasNext = postCache.PostsByPage.ContainsKey(pageNumber + 1), HasPrevious = postCache.PostsByPage.ContainsKey(pageNumber - 1), - BlogLD = postCache.BlogLD, - SiteLD = postCache.SiteLD, - BlogLDString = postCache.BlogLDString, SiteLDString = postCache.SiteLDString }); + return View(new HomeViewModel() + { + Posts = result, + Page = pageNumber, + HasNext = postCache.PostsByPage.ContainsKey(pageNumber + 1), + HasPrevious = postCache.PostsByPage.ContainsKey(pageNumber - 1), + BlogLD = postCache.BlogLD, + SiteLD = postCache.SiteLD, + BlogLDString = postCache.BlogLDString, + SiteLDString = postCache.SiteLDString + }); } [Route("/theme/{postName?}")] public IActionResult Theme(string postName) @@ -60,34 +71,34 @@ namespace TerribleDev.Blog.Web.Controllers } [Route("{postUrl}/{amp?}")] - [OutputCache(Duration = 31536000, VaryByParam = "postUrl,amp")] + [OutputCache(Duration = 31536000, VaryByRouteValueNames = new string[] { "postUrl", "amp" })] [ResponseCache(Duration = 900)] public IActionResult Post(string postUrl, string amp = "") { - if(!String.IsNullOrEmpty(amp) && amp != "amp") + if (!String.IsNullOrEmpty(amp) && amp != "amp") { return Redirect($"/404/?from=/{postUrl}/{amp}/"); } var isAmp = amp == "amp"; - if(isAmp) + if (isAmp) { return this.RedirectPermanent($"/{postUrl}"); } // case sensitive lookup - if(postCache.UrlToPost.TryGetValue(postUrl, out var currentPost)) + if (postCache.UrlToPost.TryGetValue(postUrl, out var currentPost)) { - return View("Post", model: new PostViewModel() { Post = currentPost }); + return View("Post", model: new PostViewModel() { Post = currentPost }); } // case insensitive lookup on post - if(postCache.CaseInsensitiveUrlToPost.TryGetValue(postUrl, out var caseInsensitivePost)) + if (postCache.CaseInsensitiveUrlToPost.TryGetValue(postUrl, out var caseInsensitivePost)) { - return View("Post", model: new PostViewModel() { Post = caseInsensitivePost }); + return View("Post", model: new PostViewModel() { Post = caseInsensitivePost }); } - if(postCache.LandingPagesUrl.TryGetValue(postUrl, out var landingPage)) + if (postCache.LandingPagesUrl.TryGetValue(postUrl, out var landingPage)) { - return View("Post", model: new PostViewModel() { Post = landingPage }); + return View("Post", model: new PostViewModel() { Post = landingPage }); } - + this.StatusCode(404); return View(nameof(FourOhFour)); } diff --git a/src/TerribleDev.Blog.Web/Controllers/SeoController.cs b/src/TerribleDev.Blog.Web/Controllers/SeoController.cs index 40921b2..5d0edef 100644 --- a/src/TerribleDev.Blog.Web/Controllers/SeoController.cs +++ b/src/TerribleDev.Blog.Web/Controllers/SeoController.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using System.Xml; using System.Xml.Serialization; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.OutputCaching; using Microsoft.SyndicationFeed; using Microsoft.SyndicationFeed.Rss; using TerribleDev.Blog.Web.Models; diff --git a/src/TerribleDev.Blog.Web/Controllers/TagsController.cs b/src/TerribleDev.Blog.Web/Controllers/TagsController.cs index f69170e..f81f899 100644 --- a/src/TerribleDev.Blog.Web/Controllers/TagsController.cs +++ b/src/TerribleDev.Blog.Web/Controllers/TagsController.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.OutputCaching; using TerribleDev.Blog.Web.Filters; using TerribleDev.Blog.Web.Models; @@ -24,7 +25,7 @@ namespace TerribleDev.Blog.Web.Controllers return View(postCache.TagsToPosts); } [Route("/tags/{tagName}")] - [OutputCache(Duration = 31536000, VaryByParam = "tagName")] + [OutputCache(Duration = 31536000, VaryByRouteValueNames = new string[]{"tagName"})] public IActionResult TagPluralRedirect(string tagName) { if(string.IsNullOrEmpty(tagName)) @@ -34,7 +35,7 @@ namespace TerribleDev.Blog.Web.Controllers return Redirect($"/tag/{tagName}/"); } [Route("/tag/{tagName}")] - [OutputCache(Duration = 31536000, VaryByParam = "tagName")] + [OutputCache(Duration = 31536000, VaryByRouteValueNames = new string[] {"tagName"})] public IActionResult GetTag(string tagName) { if(!postCache.TagsToPosts.TryGetValue(tagName.ToLower(), out var models)) diff --git a/src/TerribleDev.Blog.Web/Dockerfile b/src/TerribleDev.Blog.Web/Dockerfile index 56f1686..709d39f 100644 --- a/src/TerribleDev.Blog.Web/Dockerfile +++ b/src/TerribleDev.Blog.Web/Dockerfile @@ -1,5 +1,5 @@ # https://hub.docker.com/_/microsoft-dotnet -FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build +FROM mcr.microsoft.com/dotnet/sdk:7.0-alpine AS build WORKDIR /source # copy csproj and restore as distinct layers @@ -11,7 +11,7 @@ COPY . . RUN dotnet publish -c release -o /app -r linux-musl-x64 --self-contained true --no-restore /p:PublishTrimmed=true /p:PublishReadyToRunComposite=true /p:PublishSingleFile=true # final stage/image -FROM mcr.microsoft.com/dotnet/runtime-deps:6.0-alpine-amd64 +FROM mcr.microsoft.com/dotnet/runtime-deps:7.0-alpine-amd64 WORKDIR /app COPY --from=build /app ./ diff --git a/src/TerribleDev.Blog.Web/Startup.cs b/src/TerribleDev.Blog.Web/Startup.cs index e6051f8..cbc91f7 100644 --- a/src/TerribleDev.Blog.Web/Startup.cs +++ b/src/TerribleDev.Blog.Web/Startup.cs @@ -12,7 +12,7 @@ using HardHat; using TerribleDev.Blog.Web.Models; using TerribleDev.Blog.Web.Factories; using Microsoft.Extensions.Hosting; -using WebMarkupMin.AspNetCore6; +using WebMarkupMin.AspNetCore7; using Microsoft.Extensions.Logging; using TerribleDev.Blog.Web.Filters; @@ -68,16 +68,23 @@ namespace TerribleDev.Blog.Web controllerBuilder.AddRazorRuntimeCompilation(); } #endif - services.AddResponseCompression(a => + services + .AddResponseCompression(a => { a.EnableForHttps = true; }) + .AddResponseCaching() .AddMemoryCache(); - if(Env.IsProduction()) - { - services.AddOutputCaching(); - } + // if(Env.IsProduction()) + // { + + // } + services.AddOutputCache(a =>{ + a.AddBasePolicy(b => { + b.Cache(); + }); + }); services.AddWebMarkupMin(a => { a.AllowMinificationInDevelopmentEnvironment = true; a.DisablePoweredByHttpHeaders = true; @@ -90,19 +97,15 @@ namespace TerribleDev.Blog.Web public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { Console.WriteLine("ETag Detected As: " + StaticETag.staticEtag); - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseExceptionHandler("/Error"); - - } app.UseHttpsRedirection(); + if (env.IsProduction()) + { + app.UseOutputCache(); + app.UseResponseCaching(); + } app.UseResponseCompression(); - var cacheTime = env.IsDevelopment() ? 0 : 31536000; + var cacheTime = env.IsDevelopment() ? 1 : 31536000; app.UseStaticFiles(new StaticFileOptions { OnPrepareResponse = ctx => @@ -120,6 +123,16 @@ namespace TerribleDev.Blog.Web "public,max-age=" + cacheTime; } }); + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Error"); + + } + app.UseRewriter(new Microsoft.AspNetCore.Rewrite.RewriteOptions().AddRedirect("(.*[^/|.xml|.html])$", "$1/", 301)); app.UseIENoOpen(); app.UseNoMimeSniff(); @@ -142,20 +155,6 @@ namespace TerribleDev.Blog.Web // }, UpgradeInsecureRequests = true }); - app.Use(async (context, next) => { - var etag = context.Request.Headers.IfNoneMatch.ToString(); - if(etag != null && string.Equals(etag, StaticETag.staticEtag, StringComparison.Ordinal)) - { - context.Response.StatusCode = 304; - await context.Response.CompleteAsync(); - return; - } - await next(); - }); - if(Env.IsProduction()) - { - app.UseOutputCaching(); - } app.UseWebMarkupMin(); app.UseRouting(); app.UseEndpoints(endpoints => diff --git a/src/TerribleDev.Blog.Web/TerribleDev.Blog.Web.csproj b/src/TerribleDev.Blog.Web/TerribleDev.Blog.Web.csproj index b721545..7cd7e7f 100644 --- a/src/TerribleDev.Blog.Web/TerribleDev.Blog.Web.csproj +++ b/src/TerribleDev.Blog.Web/TerribleDev.Blog.Web.csproj @@ -1,10 +1,10 @@  - net6.0 + net7.0 InProcess - Linux - linux-musl-x64 + @@ -23,12 +23,11 @@ - + - - +