From ff57129b50b5473cd1ef315f1485350c32799887 Mon Sep 17 00:00:00 2001 From: bspoljaric Date: Fri, 31 Jan 2025 12:54:40 +0100 Subject: [PATCH 1/3] hybrid caching in .NET --- .../HybridCachingDotNet.sln | 28 +++++++ .../HybridCachingDotNet.csproj | 13 +++ .../HybridCachingDotNet.http | 29 +++++++ .../HybridCachingDotNet/Models/CmCourse.cs | 10 +++ .../HybridCachingDotNet/Program.cs | 70 ++++++++++++++++ .../Properties/launchSettings.json | 28 +++++++ .../Services/CmCourseService.cs | 73 +++++++++++++++++ .../Services/ICmCourseService.cs | 14 ++++ .../appsettings.Development.json | 8 ++ .../HybridCachingDotNet/appsettings.json | 9 +++ .../Tests/CmCourseServiceTests.cs | 80 +++++++++++++++++++ .../Tests/MSTestSettings.cs | 1 + .../HybridCachingDotNet/Tests/Tests.csproj | 24 ++++++ .../WebApplication1/WebApplication1.sln | 22 +++++ .../WebApplication1/Program.cs | 34 ++++++++ .../Properties/launchSettings.json | 23 ++++++ .../WebApplication1/WebApplication1.csproj | 9 +++ .../WebApplication1/WebApplication1.http | 6 ++ .../appsettings.Development.json | 8 ++ .../WebApplication1/appsettings.json | 9 +++ 20 files changed, 498 insertions(+) create mode 100644 aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet.sln create mode 100644 aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/HybridCachingDotNet.csproj create mode 100644 aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/HybridCachingDotNet.http create mode 100644 aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Models/CmCourse.cs create mode 100644 aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Program.cs create mode 100644 aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Properties/launchSettings.json create mode 100644 aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Services/CmCourseService.cs create mode 100644 aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Services/ICmCourseService.cs create mode 100644 aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/appsettings.Development.json create mode 100644 aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/appsettings.json create mode 100644 aspnetcore-features/HybridCachingDotNet/Tests/CmCourseServiceTests.cs create mode 100644 aspnetcore-features/HybridCachingDotNet/Tests/MSTestSettings.cs create mode 100644 aspnetcore-features/HybridCachingDotNet/Tests/Tests.csproj create mode 100644 aspnetcore-features/WebApplication1/WebApplication1.sln create mode 100644 aspnetcore-features/WebApplication1/WebApplication1/Program.cs create mode 100644 aspnetcore-features/WebApplication1/WebApplication1/Properties/launchSettings.json create mode 100644 aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.csproj create mode 100644 aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.http create mode 100644 aspnetcore-features/WebApplication1/WebApplication1/appsettings.Development.json create mode 100644 aspnetcore-features/WebApplication1/WebApplication1/appsettings.json diff --git a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet.sln b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet.sln new file mode 100644 index 0000000000..c731660b7a --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.12.35527.113 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HybridCachingDotNet", "HybridCachingDotNet\HybridCachingDotNet.csproj", "{FF8DF36E-D891-4831-B5D1-99DD21423E2E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{F1A99A78-F1F9-4E2E-ABAB-D7E679DB053C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FF8DF36E-D891-4831-B5D1-99DD21423E2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF8DF36E-D891-4831-B5D1-99DD21423E2E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF8DF36E-D891-4831-B5D1-99DD21423E2E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF8DF36E-D891-4831-B5D1-99DD21423E2E}.Release|Any CPU.Build.0 = Release|Any CPU + {F1A99A78-F1F9-4E2E-ABAB-D7E679DB053C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F1A99A78-F1F9-4E2E-ABAB-D7E679DB053C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F1A99A78-F1F9-4E2E-ABAB-D7E679DB053C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F1A99A78-F1F9-4E2E-ABAB-D7E679DB053C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/HybridCachingDotNet.csproj b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/HybridCachingDotNet.csproj new file mode 100644 index 0000000000..4df1dbfd0c --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/HybridCachingDotNet.csproj @@ -0,0 +1,13 @@ + + + + net9.0 + enable + enable + + + + + + + diff --git a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/HybridCachingDotNet.http b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/HybridCachingDotNet.http new file mode 100644 index 0000000000..41f9be2a69 --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/HybridCachingDotNet.http @@ -0,0 +1,29 @@ +@HybridCachingDotNet_HostAddress = http://localhost:5009 + +GET {{HybridCachingDotNet_HostAddress}}/cm-courses/4 +Accept: application/json + +### + +POST {{HybridCachingDotNet_HostAddress}}/cm-courses +Accept: application/json +Content-Type: application/json + +{ + "id": 4, + "name": "NewCourse", + "category": "NewCategory" +} + +### + +DELETE {{HybridCachingDotNet_HostAddress}}/cm-courses/4 +Accept: application/json + +### + + +DELETE {{HybridCachingDotNet_HostAddress}}/cm-courses/category/NewCategory +Accept: application/json + +### diff --git a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Models/CmCourse.cs b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Models/CmCourse.cs new file mode 100644 index 0000000000..1284ebc2dd --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Models/CmCourse.cs @@ -0,0 +1,10 @@ +namespace HybridCachingDotNet.Models; + +public class CmCourse +{ + public int Id { get; set; } + + public required string Name { get; set; } + + public required string Category { get; set; } +} diff --git a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Program.cs b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Program.cs new file mode 100644 index 0000000000..2544a11abc --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Program.cs @@ -0,0 +1,70 @@ +using HybridCachingDotNet.Models; +using HybridCachingDotNet.Services; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Hybrid; + +var builder = WebApplication.CreateBuilder(args); + +#pragma warning disable EXTEXP0018 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. +builder.Services.AddHybridCache(options => +{ + options.MaximumPayloadBytes = 1024 * 10 * 10; + options.MaximumKeyLength = 256; + + options.DefaultEntryOptions = new HybridCacheEntryOptions + { + Expiration = TimeSpan.FromMinutes(30), + LocalCacheExpiration = TimeSpan.FromMinutes(30) + }; + + options.ReportTagMetrics = true; + options.DisableCompression = true; +}); +#pragma warning restore EXTEXP0018 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. + +builder.Services.AddScoped(); + +var app = builder.Build(); + +app.MapGet("/cm-courses/{id}", async ( + ICmCourseService cmCourseService, + int id, + CancellationToken cancellationToken) => + { + var result = await cmCourseService.GetCourseAsync(id, cancellationToken); + return Results.Ok(result); + } +); + +app.MapPost("/cm-courses", async ( + ICmCourseService cmCourseService, + [FromBody]CmCourse course, + CancellationToken cancellationToken) => +{ + await cmCourseService.PostCourseAsync(course, cancellationToken); + return Results.Ok(); +} +); + +app.MapDelete("/cm-courses/{id}", async ( + ICmCourseService cmCourseService, + int id, + CancellationToken cancellationToken) => +{ + await cmCourseService.InvalidateByCourseIdAsync(id, cancellationToken); + return Results.Ok(); +} +); + +app.MapDelete("/cm-courses/category/{tag}", async ( + ICmCourseService cmCourseService, + string tag, + CancellationToken cancellationToken) => +{ + await cmCourseService.InvalidateByCategoryAsync(tag, cancellationToken); + return Results.Ok(); +} +); + +app.Run(); + diff --git a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Properties/launchSettings.json b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Properties/launchSettings.json new file mode 100644 index 0000000000..d5d88575a7 --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Properties/launchSettings.json @@ -0,0 +1,28 @@ +{ + "profiles": { + "http": { + "commandName": "Project", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "dotnetRunMessages": true, + "applicationUrl": "http://localhost:5009" + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + }, + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:60033/", + "sslPort": 44312 + } + } +} \ No newline at end of file diff --git a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Services/CmCourseService.cs b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Services/CmCourseService.cs new file mode 100644 index 0000000000..7753368547 --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Services/CmCourseService.cs @@ -0,0 +1,73 @@ +namespace HybridCachingDotNet.Services; + +using HybridCachingDotNet.Models; +using Microsoft.Extensions.Caching.Hybrid; + +public class CmCourseService(HybridCache cache) : ICmCourseService +{ + public static readonly List courseList = [ + new CmCourse + { + Id = 1, + Name = "WebAPI", + Category = "Backend" + }, + new CmCourse + { + Id = 2, + Name = "Microservices", + Category = "Backend" + }, + new CmCourse + { + Id = 3, + Name = "Blazer", + Category = "Frontend" + }, + ]; + + public async Task GetCourseAsync(int id, CancellationToken cancellationToken = default) + { + return await cache.GetOrCreateAsync( + $"course-{id}", + async token => + { + await Task.Delay(1000, token); + var course = courseList.FirstOrDefault(course => course.Id == id); + return course; + }, + options: new HybridCacheEntryOptions + { + Expiration = TimeSpan.FromMinutes(30), + LocalCacheExpiration = TimeSpan.FromMinutes(30) + }, + tags: ["course"], + cancellationToken: cancellationToken + ); + } + + public async Task PostCourseAsync(CmCourse course, CancellationToken cancellationToken = default) + { + courseList.Add(course); + + await cache.SetAsync($"course-{course.Id}", + course, + options: new HybridCacheEntryOptions + { + Expiration = TimeSpan.FromMinutes(30), + LocalCacheExpiration = TimeSpan.FromMinutes(30) + }, + tags: [$"cat-{course.Category}"], + cancellationToken: cancellationToken); + } + + public async Task InvalidateByCourseIdAsync(int id, CancellationToken cancellationToken = default) + { + await cache.RemoveAsync($"course-{id}", cancellationToken); + } + + public async Task InvalidateByCategoryAsync(string tag, CancellationToken cancellationToken = default) + { + await cache.RemoveByTagAsync($"cat-{tag}", cancellationToken); + } +} diff --git a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Services/ICmCourseService.cs b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Services/ICmCourseService.cs new file mode 100644 index 0000000000..137ae1348b --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Services/ICmCourseService.cs @@ -0,0 +1,14 @@ +namespace HybridCachingDotNet.Services; + +using HybridCachingDotNet.Models; + +public interface ICmCourseService +{ + Task GetCourseAsync(int id, CancellationToken cancellationToken = default); + + Task PostCourseAsync(CmCourse course, CancellationToken cancellationToken = default); + + Task InvalidateByCourseIdAsync(int id, CancellationToken cancellationToken = default); + + Task InvalidateByCategoryAsync(string tag, CancellationToken cancellationToken = default); +} diff --git a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/appsettings.Development.json b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/appsettings.Development.json new file mode 100644 index 0000000000..0c208ae918 --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/appsettings.json b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/appsettings.json new file mode 100644 index 0000000000..10f68b8c8b --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/aspnetcore-features/HybridCachingDotNet/Tests/CmCourseServiceTests.cs b/aspnetcore-features/HybridCachingDotNet/Tests/CmCourseServiceTests.cs new file mode 100644 index 0000000000..9df2c63084 --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/Tests/CmCourseServiceTests.cs @@ -0,0 +1,80 @@ +namespace Tests; + +using HybridCachingDotNet.Models; +using HybridCachingDotNet.Services; +using Microsoft.Extensions.Caching.Hybrid; +using NSubstitute; + +[TestClass] +public class CmCourseServiceTests +{ + [TestMethod] + public async Task GivenHybridCache_WhenGetCourseAsync_GetOrCreateAsyncIsCalled() + { + var hybridCache = Substitute.For(); + + var sut = new CmCourseService(hybridCache); + + var actual = await sut.GetCourseAsync(1); + + await hybridCache.Received().GetOrCreateAsync("course-1", + Arg.Any>>(), + Arg.Any(), + Arg.Any>(), + Arg.Any() + ); + } + + [TestMethod] + public async Task GivenHybridCache_WhenPostCourseAsync_SetAsyncIsCalled() + { + var hybridCache = Substitute.For(); + + var sut = new CmCourseService(hybridCache); + + var course = new CmCourse + { + Id = 4, + Name = "NewCourse", + Category = "NewCategory", + }; + + await sut.PostCourseAsync(course); + + await hybridCache.Received().SetAsync("course-4", + Arg.Any(), + Arg.Any(), + Arg.Any>(), + Arg.Any() + ); + } + + [TestMethod] + public async Task GivenHybridCache_WhenInvalidateCourseByIdAsync_RemoveAsyncIsCalled() + { + var hybridCache = Substitute.For(); + + var sut = new CmCourseService(hybridCache); + + + await sut.InvalidateByCourseIdAsync(1); + + await hybridCache.RemoveAsync("course-1", + Arg.Any() + ); + } + + [TestMethod] + public async Task GivenHybridCache_WhenInvalidateByCategoryAsync_RemoveByTagAsyncIsCalled() + { + var hybridCache = Substitute.For(); + + var sut = new CmCourseService(hybridCache); + + await sut.InvalidateByCategoryAsync("NewCategory"); + + await hybridCache.RemoveByTagAsync("cat-NewCategory", + Arg.Any() + ); + } +} \ No newline at end of file diff --git a/aspnetcore-features/HybridCachingDotNet/Tests/MSTestSettings.cs b/aspnetcore-features/HybridCachingDotNet/Tests/MSTestSettings.cs new file mode 100644 index 0000000000..aaf278c844 --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/Tests/MSTestSettings.cs @@ -0,0 +1 @@ +[assembly: Parallelize(Scope = ExecutionScope.MethodLevel)] diff --git a/aspnetcore-features/HybridCachingDotNet/Tests/Tests.csproj b/aspnetcore-features/HybridCachingDotNet/Tests/Tests.csproj new file mode 100644 index 0000000000..0a9f976666 --- /dev/null +++ b/aspnetcore-features/HybridCachingDotNet/Tests/Tests.csproj @@ -0,0 +1,24 @@ + + + + net9.0 + latest + enable + enable + + + + + + + + + + + + + + + + + diff --git a/aspnetcore-features/WebApplication1/WebApplication1.sln b/aspnetcore-features/WebApplication1/WebApplication1.sln new file mode 100644 index 0000000000..9e4cadca6e --- /dev/null +++ b/aspnetcore-features/WebApplication1/WebApplication1.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.12.35527.113 d17.12 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApplication1", "WebApplication1\WebApplication1.csproj", "{DFAD3177-7C12-4EA3-A896-621A914FB028}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {DFAD3177-7C12-4EA3-A896-621A914FB028}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DFAD3177-7C12-4EA3-A896-621A914FB028}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DFAD3177-7C12-4EA3-A896-621A914FB028}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DFAD3177-7C12-4EA3-A896-621A914FB028}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/aspnetcore-features/WebApplication1/WebApplication1/Program.cs b/aspnetcore-features/WebApplication1/WebApplication1/Program.cs new file mode 100644 index 0000000000..9a6d4cbfe3 --- /dev/null +++ b/aspnetcore-features/WebApplication1/WebApplication1/Program.cs @@ -0,0 +1,34 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +var app = builder.Build(); + +// Configure the HTTP request pipeline. + +app.UseHttpsRedirection(); + +var summaries = new[] +{ + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" +}; + +app.MapGet("/weatherforecast", () => +{ + var forecast = Enumerable.Range(1, 5).Select(index => + new WeatherForecast + ( + DateOnly.FromDateTime(DateTime.Now.AddDays(index)), + Random.Shared.Next(-20, 55), + summaries[Random.Shared.Next(summaries.Length)] + )) + .ToArray(); + return forecast; +}); + +app.Run(); + +internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) +{ + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); +} diff --git a/aspnetcore-features/WebApplication1/WebApplication1/Properties/launchSettings.json b/aspnetcore-features/WebApplication1/WebApplication1/Properties/launchSettings.json new file mode 100644 index 0000000000..3de63572a5 --- /dev/null +++ b/aspnetcore-features/WebApplication1/WebApplication1/Properties/launchSettings.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:5259", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:7281;http://localhost:5259", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.csproj b/aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.csproj new file mode 100644 index 0000000000..6568b3dcfb --- /dev/null +++ b/aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.csproj @@ -0,0 +1,9 @@ + + + + net9.0 + enable + enable + + + diff --git a/aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.http b/aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.http new file mode 100644 index 0000000000..5f60d8b4f4 --- /dev/null +++ b/aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.http @@ -0,0 +1,6 @@ +@WebApplication1_HostAddress = http://localhost:5259 + +GET {{WebApplication1_HostAddress}}/weatherforecast/ +Accept: application/json + +### diff --git a/aspnetcore-features/WebApplication1/WebApplication1/appsettings.Development.json b/aspnetcore-features/WebApplication1/WebApplication1/appsettings.Development.json new file mode 100644 index 0000000000..0c208ae918 --- /dev/null +++ b/aspnetcore-features/WebApplication1/WebApplication1/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/aspnetcore-features/WebApplication1/WebApplication1/appsettings.json b/aspnetcore-features/WebApplication1/WebApplication1/appsettings.json new file mode 100644 index 0000000000..10f68b8c8b --- /dev/null +++ b/aspnetcore-features/WebApplication1/WebApplication1/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} From 7eaf00224db073f44fadfd1b75b9cc213c7fb004 Mon Sep 17 00:00:00 2001 From: bspoljaric Date: Fri, 31 Jan 2025 12:58:51 +0100 Subject: [PATCH 2/3] remove accidental empty project --- .../WebApplication1/WebApplication1.sln | 22 ------------ .../WebApplication1/Program.cs | 34 ------------------- .../Properties/launchSettings.json | 23 ------------- .../WebApplication1/WebApplication1.csproj | 9 ----- .../WebApplication1/WebApplication1.http | 6 ---- .../appsettings.Development.json | 8 ----- .../WebApplication1/appsettings.json | 9 ----- 7 files changed, 111 deletions(-) delete mode 100644 aspnetcore-features/WebApplication1/WebApplication1.sln delete mode 100644 aspnetcore-features/WebApplication1/WebApplication1/Program.cs delete mode 100644 aspnetcore-features/WebApplication1/WebApplication1/Properties/launchSettings.json delete mode 100644 aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.csproj delete mode 100644 aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.http delete mode 100644 aspnetcore-features/WebApplication1/WebApplication1/appsettings.Development.json delete mode 100644 aspnetcore-features/WebApplication1/WebApplication1/appsettings.json diff --git a/aspnetcore-features/WebApplication1/WebApplication1.sln b/aspnetcore-features/WebApplication1/WebApplication1.sln deleted file mode 100644 index 9e4cadca6e..0000000000 --- a/aspnetcore-features/WebApplication1/WebApplication1.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.12.35527.113 d17.12 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApplication1", "WebApplication1\WebApplication1.csproj", "{DFAD3177-7C12-4EA3-A896-621A914FB028}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {DFAD3177-7C12-4EA3-A896-621A914FB028}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DFAD3177-7C12-4EA3-A896-621A914FB028}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DFAD3177-7C12-4EA3-A896-621A914FB028}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DFAD3177-7C12-4EA3-A896-621A914FB028}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/aspnetcore-features/WebApplication1/WebApplication1/Program.cs b/aspnetcore-features/WebApplication1/WebApplication1/Program.cs deleted file mode 100644 index 9a6d4cbfe3..0000000000 --- a/aspnetcore-features/WebApplication1/WebApplication1/Program.cs +++ /dev/null @@ -1,34 +0,0 @@ -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. - -var app = builder.Build(); - -// Configure the HTTP request pipeline. - -app.UseHttpsRedirection(); - -var summaries = new[] -{ - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" -}; - -app.MapGet("/weatherforecast", () => -{ - var forecast = Enumerable.Range(1, 5).Select(index => - new WeatherForecast - ( - DateOnly.FromDateTime(DateTime.Now.AddDays(index)), - Random.Shared.Next(-20, 55), - summaries[Random.Shared.Next(summaries.Length)] - )) - .ToArray(); - return forecast; -}); - -app.Run(); - -internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) -{ - public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); -} diff --git a/aspnetcore-features/WebApplication1/WebApplication1/Properties/launchSettings.json b/aspnetcore-features/WebApplication1/WebApplication1/Properties/launchSettings.json deleted file mode 100644 index 3de63572a5..0000000000 --- a/aspnetcore-features/WebApplication1/WebApplication1/Properties/launchSettings.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/launchsettings.json", - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "http://localhost:5259", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "https://localhost:7281;http://localhost:5259", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} diff --git a/aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.csproj b/aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.csproj deleted file mode 100644 index 6568b3dcfb..0000000000 --- a/aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.csproj +++ /dev/null @@ -1,9 +0,0 @@ - - - - net9.0 - enable - enable - - - diff --git a/aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.http b/aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.http deleted file mode 100644 index 5f60d8b4f4..0000000000 --- a/aspnetcore-features/WebApplication1/WebApplication1/WebApplication1.http +++ /dev/null @@ -1,6 +0,0 @@ -@WebApplication1_HostAddress = http://localhost:5259 - -GET {{WebApplication1_HostAddress}}/weatherforecast/ -Accept: application/json - -### diff --git a/aspnetcore-features/WebApplication1/WebApplication1/appsettings.Development.json b/aspnetcore-features/WebApplication1/WebApplication1/appsettings.Development.json deleted file mode 100644 index 0c208ae918..0000000000 --- a/aspnetcore-features/WebApplication1/WebApplication1/appsettings.Development.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} diff --git a/aspnetcore-features/WebApplication1/WebApplication1/appsettings.json b/aspnetcore-features/WebApplication1/WebApplication1/appsettings.json deleted file mode 100644 index 10f68b8c8b..0000000000 --- a/aspnetcore-features/WebApplication1/WebApplication1/appsettings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*" -} From 7b4e181eef54a2dc38f89b1af845ac0e2b1d6724 Mon Sep 17 00:00:00 2001 From: bspoljaric Date: Mon, 24 Mar 2025 22:06:40 +0100 Subject: [PATCH 3/3] GA version --- .../HybridCachingDotNet/HybridCachingDotNet.csproj | 2 +- .../HybridCachingDotNet/HybridCachingDotNet/Program.cs | 2 -- aspnetcore-features/HybridCachingDotNet/Tests/Tests.csproj | 1 + 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/HybridCachingDotNet.csproj b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/HybridCachingDotNet.csproj index 4df1dbfd0c..b1ef77fcb7 100644 --- a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/HybridCachingDotNet.csproj +++ b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/HybridCachingDotNet.csproj @@ -7,7 +7,7 @@ - + diff --git a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Program.cs b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Program.cs index 2544a11abc..51f133645f 100644 --- a/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Program.cs +++ b/aspnetcore-features/HybridCachingDotNet/HybridCachingDotNet/Program.cs @@ -5,7 +5,6 @@ var builder = WebApplication.CreateBuilder(args); -#pragma warning disable EXTEXP0018 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. builder.Services.AddHybridCache(options => { options.MaximumPayloadBytes = 1024 * 10 * 10; @@ -20,7 +19,6 @@ options.ReportTagMetrics = true; options.DisableCompression = true; }); -#pragma warning restore EXTEXP0018 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. builder.Services.AddScoped(); diff --git a/aspnetcore-features/HybridCachingDotNet/Tests/Tests.csproj b/aspnetcore-features/HybridCachingDotNet/Tests/Tests.csproj index 0a9f976666..8e23fec748 100644 --- a/aspnetcore-features/HybridCachingDotNet/Tests/Tests.csproj +++ b/aspnetcore-features/HybridCachingDotNet/Tests/Tests.csproj @@ -8,6 +8,7 @@ +