From 28e4860c4a8565aa1fc5333c9f6471e2c0af8a0f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 16:37:07 +0000 Subject: [PATCH 01/16] feat(mediator): complete Azure Functions sample host Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- docs/mediator-framework/progress/tasks/README.md | 2 +- samples/Ark.MediatorFramework.Sample/README.md | 1 + .../ApplicationComposition.cs | 1 + .../GreetingContracts.cs | 11 +++++++++++ .../GreetingHandlers.cs | 14 ++++++++++++++ .../AzureFunctionsRebusComposition.cs | 4 ++++ .../Program.cs | 7 +++++++ 7 files changed, 39 insertions(+), 1 deletion(-) diff --git a/docs/mediator-framework/progress/tasks/README.md b/docs/mediator-framework/progress/tasks/README.md index 644f2188c..4829cc8f3 100644 --- a/docs/mediator-framework/progress/tasks/README.md +++ b/docs/mediator-framework/progress/tasks/README.md @@ -130,7 +130,7 @@ the framework libraries. 3. [x] AZF-01 → [x] AZF-02 → [x] AZF-03. 4. [x] AZF-04 → [x] AZF-05. 5. [x] [AZF-06](azure-functions/AZF-06-files-streaming.md) → [x] [AZF-07](azure-functions/AZF-07-one-way-rebus.md) (independent after AZF-05). -6. [ ] AZF-08. +6. [x] AZF-08. 7. [ ] AZF-10. AZF-09 remains deferred until AZD-11 is reopened. Also see [`../future-improvements.md`](../future-improvements.md) (WebApplicationFactory auth substitution, AoT sample, N6, N9). diff --git a/samples/Ark.MediatorFramework.Sample/README.md b/samples/Ark.MediatorFramework.Sample/README.md index 9209214e5..7e6387096 100644 --- a/samples/Ark.MediatorFramework.Sample/README.md +++ b/samples/Ark.MediatorFramework.Sample/README.md @@ -85,6 +85,7 @@ Rebus client. Use a namespace with `DefaultAzureCredential` in managed environments, or a connection string from external configuration for local use. The Function process has no input queue, workers, subscriptions, handlers, or request/reply bus semantics; messages are consumed by the separate processor. +The anonymous readiness endpoint is `/api/v1/health`. ## gRPC operations panel diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ApplicationComposition.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ApplicationComposition.cs index 920230c05..1d8aa5fbd 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ApplicationComposition.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ApplicationComposition.cs @@ -156,6 +156,7 @@ public static void Register( container.Register, CompleteGreetingCompositionHandler>(); container.Register, GetGreetingHandler>(); container.Register, GetGreetingV2Handler>(); + container.Register, HealthCheckHandler>(); container.Register>, GetAuditsHandler>(); container.Register, SearchGreetingsHandler>(); container.Register>, GetGreetingsStreamHandler>(); diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs index 0f2d7107a..418a3a2a1 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs @@ -12,6 +12,17 @@ namespace Ark.MediatorFramework.Sample.Application; +/// Returns the readiness state of an HTTP host. +[HttpEndpoint("GET", "/health", AllowAnonymous = true)] +public sealed record HealthCheckQuery : IQuery; + +/// Readiness response returned by both HTTP hosts. +public sealed record HealthCheckResponse +{ + /// Gets the readiness state. + public string Status { get; init; } = "ok"; +} + /// Response returned by the greeting operations. [ProtoContract] [MessagePackObject(true)] diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingHandlers.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingHandlers.cs index 736ebb2ac..092f1ce64 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingHandlers.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingHandlers.cs @@ -16,6 +16,20 @@ namespace Ark.MediatorFramework.Sample.Application; +/// Handles the anonymous host readiness query. +public sealed class HealthCheckHandler : IQueryHandler +{ + /// + public async Task ExecuteAsync( + HealthCheckQuery query, + CancellationToken ctk = default) + { + ArgumentNullException.ThrowIfNull(query); + await Task.CompletedTask.ConfigureAwait(false); + return new HealthCheckResponse(); + } +} + /// Handles the synchronous refresh command. public sealed class RefreshGreetingHandler : ICommandHandler { diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/AzureFunctionsRebusComposition.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/AzureFunctionsRebusComposition.cs index 4e65011ef..a28cdd67b 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/AzureFunctionsRebusComposition.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/AzureFunctionsRebusComposition.cs @@ -4,6 +4,8 @@ using Ark.MediatorFramework.Sample.Application; using Ark.MediatorFramework.Sample.RebusProcessor; +using Ark.Tools.Solid.Authorization; + using Azure.Identity; using Rebus.Config; @@ -31,6 +33,8 @@ public static Container BuildContainer(string? serviceBusConnectionString) var container = new Container(); ApplicationComposition.Register(container, useSqlStore: false); + container.RegisterAuthorization(); + container.RegisterAuthorizationHandler(); ApplicationComposition.RegisterOutboundRebus( container, transport => ConfigureTransport(transport, serviceBusConnectionString), diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/Program.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/Program.cs index 681a80eaf..5d25ab38c 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/Program.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/Program.cs @@ -4,6 +4,7 @@ using Ark.MediatorFramework.Sample.Application; using Ark.MediatorFramework.AzureFunctions; +using Microsoft.AspNetCore.Authorization; using Microsoft.Azure.Functions.Worker.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -32,6 +33,12 @@ public static void Main(string[] args) #pragma warning restore CA2000 builder.Services.AddArkAzureFunctions(rebusContainer); builder.Services.AddArkAzureFunctionsBearerAuthentication(); + builder.Services.AddAuthorization(options => + { + options.DefaultPolicy = new AuthorizationPolicyBuilder() + .RequireAuthenticatedUser() + .Build(); + }); builder.Services.AddHostedService(_ => new AzureFunctionsRebusHostedService(rebusContainer)); builder.Build().Run(); From 1932779ba6bd285ab8424f3ea8ace5060c4af222 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 16:42:11 +0000 Subject: [PATCH 02/16] test(mediator): validate Azure Functions sample host Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- .../ArkApiSurface.txt | 3 ++ .../Ark.MediatorFramework.Sample.Tests.csproj | 1 + .../AzureFunctionsRebusTests.cs | 28 +++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt index 75bb528f6..f210918b1 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt @@ -75,6 +75,9 @@ CONTRACT GreetingResponseV2 CONTRACT GreetingResponseV2.Id : Guid CONTRACT GreetingResponseV2.Message : string CONTRACT GreetingResponseV2.MessageLength : int +CONTRACT HealthCheckQuery -> HealthCheckResponse [group=Ark] [http=GET /health] [version=1+] +CONTRACT HealthCheckResponse +CONTRACT HealthCheckResponse.Status : string default="ok" CONTRACT PagedResult CONTRACT PagedResult.Count : long CONTRACT PagedResult.IsCountPartial : bool diff --git a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/Ark.MediatorFramework.Sample.Tests.csproj b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/Ark.MediatorFramework.Sample.Tests.csproj index b7b8482c3..610a002d0 100644 --- a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/Ark.MediatorFramework.Sample.Tests.csproj +++ b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/Ark.MediatorFramework.Sample.Tests.csproj @@ -31,6 +31,7 @@ Content PreserveNewest + diff --git a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs index 34ca9caef..da26d07c7 100644 --- a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs +++ b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. See LICENSE file for license information. using Ark.MediatorFramework.Sample.Application; +using Ark.MediatorFramework.Sample.AzureFunctions; using Ark.MediatorFramework.Sample.RebusProcessor; using Ark.Tools.Rebus; @@ -24,6 +25,33 @@ namespace Ark.MediatorFramework.Sample.Tests; [TestClass] public sealed class AzureFunctionsRebusTests { + /// Verifies the shared anonymous readiness contract and handler. + [TestMethod] + public async Task HealthContractIsAvailableToFunctionHost() + { + var attribute = (Ark.MediatorFramework.HttpEndpointAttribute?)Attribute.GetCustomAttribute( + typeof(HealthCheckQuery), + typeof(Ark.MediatorFramework.HttpEndpointAttribute)); + + Assert.IsNotNull(attribute); + Assert.IsTrue(attribute.AllowAnonymous); + Assert.AreEqual("GET", attribute.Verb); + Assert.AreEqual("/health", attribute.Template); + + var response = await new HealthCheckHandler().ExecuteAsync(new HealthCheckQuery()); + Assert.AreEqual("ok", response.Status); + } + + /// Rejects a Function host without its required outbound bus configuration. + [TestMethod] + public void MissingOutboundBusConfigurationFailsClearly() + { + var exception = Assert.ThrowsException( + () => AzureFunctionsRebusComposition.BuildContainer(null)); + + StringAssert.Contains(exception.Message, "Azure Service Bus configuration is required"); + } + /// Routes and delivers a typed message to an independently hosted receiver. [TestMethod] public async Task OutboundCompositionRoutesToOwnerQueue() From fddc3663ac84d41baafcefd142d4200511397228 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 16:45:03 +0000 Subject: [PATCH 03/16] fix(mediator): finalize Azure Functions sample validation Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- .../AzureFunctionsRebusTests.cs | 7 +- .../packages.lock.json | 103 ++++++++++++++++++ 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs index da26d07c7..f66f7b55c 100644 --- a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs +++ b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs @@ -46,10 +46,13 @@ public async Task HealthContractIsAvailableToFunctionHost() [TestMethod] public void MissingOutboundBusConfigurationFailsClearly() { - var exception = Assert.ThrowsException( + var exception = Assert.Throws( () => AzureFunctionsRebusComposition.BuildContainer(null)); - StringAssert.Contains(exception.Message, "Azure Service Bus configuration is required"); + StringAssert.Contains( + exception.Message, + "Azure Service Bus configuration is required", + StringComparison.Ordinal); } /// Routes and delivers a typed message to an independently hosted receiver. diff --git a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json index 85a933585..2b5b098e6 100644 --- a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json +++ b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json @@ -336,6 +336,15 @@ "resolved": "2.80.0", "contentHash": "i/8s+MOrYa6n7BmZ5bilcbHk+EMJDQHm2MKLhwGAT+urQqlZ6cpjvSivYvuULjebuX+UKieLYZbLRCmVQxFRkw==" }, + "Grpc.Net.ClientFactory": { + "type": "Transitive", + "resolved": "2.65.0", + "contentHash": "iVJ8/uoaPccipMeyD0uwpbX6lRhFEo4aLJmGhLsdigQWi1tDdf/PHfRNZudX3lqZGuqyxl+wC2CfuApIIKPMhg==", + "dependencies": { + "Grpc.Net.Client": "2.65.0", + "Microsoft.Extensions.Http": "6.0.0" + } + }, "Grpc.Net.Common": { "type": "Transitive", "resolved": "2.80.0", @@ -623,6 +632,45 @@ "resolved": "2.7.0", "contentHash": "gm/AEakujttMzrDhZ5QpRz3fICVkYDn/oDG9SmxDP+J7R8JDBXYU9WWG7hr6wQy40mY+wjUF0yUGXDPRDRNJwQ==" }, + "Microsoft.Azure.Functions.Worker.Core": { + "type": "Transitive", + "resolved": "2.52.0", + "contentHash": "VCn3dZK2OxnRxLv6DO/uIQdXzOfaxyPJKyfkfO5ZLb3qA3QlcQZNk/heSWsvE1sqIb1HpVMvN5QadjiX1o7qhA==", + "dependencies": { + "Azure.Core": "1.44.1", + "Microsoft.Extensions.Hosting": "10.0.0" + } + }, + "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "+6+/Yb/ouWUweaSQhesbbiIVSmwYEzkSfjIHrBnNqIiCYnx2iLeoYyWjN/wHP3Fnn5COtyDXRDwHKr5A/tCL9Q==" + }, + "Microsoft.Azure.Functions.Worker.Extensions.Http": { + "type": "Transitive", + "resolved": "3.3.0", + "contentHash": "a1W5bpOQCrYP0kbSJUFrK6PYeQAfg3UXQR+kPdt1YLvWrc/JTaNWyOA1DRKGrvRRo87xSM9NdFZuDULEMAxl4Q==", + "dependencies": { + "Microsoft.Azure.Functions.Worker.Core": "1.19.0", + "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.3.0" + } + }, + "Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore.Analyzers": { + "type": "Transitive", + "resolved": "1.0.4", + "contentHash": "wwuRuxDEh+N8x8uhT3QQs7Due2Q/TRDcSnNeWfX8ldX8lxLKPYjgUwvTLKC7ioHqUfFFEGHLiRMJUh6Jppeamg==" + }, + "Microsoft.Azure.Functions.Worker.Grpc": { + "type": "Transitive", + "resolved": "2.52.0", + "contentHash": "VsSYM6JGpfcBfcZ2MrkJqIcHZJ1PBUa1RBm7/37T7luluH0CHqFeNd4BrJk4uf+zyueYD49EcTo3ePmBGUIKgg==", + "dependencies": { + "Google.Protobuf": "3.28.0", + "Grpc.Net.ClientFactory": "2.65.0", + "Microsoft.Azure.Functions.Worker.Core": "2.52.0", + "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.3.0" + } + }, "Microsoft.Azure.Security.KeyGuardAttestation": { "type": "Transitive", "resolved": "1.1.5", @@ -911,6 +959,17 @@ "Microsoft.Extensions.Logging.Abstractions": "10.0.10" } }, + "Microsoft.Extensions.Http": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" + } + }, "Microsoft.Extensions.Localization.Abstractions": { "type": "Transitive", "resolved": "7.0.5", @@ -1616,6 +1675,16 @@ "Polly": "[8.7.0, )" } }, + "ark.mediatorframework.sample.azurefunctions": { + "type": "Project", + "dependencies": { + "Ark.MediatorFramework.Sample.Application": "[0.9.1, )", + "Ark.MediatorFramework.Sample.RebusProcessor": "[0.9.1, )", + "Ark.Tools.MediatorFramework.AzureFunctions": "[1.0.0, )", + "Ark.Tools.MediatorFramework.Rebus": "[1.0.0, )", + "Ark.Tools.Rebus": "[1.0.0, )" + } + }, "ark.mediatorframework.sample.grpcclient": { "type": "Project", "dependencies": { @@ -1709,6 +1778,18 @@ "protobuf-net": "[3.2.56, )" } }, + "ark.tools.mediatorframework.azurefunctions": { + "type": "Project", + "dependencies": { + "Ark.Tools.AspNetCore.ProblemDetails": "[1.0.0, )", + "Ark.Tools.MediatorFramework": "[1.0.0, )", + "Ark.Tools.Solid": "[1.0.0, )", + "Ark.Tools.SystemTextJson": "[1.0.0, )", + "Microsoft.Azure.Functions.Worker": "[2.52.0, )", + "Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore": "[2.1.1, )", + "SimpleInjector": "[5.6.0, )" + } + }, "ark.tools.mediatorframework.grpc": { "type": "Project", "dependencies": { @@ -1935,6 +2016,28 @@ "resolved": "3.35.1", "contentHash": "pxtkuXhR8svkvDTQrYew9GZQt6eWhblz/V/WKUFrQgkHYlQPsumJTeF6ppHRJpe6j9ffukkd5lQULiiKaek4xA==" }, + "Microsoft.Azure.Functions.Worker": { + "type": "CentralTransitive", + "requested": "[2.52.0, )", + "resolved": "2.52.0", + "contentHash": "yXw128fTSLm6fHMCKqItM9qxf/X6y4ICbTaRdbEWnHj7ppXV5xK87yEzgsOoPd/rCHpVR4IWPy05yBvN/bcmvQ==", + "dependencies": { + "Microsoft.Azure.Functions.Worker.Core": "2.52.0", + "Microsoft.Azure.Functions.Worker.Grpc": "2.52.0" + } + }, + "Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore": { + "type": "CentralTransitive", + "requested": "[2.1.1, )", + "resolved": "2.1.1", + "contentHash": "GrgsfLuJOlWGPVY3liqlZn9ZqQEI2/2h5jyNUqfvEanRq3hAw5PzzOdMED+iBCSDHZ33zOJjCEb+HJX5aOS0wg==", + "dependencies": { + "Microsoft.Azure.Functions.Worker": "2.1.0", + "Microsoft.Azure.Functions.Worker.Extensions.Abstractions": "1.3.0", + "Microsoft.Azure.Functions.Worker.Extensions.Http": "3.3.0", + "Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore.Analyzers": "1.0.4" + } + }, "Microsoft.Identity.Web": { "type": "CentralTransitive", "requested": "[4.13.2, )", From 753b60a9fb8d0fc62a34c35e266ec38d4702b23d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 17:19:26 +0000 Subject: [PATCH 04/16] update health parity docs Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- samples/Ark.MediatorFramework.Sample/README.md | 2 +- .../ArkApiSurface.txt | 6 ++++-- .../GreetingContracts.cs | 11 +++++++++-- .../AzureFunctionsRebusTests.cs | 6 ++++-- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/samples/Ark.MediatorFramework.Sample/README.md b/samples/Ark.MediatorFramework.Sample/README.md index 7e6387096..d37ec9219 100644 --- a/samples/Ark.MediatorFramework.Sample/README.md +++ b/samples/Ark.MediatorFramework.Sample/README.md @@ -85,7 +85,7 @@ Rebus client. Use a namespace with `DefaultAzureCredential` in managed environments, or a connection string from external configuration for local use. The Function process has no input queue, workers, subscriptions, handlers, or request/reply bus semantics; messages are consumed by the separate processor. -The anonymous readiness endpoint is `/api/v1/health`. +The anonymous readiness endpoint is `/healthCheck`. ## gRPC operations panel diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt index f210918b1..ea80e2e31 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt @@ -75,9 +75,11 @@ CONTRACT GreetingResponseV2 CONTRACT GreetingResponseV2.Id : Guid CONTRACT GreetingResponseV2.Message : string CONTRACT GreetingResponseV2.MessageLength : int -CONTRACT HealthCheckQuery -> HealthCheckResponse [group=Ark] [http=GET /health] [version=1+] +CONTRACT HealthCheckQuery -> HealthCheckResponse [group=Ark] [http=GET /healthCheck] [version=1+] CONTRACT HealthCheckResponse -CONTRACT HealthCheckResponse.Status : string default="ok" +CONTRACT HealthCheckResponse.Status : string default="Healthy" +CONTRACT HealthCheckResponse.TotalDuration : string default="00:00:00" +CONTRACT HealthCheckResponse.Entries : IReadOnlyDictionary CONTRACT PagedResult CONTRACT PagedResult.Count : long CONTRACT PagedResult.IsCountPartial : bool diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs index 418a3a2a1..025822d23 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs @@ -13,14 +13,21 @@ namespace Ark.MediatorFramework.Sample.Application; /// Returns the readiness state of an HTTP host. -[HttpEndpoint("GET", "/health", AllowAnonymous = true)] +[HttpEndpoint("GET", "/healthCheck", AllowAnonymous = true)] public sealed record HealthCheckQuery : IQuery; /// Readiness response returned by both HTTP hosts. public sealed record HealthCheckResponse { /// Gets the readiness state. - public string Status { get; init; } = "ok"; + public string Status { get; init; } = "Healthy"; + + /// Gets the health check duration. + public string TotalDuration { get; init; } = "00:00:00"; + + /// Gets the individual health check results. + public IReadOnlyDictionary Entries { get; init; } = + new Dictionary(StringComparer.Ordinal); } /// Response returned by the greeting operations. diff --git a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs index f66f7b55c..a7014ac46 100644 --- a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs +++ b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs @@ -36,10 +36,12 @@ public async Task HealthContractIsAvailableToFunctionHost() Assert.IsNotNull(attribute); Assert.IsTrue(attribute.AllowAnonymous); Assert.AreEqual("GET", attribute.Verb); - Assert.AreEqual("/health", attribute.Template); + Assert.AreEqual("/healthCheck", attribute.Template); var response = await new HealthCheckHandler().ExecuteAsync(new HealthCheckQuery()); - Assert.AreEqual("ok", response.Status); + Assert.AreEqual("Healthy", response.Status); + Assert.AreEqual("00:00:00", response.TotalDuration); + Assert.IsNotNull(response.Entries); } /// Rejects a Function host without its required outbound bus configuration. From 1139ba96908ad00fe7df63cd810fdea0a7dfd1c9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 17:24:59 +0000 Subject: [PATCH 05/16] accept health contract snapshot Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- .../Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt index ea80e2e31..cbedfc173 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt @@ -79,7 +79,7 @@ CONTRACT HealthCheckQuery -> HealthCheckResponse [group=Ark] [http=GET /healthCh CONTRACT HealthCheckResponse CONTRACT HealthCheckResponse.Status : string default="Healthy" CONTRACT HealthCheckResponse.TotalDuration : string default="00:00:00" -CONTRACT HealthCheckResponse.Entries : IReadOnlyDictionary +CONTRACT HealthCheckResponse.Entries : IReadOnlyDictionary default=new Dictionary(StringComparer.Ordinal) CONTRACT PagedResult CONTRACT PagedResult.Count : long CONTRACT PagedResult.IsCountPartial : bool From 7280caf6f111dc38706d2157801497de029f4abb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 17:27:32 +0000 Subject: [PATCH 06/16] use shared health middleware Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- samples/Ark.MediatorFramework.Sample/README.md | 2 +- .../ArkApiSurface.txt | 5 ----- .../GreetingContracts.cs | 3 +-- .../Ark.MediatorFramework.Sample.WebInterface.csproj | 1 + .../SampleStartup.cs | 3 +++ .../AzureFunctionsRebusTests.cs | 11 +---------- 6 files changed, 7 insertions(+), 18 deletions(-) diff --git a/samples/Ark.MediatorFramework.Sample/README.md b/samples/Ark.MediatorFramework.Sample/README.md index d37ec9219..5e8a64463 100644 --- a/samples/Ark.MediatorFramework.Sample/README.md +++ b/samples/Ark.MediatorFramework.Sample/README.md @@ -85,7 +85,7 @@ Rebus client. Use a namespace with `DefaultAzureCredential` in managed environments, or a connection string from external configuration for local use. The Function process has no input queue, workers, subscriptions, handlers, or request/reply bus semantics; messages are consumed by the separate processor. -The anonymous readiness endpoint is `/healthCheck`. +The anonymous readiness endpoint is `/healthCheck`, using the shared ASP.NET Core health check middleware. ## gRPC operations panel diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt index cbedfc173..75bb528f6 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ArkApiSurface.txt @@ -75,11 +75,6 @@ CONTRACT GreetingResponseV2 CONTRACT GreetingResponseV2.Id : Guid CONTRACT GreetingResponseV2.Message : string CONTRACT GreetingResponseV2.MessageLength : int -CONTRACT HealthCheckQuery -> HealthCheckResponse [group=Ark] [http=GET /healthCheck] [version=1+] -CONTRACT HealthCheckResponse -CONTRACT HealthCheckResponse.Status : string default="Healthy" -CONTRACT HealthCheckResponse.TotalDuration : string default="00:00:00" -CONTRACT HealthCheckResponse.Entries : IReadOnlyDictionary default=new Dictionary(StringComparer.Ordinal) CONTRACT PagedResult CONTRACT PagedResult.Count : long CONTRACT PagedResult.IsCountPartial : bool diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs index 025822d23..63619019d 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs @@ -12,8 +12,7 @@ namespace Ark.MediatorFramework.Sample.Application; -/// Returns the readiness state of an HTTP host. -[HttpEndpoint("GET", "/healthCheck", AllowAnonymous = true)] +/// Returns the readiness state of a function host. public sealed record HealthCheckQuery : IQuery; /// Readiness response returned by both HTTP hosts. diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/Ark.MediatorFramework.Sample.WebInterface.csproj b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/Ark.MediatorFramework.Sample.WebInterface.csproj index c03995bad..c3a38608c 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/Ark.MediatorFramework.Sample.WebInterface.csproj +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/Ark.MediatorFramework.Sample.WebInterface.csproj @@ -15,6 +15,7 @@ + diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/SampleStartup.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/SampleStartup.cs index 63a7665c9..972968f7e 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/SampleStartup.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/SampleStartup.cs @@ -7,6 +7,7 @@ using Ark.MediatorFramework.Sample.WebInterface.Auth; using Ark.Tools.AspNetCore.MessagePackFormatter; using Ark.Tools.AspNetCore.ProblemDetails; +using Ark.Tools.AspNetCore.HealthChecks; using Ark.Tools.MediatorFramework.Grpc; using Ark.Tools.MediatorFramework.MinimalApi; using Ark.Tools.Nodatime; @@ -142,6 +143,7 @@ public void ConfigureServices(IServiceCollection services) services.AddRouting(); services.AddControllers(); + services.AddArkHealthChecks(); var messagePackResolver = CompositeResolver.Create( MessagePack.NodaTime.NodatimeResolver.Instance, @@ -198,6 +200,7 @@ public void Configure(IApplicationBuilder app) // Source-generated endpoints for the selected [HttpEndpoint] contracts. endpoints.MapArkEndpointsFromAssembly( versionPrefix: "/api/v{version}"); + endpoints.MapArkHealthChecks().AllowAnonymous(); endpoints.MapArkGrpcServicesFromAssembly(); endpoints.MapGrpcService(); endpoints.MapCodeFirstGrpcReflectionService().AllowAnonymous(); diff --git a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs index a7014ac46..f50abd64b 100644 --- a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs +++ b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs @@ -25,19 +25,10 @@ namespace Ark.MediatorFramework.Sample.Tests; [TestClass] public sealed class AzureFunctionsRebusTests { - /// Verifies the shared anonymous readiness contract and handler. + /// Verifies the readiness handler used by the function host. [TestMethod] public async Task HealthContractIsAvailableToFunctionHost() { - var attribute = (Ark.MediatorFramework.HttpEndpointAttribute?)Attribute.GetCustomAttribute( - typeof(HealthCheckQuery), - typeof(Ark.MediatorFramework.HttpEndpointAttribute)); - - Assert.IsNotNull(attribute); - Assert.IsTrue(attribute.AllowAnonymous); - Assert.AreEqual("GET", attribute.Verb); - Assert.AreEqual("/healthCheck", attribute.Template); - var response = await new HealthCheckHandler().ExecuteAsync(new HealthCheckQuery()); Assert.AreEqual("Healthy", response.Status); Assert.AreEqual("00:00:00", response.TotalDuration); From 20ae0dc45c37a04d2c5661e33f86eb60986497cf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 17:28:46 +0000 Subject: [PATCH 07/16] fix health endpoint mapping Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- .../SampleStartup.cs | 2 +- .../packages.lock.json | 350 ++++++++++++++++- .../packages.lock.json | 359 +++++++++++++++++- 3 files changed, 700 insertions(+), 11 deletions(-) diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/SampleStartup.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/SampleStartup.cs index 972968f7e..d783ccf14 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/SampleStartup.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/SampleStartup.cs @@ -200,7 +200,7 @@ public void Configure(IApplicationBuilder app) // Source-generated endpoints for the selected [HttpEndpoint] contracts. endpoints.MapArkEndpointsFromAssembly( versionPrefix: "/api/v{version}"); - endpoints.MapArkHealthChecks().AllowAnonymous(); + endpoints.MapArkHealthChecks(); endpoints.MapArkGrpcServicesFromAssembly(); endpoints.MapGrpcService(); endpoints.MapCodeFirstGrpcReflectionService().AllowAnonymous(); diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/packages.lock.json b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/packages.lock.json index 14599053e..3d391954f 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/packages.lock.json +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/packages.lock.json @@ -94,6 +94,87 @@ "resolved": "10.2.3", "contentHash": "nthWONRs/FJ4yyG206g1cC52WEG8EqrjuMWjGdR+5XG7lbjFto6NqcI9EMICgVFom/UivIjUVwI76ZHbHwTPfQ==" }, + "AspNetCore.HealthChecks.AzureServiceBus": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "Uzml9qWAvN6xPJejdTLznx9SIczKs/exieiJCU0Kjivt4ZTcsLdE3u2g8HJr0VWhguQad2mpGkwXtQ9nWfkm4g==", + "dependencies": { + "Azure.Messaging.ServiceBus": "7.17.0" + } + }, + "AspNetCore.HealthChecks.Network": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "Lke7ksxhzZK8qZhSrmxnhdOHkKInzVIdGk7JBAnROQ6M66nuO9ja6ShC0osw83oE+GZazkO+F36gfwD8HlHrXA==", + "dependencies": { + "SSH.NET": "2023.0.0" + } + }, + "AspNetCore.HealthChecks.Oracle": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "q+vhCRPgxWviMtybuJMTXxM2GzA2/h2Cm+LJyafipxVV7iDCb8uTV41E8CZ6XFJhZfZ0VIEhzE3IAL2m4i+t7g==", + "dependencies": { + "Oracle.ManagedDataAccess.Core": "3.21.120" + } + }, + "AspNetCore.HealthChecks.Publisher.ApplicationInsights": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "v2GAyHPxJQIH8mBD5bF4GQXvYODMOOb30vaMTvv6ShXnqR2K0YSjZSAMdMc+WEBcjtUvv+1o+Mv+sf9Ho+wXWw==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0" + } + }, + "AspNetCore.HealthChecks.SqlServer": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "UxCf65iCF2nU1u7AcB320abjL4CRg5swCgJECY6mKk1j5lrGMfVtskWwriGs1T29pYdRig9Vra3SPnP+4G82pA==", + "dependencies": { + "Microsoft.Data.SqlClient": "5.2.2" + } + }, + "AspNetCore.HealthChecks.UI": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "r/bGIiFDm/Bv+S/OCcE1/YzM4Zul1nEKGRA42xcGqxaYmaQf1T+gFEReNNA+5nHXuXt5TRuBuVag1emXuwqe6w==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Data": "9.0.0", + "KubernetesClient": "15.0.1", + "Microsoft.EntityFrameworkCore.Design": "8.0.11" + } + }, + "AspNetCore.HealthChecks.UI.Client": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "1Ub3Wvvbz7CMuFNWgLEc9qqQibiMoovDML/WHrwr5J83RPgtI20giCR92s/ipLgu7IIuqw+W/y7WpIeHqAICxg==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Core": "9.0.0" + } + }, + "AspNetCore.HealthChecks.UI.Core": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "TVriy4hgYnhfqz6NAzv8qe62Q8wf82iKUL6WV9selqeFZTq1ILi39Sic6sFQegRysvAVcnxKP/vY8z9Fk8x6XQ==" + }, + "AspNetCore.HealthChecks.UI.Data": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "bZkXUdiqXOkmhe3XHF+OIgPQKR8OXS8/+iDWegmxSXtbaIYwsT5+B0URT+P4OPvhj5tR2goMMZe5KwJBVHr+1g==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Core": "9.0.0", + "Microsoft.EntityFrameworkCore": "8.0.0" + } + }, + "AspNetCore.HealthChecks.UI.InMemory.Storage": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "xuq+HBH8Ckz9r5d+yP1pk7cgIbPLBqCGfYu0MxtvbtsxIo7cv5nQoUCJsdgqN5/a4ndVUJZco6GjWFk6r4xN1w==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Data": "9.0.0", + "Microsoft.EntityFrameworkCore.InMemory": "8.0.11" + } + }, "Azure.Core": { "type": "Transitive", "resolved": "1.60.0", @@ -178,6 +259,11 @@ "resolved": "12.1.1", "contentHash": "EPpkIe1yh1a0OXyC100oOA8WMbZvqUu5plwhvYcb7oSELfyUZzfxV48BLhvs3kKo4NwG7MGLNgy1RJiYtT8Dpw==" }, + "Fractions": { + "type": "Transitive", + "resolved": "7.3.0", + "contentHash": "2bETFWLBc8b7Ut2SVi+bxhGVwiSpknHYGBh2PADyGWONLkTxT7bKyDRhF8ao+XUv90tq8Fl7GTPxSI5bacIRJw==" + }, "Grpc.AspNetCore.Server": { "type": "Transitive", "resolved": "2.66.0", @@ -213,6 +299,20 @@ "resolved": "6.5.1", "contentHash": "LgceF4mPguB/q3NWs6T3bitOFnYIANSRvfhASMgVb8ks7fSqY8jbdBHoVEuUDmxg3T7+kF21qSE0jQv9hdpLng==" }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" + }, + "KubernetesClient": { + "type": "Transitive", + "resolved": "19.0.2", + "contentHash": "0m8FuzCDBygaXMbsb7qVapNZzTm4ftM7ECp/waTRh/XOUQziRF2rKJCRmsvYbBXgJkQvU+FBbkoa40hexzDC+g==", + "dependencies": { + "Fractions": "7.3.0", + "YamlDotNet": "16.3.0" + } + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -381,6 +481,49 @@ "resolved": "10.0.2", "contentHash": "LG9Yll3B5aNpxv0+D47g6LiOiKBIlodhcHdQwcYzo8VeexFLGqx5ymetmA2aBRyo9cCcWsQWrFsdbsr8LvmWDw==" }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.3", + "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "System.Composition": "6.0.0" + } + }, "Microsoft.Data.SqlClient": { "type": "Transitive", "resolved": "7.0.2", @@ -415,6 +558,58 @@ "resolved": "6.0.2", "contentHash": "f+pRODTWX7Y67jXO3T5S2dIPZ9qMJNySjlZT/TKmWVNWe19N8jcWmHaqHnnchaq3gxEKv1SWVY5EFzOD06l41w==" }, + "Microsoft.EntityFrameworkCore": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "stbjWBTtpQ1HtqXMFyKnXFTr76PvaOHI2b2h85JqBi3eZr00nspvR/a90Zwh8CQ4rVawqLiTG0+0yZQWaav+sQ==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.11", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.11" + } + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "++zY0Ea724ku1jptWJmF7jm3I4IXTexfT4qi1ETcSFFF7qj+qm6rRgN7mTuKkwIETuXk0ikfzudryRjUGrrNKQ==" + }, + "Microsoft.EntityFrameworkCore.Analyzers": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "NI/AJQjtC7qgWM8Nr85sRkwlog2AnFer5RKP8xTUH0RuPF3nN0tGXBEeYJOLZWp+/+M/C6O7MMDRhKRE8bZwIA==" + }, + "Microsoft.EntityFrameworkCore.Design": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "KxOvpbaKiUmbLvenr0T/4F1Vdm0Sq+iajLbesQK7/WKB/Dx+FQHCZ0f5jCXrVWK2QKF9eHzQ5JPA1L6hcb25FQ==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.11", + "Microsoft.Extensions.DependencyModel": "8.0.2", + "Mono.TextTemplating": "2.2.1" + } + }, + "Microsoft.EntityFrameworkCore.InMemory": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "gFFdubZlRfudSw94OxO7s8OvLQZncnR0S1ll//wRtZP3mMYVeq8DrMnEILK6hBJwbTBB1SNm3apg9SdvdE/ySg==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "8.0.11" + } + }, + "Microsoft.EntityFrameworkCore.Relational": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "3TuuW3i5I4Ro0yoaHmi2MqEDGObOVuhLaMEnd/heaLB1fcvm4fu4PevmC4BOWnI0vo176AIlV5o4rEQciLoohw==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "8.0.11" + } + }, + "Microsoft.Extensions.DependencyModel": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" + }, "Microsoft.Extensions.Logging.ApplicationInsights": { "type": "Transitive", "resolved": "2.23.0", @@ -550,6 +745,11 @@ "resolved": "1.0.0", "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==" + }, "MimeKit": { "type": "Transitive", "resolved": "4.17.0", @@ -559,6 +759,14 @@ "System.Security.Cryptography.Pkcs": "10.0.0" } }, + "Mono.TextTemplating": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", + "dependencies": { + "System.CodeDom": "4.4.0" + } + }, "morelinq": { "type": "Transitive", "resolved": "4.4.0", @@ -629,6 +837,16 @@ "NodaTime": "[3.0.0, 4.0.0)" } }, + "Oracle.ManagedDataAccess.Core": { + "type": "Transitive", + "resolved": "3.21.120", + "contentHash": "RrSu5ZlhIqpV7mFauPfc2AkCsuWXA2cWCNXOBW+Wt7R8g6wqonWIWZN3iyhwr4mZMRrClJB/SRMtQzQMHuZPmg==", + "dependencies": { + "System.Diagnostics.PerformanceCounter": "6.0.1", + "System.DirectoryServices": "6.0.1", + "System.DirectoryServices.Protocols": "6.0.2" + } + }, "Polly.Core": { "type": "Transitive", "resolved": "8.7.0", @@ -787,6 +1005,19 @@ "Newtonsoft.Json": "13.0.4" } }, + "SSH.NET": { + "type": "Transitive", + "resolved": "2023.0.0", + "contentHash": "g+3VDUrYhm0sqSxmlQFgRFrmBxhQvVh4pfn4pqjkX7WXE3tTjt1tIsOtjuz3mz/5s8gFFQVRydwCJ7Ohs54sJA==", + "dependencies": { + "SshNet.Security.Cryptography": "[1.3.0]" + } + }, + "SshNet.Security.Cryptography": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "5pBIXRjcSO/amY8WztpmNOhaaCNHY/B6CcYDI7FSTgqSyo/ZUojlLiKcsl+YGbxQuLX439qIkMfP0PHqxqJi/Q==" + }, "System.ClientModel": { "type": "Transitive", "resolved": "1.14.0", @@ -795,6 +1026,59 @@ "System.Memory.Data": "10.0.3" } }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" + }, + "System.Composition": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Convention": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0", + "System.Composition.TypedParts": "6.0.0" + } + }, + "System.Composition.AttributedModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" + }, + "System.Composition.Convention": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0" + } + }, + "System.Composition.Hosting": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", + "dependencies": { + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Composition.Runtime": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" + }, + "System.Composition.TypedParts": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0" + } + }, "System.Configuration.ConfigurationManager": { "type": "Transitive", "resolved": "9.0.13", @@ -805,12 +1089,33 @@ }, "System.Diagnostics.PerformanceCounter": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "gbeE5tNp/oB7O8kTTLh3wPPJCxpNOphXPTWVs1BsYuFOYapFijWuh0LYw1qnDo4gwDUYPXOmpTIhvtxisGsYOQ==", + "resolved": "6.0.1", + "contentHash": "dDl7Gx3bmSrM2k2ZIm+ucEJnLloZRyvfQF1DvfvATcGF3jtaUBiPvChma+6ZcZzxWMirN3kCywkW7PILphXyMQ==", "dependencies": { "System.Configuration.ConfigurationManager": "6.0.0" } }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "935IbO7h5FDGYxeO3cbx/CuvBBuk/VI8sENlfmXlh1pupNOB3LAGzdYdPY8CawGJFP7KNrHK5eUlsFoz3F6cuA==", + "dependencies": { + "System.Security.Permissions": "6.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "vDDPWwHn3/DNZ+kPkdXHoada+tKPEC9bVqDOr4hK6HBSP7hGCUTA0Zw6WU5qpGaqa5M1/V+axHMIv+DNEbIf6g==" + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==", + "dependencies": { + "Microsoft.Win32.SystemEvents": "6.0.0" + } + }, "System.IO.FileSystem.AccessControl": { "type": "Transitive", "resolved": "4.7.0", @@ -836,11 +1141,32 @@ "resolved": "9.0.13", "contentHash": "t8S9IDpjJKsLpLkeBdW8cWtcPyYqrGu93Dej1RO6WwuL/lkFSqWlan3rMJfortqz1mRIh+sys2AFsSA6jWJ3Jg==" }, + "System.Security.Permissions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", + "dependencies": { + "System.Windows.Extensions": "6.0.0" + } + }, "System.ServiceModel.Primitives": { "type": "Transitive", "resolved": "10.0.652802", "contentHash": "ULfGNl75BNXkpF42wNV2CDXJ64dUZZEa8xO2mBsc4tqbW9QjruxjEB6bAr4Z/T1rNU+leOztIjCJQYsBGFWYlw==" }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==", + "dependencies": { + "System.Drawing.Common": "6.0.0" + } + }, + "YamlDotNet": { + "type": "Transitive", + "resolved": "16.3.0", + "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" + }, "ark.mediatorframework.sample.application": { "type": "Project", "dependencies": { @@ -891,6 +1217,26 @@ "Microsoft.ApplicationInsights.AspNetCore": "[2.23.0, )" } }, + "ark.tools.aspnetcore.healthchecks": { + "type": "Project", + "dependencies": { + "Ark.Tools.Core": "[1.0.0, )", + "Ark.Tools.SimpleInjector": "[1.0.0, )", + "Ark.Tools.SystemTextJson": "[1.0.0, )", + "AspNetCore.HealthChecks.AzureServiceBus": "[9.0.0, )", + "AspNetCore.HealthChecks.Network": "[9.0.0, )", + "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", + "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", + "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", + "AspNetCore.HealthChecks.UI": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", + "Azure.Identity": "[1.21.0, )", + "Azure.Messaging.ServiceBus": "[7.20.2, )", + "KubernetesClient": "[19.0.2, )", + "Microsoft.ApplicationInsights": "[2.23.0, )" + } + }, "ark.tools.aspnetcore.messagepack": { "type": "Project", "dependencies": { diff --git a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json index 2b5b098e6..290e44d09 100644 --- a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json +++ b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json @@ -211,6 +211,96 @@ "resolved": "3.3.4", "contentHash": "atTwejJRcKgUcJCofp4uSPKNXBav6ZITHtuD6dhByg1ubyVJirjz5TkcVCR9oFnHAEbZvOdd4cYCJNPO9rSAsQ==" }, + "AspNetCore.HealthChecks.AzureServiceBus": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "Uzml9qWAvN6xPJejdTLznx9SIczKs/exieiJCU0Kjivt4ZTcsLdE3u2g8HJr0VWhguQad2mpGkwXtQ9nWfkm4g==", + "dependencies": { + "Azure.Messaging.ServiceBus": "7.17.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, + "AspNetCore.HealthChecks.Network": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "Lke7ksxhzZK8qZhSrmxnhdOHkKInzVIdGk7JBAnROQ6M66nuO9ja6ShC0osw83oE+GZazkO+F36gfwD8HlHrXA==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "SSH.NET": "2023.0.0" + } + }, + "AspNetCore.HealthChecks.Oracle": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "q+vhCRPgxWviMtybuJMTXxM2GzA2/h2Cm+LJyafipxVV7iDCb8uTV41E8CZ6XFJhZfZ0VIEhzE3IAL2m4i+t7g==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "Oracle.ManagedDataAccess.Core": "3.21.120" + } + }, + "AspNetCore.HealthChecks.Publisher.ApplicationInsights": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "v2GAyHPxJQIH8mBD5bF4GQXvYODMOOb30vaMTvv6ShXnqR2K0YSjZSAMdMc+WEBcjtUvv+1o+Mv+sf9Ho+wXWw==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, + "AspNetCore.HealthChecks.SqlServer": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "UxCf65iCF2nU1u7AcB320abjL4CRg5swCgJECY6mKk1j5lrGMfVtskWwriGs1T29pYdRig9Vra3SPnP+4G82pA==", + "dependencies": { + "Microsoft.Data.SqlClient": "5.2.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, + "AspNetCore.HealthChecks.UI": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "r/bGIiFDm/Bv+S/OCcE1/YzM4Zul1nEKGRA42xcGqxaYmaQf1T+gFEReNNA+5nHXuXt5TRuBuVag1emXuwqe6w==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Data": "9.0.0", + "KubernetesClient": "15.0.1", + "Microsoft.EntityFrameworkCore.Design": "8.0.11", + "Microsoft.Extensions.Http": "8.0.0" + } + }, + "AspNetCore.HealthChecks.UI.Client": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "1Ub3Wvvbz7CMuFNWgLEc9qqQibiMoovDML/WHrwr5J83RPgtI20giCR92s/ipLgu7IIuqw+W/y7WpIeHqAICxg==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Core": "9.0.0" + } + }, + "AspNetCore.HealthChecks.UI.Core": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "TVriy4hgYnhfqz6NAzv8qe62Q8wf82iKUL6WV9selqeFZTq1ILi39Sic6sFQegRysvAVcnxKP/vY8z9Fk8x6XQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, + "AspNetCore.HealthChecks.UI.Data": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "bZkXUdiqXOkmhe3XHF+OIgPQKR8OXS8/+iDWegmxSXtbaIYwsT5+B0URT+P4OPvhj5tR2goMMZe5KwJBVHr+1g==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Core": "9.0.0", + "Microsoft.EntityFrameworkCore": "8.0.0" + } + }, + "AspNetCore.HealthChecks.UI.InMemory.Storage": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "xuq+HBH8Ckz9r5d+yP1pk7cgIbPLBqCGfYu0MxtvbtsxIo7cv5nQoUCJsdgqN5/a4ndVUJZco6GjWFk6r4xN1w==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Data": "9.0.0", + "Microsoft.EntityFrameworkCore.InMemory": "8.0.11" + } + }, "Azure.Core": { "type": "Transitive", "resolved": "1.60.0", @@ -315,6 +405,11 @@ "resolved": "12.1.1", "contentHash": "EPpkIe1yh1a0OXyC100oOA8WMbZvqUu5plwhvYcb7oSELfyUZzfxV48BLhvs3kKo4NwG7MGLNgy1RJiYtT8Dpw==" }, + "Fractions": { + "type": "Transitive", + "resolved": "7.3.0", + "contentHash": "2bETFWLBc8b7Ut2SVi+bxhGVwiSpknHYGBh2PADyGWONLkTxT7bKyDRhF8ao+XUv90tq8Fl7GTPxSI5bacIRJw==" + }, "Gherkin": { "type": "Transitive", "resolved": "35.0.0", @@ -367,6 +462,20 @@ "resolved": "6.5.1", "contentHash": "LgceF4mPguB/q3NWs6T3bitOFnYIANSRvfhASMgVb8ks7fSqY8jbdBHoVEuUDmxg3T7+kF21qSE0jQv9hdpLng==" }, + "Humanizer.Core": { + "type": "Transitive", + "resolved": "2.14.1", + "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" + }, + "KubernetesClient": { + "type": "Transitive", + "resolved": "19.0.2", + "contentHash": "0m8FuzCDBygaXMbsb7qVapNZzTm4ftM7ECp/waTRh/XOUQziRF2rKJCRmsvYbBXgJkQvU+FBbkoa40hexzDC+g==", + "dependencies": { + "Fractions": "7.3.0", + "YamlDotNet": "16.3.0" + } + }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -707,6 +816,49 @@ "Microsoft.Build.Framework": "15.9.20" } }, + "Microsoft.CodeAnalysis.Analyzers": { + "type": "Transitive", + "resolved": "3.3.3", + "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" + }, + "Microsoft.CodeAnalysis.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "3.3.3" + } + }, + "Microsoft.CodeAnalysis.CSharp": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", + "dependencies": { + "Microsoft.CodeAnalysis.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.CSharp.Workspaces": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" + } + }, + "Microsoft.CodeAnalysis.Workspaces.Common": { + "type": "Transitive", + "resolved": "4.5.0", + "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.Bcl.AsyncInterfaces": "6.0.0", + "Microsoft.CodeAnalysis.Common": "[4.5.0]", + "System.Composition": "6.0.0" + } + }, "Microsoft.CodeCoverage": { "type": "Transitive", "resolved": "18.8.1", @@ -760,6 +912,56 @@ "resolved": "2.2.9", "contentHash": "WLbDc/W9XkHpGVtd1L6Vml8W6+PaaYZZTJASHjHF7W2WX/hld6bfNK102Ui+I3a6zIdx4+oKRJtMgHz44JmBfw==" }, + "Microsoft.EntityFrameworkCore": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "stbjWBTtpQ1HtqXMFyKnXFTr76PvaOHI2b2h85JqBi3eZr00nspvR/a90Zwh8CQ4rVawqLiTG0+0yZQWaav+sQ==", + "dependencies": { + "Microsoft.EntityFrameworkCore.Abstractions": "8.0.11", + "Microsoft.EntityFrameworkCore.Analyzers": "8.0.11", + "Microsoft.Extensions.Caching.Memory": "8.0.1", + "Microsoft.Extensions.Logging": "8.0.1" + } + }, + "Microsoft.EntityFrameworkCore.Abstractions": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "++zY0Ea724ku1jptWJmF7jm3I4IXTexfT4qi1ETcSFFF7qj+qm6rRgN7mTuKkwIETuXk0ikfzudryRjUGrrNKQ==" + }, + "Microsoft.EntityFrameworkCore.Analyzers": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "NI/AJQjtC7qgWM8Nr85sRkwlog2AnFer5RKP8xTUH0RuPF3nN0tGXBEeYJOLZWp+/+M/C6O7MMDRhKRE8bZwIA==" + }, + "Microsoft.EntityFrameworkCore.Design": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "KxOvpbaKiUmbLvenr0T/4F1Vdm0Sq+iajLbesQK7/WKB/Dx+FQHCZ0f5jCXrVWK2QKF9eHzQ5JPA1L6hcb25FQ==", + "dependencies": { + "Humanizer.Core": "2.14.1", + "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", + "Microsoft.EntityFrameworkCore.Relational": "8.0.11", + "Microsoft.Extensions.DependencyModel": "8.0.2", + "Mono.TextTemplating": "2.2.1" + } + }, + "Microsoft.EntityFrameworkCore.InMemory": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "gFFdubZlRfudSw94OxO7s8OvLQZncnR0S1ll//wRtZP3mMYVeq8DrMnEILK6hBJwbTBB1SNm3apg9SdvdE/ySg==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "8.0.11" + } + }, + "Microsoft.EntityFrameworkCore.Relational": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "3TuuW3i5I4Ro0yoaHmi2MqEDGObOVuhLaMEnd/heaLB1fcvm4fu4PevmC4BOWnI0vo176AIlV5o4rEQciLoohw==", + "dependencies": { + "Microsoft.EntityFrameworkCore": "8.0.11", + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" + } + }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", "resolved": "10.0.0", @@ -895,6 +1097,22 @@ "Microsoft.Extensions.Options": "10.0.10" } }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "zLgN22Zp9pk8RHlwssRTexw4+a6wqOnKWN+VejdPn5Yhjql4XiBhkFo35Nu8mmqHIk/UEmmCnMGLWq75aFfkOw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.11", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "So3JUdRxozRjvQ3cxU6F3nI/i4emDnjane6yMYcJhvTTTu29ltlIdoXjkFGRceIWz8yKvuEpzXItZ0x5GvN2nQ==" + }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", "resolved": "10.0.10", @@ -961,13 +1179,15 @@ }, "Microsoft.Extensions.Http": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", + "resolved": "8.0.0", + "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", + "Microsoft.Extensions.Diagnostics": "8.0.0", + "Microsoft.Extensions.Logging": "8.0.0", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.Extensions.Options": "8.0.0" } }, "Microsoft.Extensions.Localization.Abstractions": { @@ -1308,6 +1528,14 @@ "System.Security.Cryptography.Pkcs": "10.0.0" } }, + "Mono.TextTemplating": { + "type": "Transitive", + "resolved": "2.2.1", + "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", + "dependencies": { + "System.CodeDom": "4.4.0" + } + }, "morelinq": { "type": "Transitive", "resolved": "4.4.0", @@ -1380,6 +1608,16 @@ "NodaTime": "[3.0.0, 4.0.0)" } }, + "Oracle.ManagedDataAccess.Core": { + "type": "Transitive", + "resolved": "3.21.120", + "contentHash": "RrSu5ZlhIqpV7mFauPfc2AkCsuWXA2cWCNXOBW+Wt7R8g6wqonWIWZN3iyhwr4mZMRrClJB/SRMtQzQMHuZPmg==", + "dependencies": { + "System.Diagnostics.PerformanceCounter": "6.0.1", + "System.DirectoryServices": "6.0.1", + "System.DirectoryServices.Protocols": "6.0.2" + } + }, "Polly.Core": { "type": "Transitive", "resolved": "8.7.0", @@ -1557,6 +1795,19 @@ "Newtonsoft.Json": "13.0.4" } }, + "SSH.NET": { + "type": "Transitive", + "resolved": "2023.0.0", + "contentHash": "g+3VDUrYhm0sqSxmlQFgRFrmBxhQvVh4pfn4pqjkX7WXE3tTjt1tIsOtjuz3mz/5s8gFFQVRydwCJ7Ohs54sJA==", + "dependencies": { + "SshNet.Security.Cryptography": "[1.3.0]" + } + }, + "SshNet.Security.Cryptography": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "5pBIXRjcSO/amY8WztpmNOhaaCNHY/B6CcYDI7FSTgqSyo/ZUojlLiKcsl+YGbxQuLX439qIkMfP0PHqxqJi/Q==" + }, "System.ClientModel": { "type": "Transitive", "resolved": "1.14.0", @@ -1568,11 +1819,64 @@ "System.Memory.Data": "10.0.3" } }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "4.4.0", + "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" + }, "System.ComponentModel.Composition": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "bGhUX5BTivJ9Wax0qnJy7uGq7dn/TQkEpJ2Fpu1etg8dbPwyDkUzNPc1d3I2/jUr9y4wDI3a1dkSmi8X21Pzbw==" }, + "System.Composition": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Convention": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0", + "System.Composition.TypedParts": "6.0.0" + } + }, + "System.Composition.AttributedModel": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" + }, + "System.Composition.Convention": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0" + } + }, + "System.Composition.Hosting": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", + "dependencies": { + "System.Composition.Runtime": "6.0.0" + } + }, + "System.Composition.Runtime": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" + }, + "System.Composition.TypedParts": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", + "dependencies": { + "System.Composition.AttributedModel": "6.0.0", + "System.Composition.Hosting": "6.0.0", + "System.Composition.Runtime": "6.0.0" + } + }, "System.Configuration.ConfigurationManager": { "type": "Transitive", "resolved": "9.0.13", @@ -1589,12 +1893,25 @@ }, "System.Diagnostics.PerformanceCounter": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "gbeE5tNp/oB7O8kTTLh3wPPJCxpNOphXPTWVs1BsYuFOYapFijWuh0LYw1qnDo4gwDUYPXOmpTIhvtxisGsYOQ==", + "resolved": "6.0.1", + "contentHash": "dDl7Gx3bmSrM2k2ZIm+ucEJnLloZRyvfQF1DvfvATcGF3jtaUBiPvChma+6ZcZzxWMirN3kCywkW7PILphXyMQ==", "dependencies": { "System.Configuration.ConfigurationManager": "6.0.0" } }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "935IbO7h5FDGYxeO3cbx/CuvBBuk/VI8sENlfmXlh1pupNOB3LAGzdYdPY8CawGJFP7KNrHK5eUlsFoz3F6cuA==", + "dependencies": { + "System.Security.Permissions": "6.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "vDDPWwHn3/DNZ+kPkdXHoada+tKPEC9bVqDOr4hK6HBSP7hGCUTA0Zw6WU5qpGaqa5M1/V+axHMIv+DNEbIf6g==" + }, "System.IO.FileSystem.AccessControl": { "type": "Transitive", "resolved": "4.7.0", @@ -1655,6 +1972,11 @@ "resolved": "8.0.0", "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" }, + "YamlDotNet": { + "type": "Transitive", + "resolved": "16.3.0", + "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" + }, "ark.mediatorframework.sample.application": { "type": "Project", "dependencies": { @@ -1713,6 +2035,7 @@ "Ark.MediatorFramework.Sample.Application": "[0.9.1, )", "Ark.MediatorFramework.Sample.RebusProcessor": "[0.9.1, )", "Ark.Tools.AspNetCore.ApplicationInsights": "[1.0.0, )", + "Ark.Tools.AspNetCore.HealthChecks": "[1.0.0, )", "Ark.Tools.AspNetCore.MessagePack": "[1.0.0, )", "Ark.Tools.MediatorFramework.Grpc": "[1.0.0, )", "Ark.Tools.MediatorFramework.MinimalApi": "[1.0.0, )", @@ -1744,6 +2067,26 @@ "Microsoft.ApplicationInsights.AspNetCore": "[2.23.0, )" } }, + "ark.tools.aspnetcore.healthchecks": { + "type": "Project", + "dependencies": { + "Ark.Tools.Core": "[1.0.0, )", + "Ark.Tools.SimpleInjector": "[1.0.0, )", + "Ark.Tools.SystemTextJson": "[1.0.0, )", + "AspNetCore.HealthChecks.AzureServiceBus": "[9.0.0, )", + "AspNetCore.HealthChecks.Network": "[9.0.0, )", + "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", + "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", + "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", + "AspNetCore.HealthChecks.UI": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", + "Azure.Identity": "[1.21.0, )", + "Azure.Messaging.ServiceBus": "[7.20.2, )", + "KubernetesClient": "[19.0.2, )", + "Microsoft.ApplicationInsights": "[2.23.0, )" + } + }, "ark.tools.aspnetcore.messagepack": { "type": "Project", "dependencies": { From bdd608772701cc807d69cdc201fa3f68da10ea43 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 18:40:53 +0000 Subject: [PATCH 08/16] fix(mediator): remove redundant health contract Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- .../ApplicationComposition.cs | 1 - .../GreetingContracts.cs | 17 ----------------- .../GreetingHandlers.cs | 14 -------------- .../AzureFunctionsRebusTests.cs | 10 ---------- 4 files changed, 42 deletions(-) diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ApplicationComposition.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ApplicationComposition.cs index 1d8aa5fbd..920230c05 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ApplicationComposition.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/ApplicationComposition.cs @@ -156,7 +156,6 @@ public static void Register( container.Register, CompleteGreetingCompositionHandler>(); container.Register, GetGreetingHandler>(); container.Register, GetGreetingV2Handler>(); - container.Register, HealthCheckHandler>(); container.Register>, GetAuditsHandler>(); container.Register, SearchGreetingsHandler>(); container.Register>, GetGreetingsStreamHandler>(); diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs index 63619019d..0f2d7107a 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingContracts.cs @@ -12,23 +12,6 @@ namespace Ark.MediatorFramework.Sample.Application; -/// Returns the readiness state of a function host. -public sealed record HealthCheckQuery : IQuery; - -/// Readiness response returned by both HTTP hosts. -public sealed record HealthCheckResponse -{ - /// Gets the readiness state. - public string Status { get; init; } = "Healthy"; - - /// Gets the health check duration. - public string TotalDuration { get; init; } = "00:00:00"; - - /// Gets the individual health check results. - public IReadOnlyDictionary Entries { get; init; } = - new Dictionary(StringComparer.Ordinal); -} - /// Response returned by the greeting operations. [ProtoContract] [MessagePackObject(true)] diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingHandlers.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingHandlers.cs index 092f1ce64..736ebb2ac 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingHandlers.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.Application/GreetingHandlers.cs @@ -16,20 +16,6 @@ namespace Ark.MediatorFramework.Sample.Application; -/// Handles the anonymous host readiness query. -public sealed class HealthCheckHandler : IQueryHandler -{ - /// - public async Task ExecuteAsync( - HealthCheckQuery query, - CancellationToken ctk = default) - { - ArgumentNullException.ThrowIfNull(query); - await Task.CompletedTask.ConfigureAwait(false); - return new HealthCheckResponse(); - } -} - /// Handles the synchronous refresh command. public sealed class RefreshGreetingHandler : ICommandHandler { diff --git a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs index f50abd64b..ffcc56971 100644 --- a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs +++ b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/AzureFunctionsRebusTests.cs @@ -25,16 +25,6 @@ namespace Ark.MediatorFramework.Sample.Tests; [TestClass] public sealed class AzureFunctionsRebusTests { - /// Verifies the readiness handler used by the function host. - [TestMethod] - public async Task HealthContractIsAvailableToFunctionHost() - { - var response = await new HealthCheckHandler().ExecuteAsync(new HealthCheckQuery()); - Assert.AreEqual("Healthy", response.Status); - Assert.AreEqual("00:00:00", response.TotalDuration); - Assert.IsNotNull(response.Entries); - } - /// Rejects a Function host without its required outbound bus configuration. [TestMethod] public void MissingOutboundBusConfigurationFailsClearly() From 9b7882a2d46cb0d9d44044dac2c988831c88b88a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 3 Aug 2026 19:01:33 +0000 Subject: [PATCH 09/16] docs(mediator): remove incorrect healthCheck claim from Azure Functions section Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- samples/Ark.MediatorFramework.Sample/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/samples/Ark.MediatorFramework.Sample/README.md b/samples/Ark.MediatorFramework.Sample/README.md index 5e8a64463..9209214e5 100644 --- a/samples/Ark.MediatorFramework.Sample/README.md +++ b/samples/Ark.MediatorFramework.Sample/README.md @@ -85,7 +85,6 @@ Rebus client. Use a namespace with `DefaultAzureCredential` in managed environments, or a connection string from external configuration for local use. The Function process has no input queue, workers, subscriptions, handlers, or request/reply bus semantics; messages are consumed by the separate processor. -The anonymous readiness endpoint is `/healthCheck`, using the shared ASP.NET Core health check middleware. ## gRPC operations panel From 6470099f57a3dcfd0a4e1af494e86d8674bf9588 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 4 Aug 2026 06:23:16 +0000 Subject: [PATCH 10/16] feat(mediator): add functions health endpoint Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- .../Ark.MediatorFramework.Sample/README.md | 2 ++ .../AzureFunctionsEndpointGenerator.cs | 16 ++++++++++--- .../ArkAzureFunctionsHttp.cs | 17 ++++++++++++++ ...ureFunctionsServiceCollectionExtensions.cs | 1 + .../AzureFunctionsHttpTests.cs | 23 +++++++++++++++++++ .../GeneratorSnapshotTests.cs | 17 ++++++++++++++ 6 files changed, 73 insertions(+), 3 deletions(-) diff --git a/samples/Ark.MediatorFramework.Sample/README.md b/samples/Ark.MediatorFramework.Sample/README.md index 9209214e5..0a8a7d46e 100644 --- a/samples/Ark.MediatorFramework.Sample/README.md +++ b/samples/Ark.MediatorFramework.Sample/README.md @@ -85,6 +85,8 @@ Rebus client. Use a namespace with `DefaultAzureCredential` in managed environments, or a connection string from external configuration for local use. The Function process has no input queue, workers, subscriptions, handlers, or request/reply bus semantics; messages are consumed by the separate processor. +The generated anonymous `GET /healthCheck` endpoint executes the registered +health checks. ## gRPC operations panel diff --git a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions.Generators/AzureFunctionsEndpointGenerator.cs b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions.Generators/AzureFunctionsEndpointGenerator.cs index a194b99ca..72988c53b 100644 --- a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions.Generators/AzureFunctionsEndpointGenerator.cs +++ b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions.Generators/AzureFunctionsEndpointGenerator.cs @@ -169,9 +169,6 @@ private static void Emit( valid.Add(endpoint); } - if (valid.Count == 0) - return; - var source = new StringBuilder(); source.AppendLine("// "); source.AppendLine("namespace Ark.MediatorFramework.AzureFunctions.Generated;"); @@ -182,6 +179,7 @@ private static void Emit( { EmitFunction(source, endpoint); } + EmitHealthCheckFunction(source); source.AppendLine("}"); context.AddSource("ArkGeneratedFunctions.g.cs", source.ToString()); } @@ -358,6 +356,18 @@ private static void EmitFunction(StringBuilder source, Endpoint endpoint) source.AppendLine(" }"); } + private static void EmitHealthCheckFunction(StringBuilder source) + { + source.AppendLine(" [global::Microsoft.Azure.Functions.Worker.Function(\"ArkHealthCheck\")]"); + source.AppendLine(" public static async global::System.Threading.Tasks.Task ArkHealthCheck("); + source.AppendLine(" [global::Microsoft.Azure.Functions.Worker.HttpTrigger(global::Microsoft.Azure.Functions.Worker.AuthorizationLevel.Anonymous, \"get\", Route = \"healthCheck\")] global::Microsoft.AspNetCore.Http.HttpRequest request,"); + source.AppendLine(" global::System.Threading.CancellationToken cancellationToken)"); + source.AppendLine(" {"); + source.AppendLine(" var healthChecks = global::Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(request.HttpContext.RequestServices);"); + source.AppendLine(" return await global::Ark.MediatorFramework.AzureFunctions.ArkAzureFunctionsHttp.CheckHealthAsync(healthChecks, cancellationToken).ConfigureAwait(false);"); + source.AppendLine(" }"); + } + private static void EmitResponse(StringBuilder source, Endpoint endpoint) { if (endpoint.ResponseType == "global::Ark.MediatorFramework.IArkAttachment") diff --git a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsHttp.cs b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsHttp.cs index 52c9499d4..4f66b5029 100644 --- a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsHttp.cs +++ b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsHttp.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. See LICENSE file for license information. using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Diagnostics.HealthChecks; namespace Ark.MediatorFramework.AzureFunctions; @@ -84,4 +85,20 @@ public static async Task WriteJsonStreamAsync( items, cancellationToken: cancellationToken).ConfigureAwait(false); } + + /// Executes registered health checks and returns their HTTP status result. + /// The health-check service. + /// The invocation cancellation token. + /// An HTTP result representing the health-check status. + public static async Task CheckHealthAsync( + HealthCheckService healthChecks, + CancellationToken cancellationToken) + { + ArgumentNullException.ThrowIfNull(healthChecks); + + var report = await healthChecks.CheckHealthAsync(cancellationToken).ConfigureAwait(false); + return Results.StatusCode(report.Status == HealthStatus.Healthy + ? StatusCodes.Status200OK + : StatusCodes.Status503ServiceUnavailable); + } } diff --git a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsServiceCollectionExtensions.cs b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsServiceCollectionExtensions.cs index 9f2e6c71a..d0f0c7ba3 100644 --- a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsServiceCollectionExtensions.cs +++ b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsServiceCollectionExtensions.cs @@ -111,6 +111,7 @@ public static IServiceCollection AddArkAzureFunctions( options.SerializerOptions.TypeInfoResolver = resolver; }); + services.AddHealthChecks(); return services; } diff --git a/tests/Ark.Tools.MediatorFramework.Tests/AzureFunctionsHttpTests.cs b/tests/Ark.Tools.MediatorFramework.Tests/AzureFunctionsHttpTests.cs index 666f829d5..833cbb9ff 100644 --- a/tests/Ark.Tools.MediatorFramework.Tests/AzureFunctionsHttpTests.cs +++ b/tests/Ark.Tools.MediatorFramework.Tests/AzureFunctionsHttpTests.cs @@ -6,6 +6,8 @@ using AwesomeAssertions; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; namespace Ark.Tools.MediatorFramework.Tests; @@ -54,6 +56,27 @@ await ArkAzureFunctionsHttp.WriteJsonStreamAsync( (await reader.ReadToEndAsync(CancellationToken.None)).Should().Be("[1,2]"); } + [TestMethod] + public async Task HealthCheckUsesRegisteredService() + { + var services = new ServiceCollection(); + services.AddLogging(); + services.AddArkAzureFunctions(); + await using var provider = services.BuildServiceProvider(); + var context = new DefaultHttpContext + { + RequestServices = provider, + }; + + var result = await ArkAzureFunctionsHttp.CheckHealthAsync( + provider.GetRequiredService(), + CancellationToken.None); + + await result.ExecuteAsync(context); + + context.Response.StatusCode.Should().Be(StatusCodes.Status200OK); + } + private static async IAsyncEnumerable Values() { yield return 1; diff --git a/tests/Ark.Tools.MediatorFramework.Tests/GeneratorSnapshotTests.cs b/tests/Ark.Tools.MediatorFramework.Tests/GeneratorSnapshotTests.cs index 0b59e6568..58c68f9dc 100644 --- a/tests/Ark.Tools.MediatorFramework.Tests/GeneratorSnapshotTests.cs +++ b/tests/Ark.Tools.MediatorFramework.Tests/GeneratorSnapshotTests.cs @@ -157,6 +157,23 @@ public sealed class GetGreeting : IQuery { } || diagnostic.Id == "ARKMF032"); } + [TestMethod] + public void AzureFunctionsGeneratorEmitsAnonymousHealthCheck() + { + var result = RunGeneratorResult( + """ + using Ark.MediatorFramework; + [assembly: Ark.MediatorFramework.HttpHost(typeof(ContractMarker), "/api")] + public sealed class ContractMarker { } + """); + + result.Generated.Should().Contain("Function(\"ArkHealthCheck\")"); + result.Generated.Should().Contain( + "AuthorizationLevel.Anonymous, \"get\", Route = \"healthCheck\""); + result.Generated.Should().Contain("HealthCheckService>(request.HttpContext.RequestServices)"); + result.Generated.Should().Contain("ArkAzureFunctionsHttp.CheckHealthAsync"); + } + [TestMethod] public void AzureFunctionsGeneratorEmitsRouteBindingWithTryConvertSafe() { From 63667059a5db2b500f957aa2a9a2f712a537498c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 4 Aug 2026 07:04:18 +0000 Subject: [PATCH 11/16] fix(mediator): align health check responses Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- .../ArkHealthCheckExtension.cs | 4 +- .../ArkHealthCheckResponseWriter.cs | 109 ++++++++++++++++++ ...ls.MediatorFramework.AzureFunctions.csproj | 1 + .../ArkAzureFunctionsHttp.cs | 32 ++++- .../AzureFunctionsHttpTests.cs | 43 +++++++ 5 files changed, 184 insertions(+), 5 deletions(-) create mode 100644 src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckResponseWriter.cs diff --git a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckExtension.cs b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckExtension.cs index d76b72e14..8021ce94b 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckExtension.cs +++ b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckExtension.cs @@ -1,6 +1,5 @@ using HealthChecks.Network; using HealthChecks.Network.Core; -using HealthChecks.UI.Client; using HealthChecks.UI.Configuration; using Microsoft.AspNetCore.Builder; @@ -14,6 +13,7 @@ namespace Ark.Tools.AspNetCore.HealthChecks; + public static class ArkHealthCheckExtension { public static IServiceCollection AddArkHealthChecks(this IServiceCollection services) @@ -57,7 +57,7 @@ public static IEndpointRouteBuilder MapArkHealthChecks(this IEndpointRouteBuilde endpoints.MapHealthChecks("/healthCheck", new HealthCheckOptions { Predicate = _ => true, - ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse, + ResponseWriter = ArkHealthCheckResponseWriter.WriteResponseAsync, }); return endpoints; diff --git a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckResponseWriter.cs b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckResponseWriter.cs new file mode 100644 index 000000000..e342825d5 --- /dev/null +++ b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckResponseWriter.cs @@ -0,0 +1,109 @@ +// Copyright (C) 2024 Ark Energy S.r.l. All rights reserved. +// Licensed under the MIT License. See LICENSE file for license information. + +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Diagnostics.HealthChecks; + +namespace Ark.Tools.AspNetCore.HealthChecks; + +/// Writes the shared JSON response for Ark health-check endpoints. +public static class ArkHealthCheckResponseWriter +{ + /// Writes a JSON health report response. + /// The current HTTP context. + /// The health report to serialize. + public static async Task WriteResponseAsync(HttpContext context, HealthReport healthReport) + { + ArgumentNullException.ThrowIfNull(context); + ArgumentNullException.ThrowIfNull(healthReport); + + context.Response.ContentType = "application/json; charset=utf-8"; + + var jsonWriter = new System.Text.Json.Utf8JsonWriter(context.Response.Body, new System.Text.Json.JsonWriterOptions { Indented = true }); + await using (jsonWriter.ConfigureAwait(false)) + { + jsonWriter.WriteStartObject(); + jsonWriter.WriteString("status", healthReport.Status.ToString()); + jsonWriter.WriteStartObject("results"); + + foreach (var entry in healthReport.Entries) + { + jsonWriter.WriteStartObject(entry.Key); + jsonWriter.WriteString("status", entry.Value.Status.ToString()); + jsonWriter.WriteString("description", entry.Value.Description); + if (entry.Value.Exception is not null) + jsonWriter.WriteString("exception", entry.Value.Exception.Message); + jsonWriter.WriteStartObject("data"); + + foreach (var item in entry.Value.Data) + { + jsonWriter.WritePropertyName(item.Key); + WriteValue(jsonWriter, item.Value); + } + + jsonWriter.WriteEndObject(); + jsonWriter.WriteEndObject(); + + } + + jsonWriter.WriteEndObject(); + jsonWriter.WriteEndObject(); + + await jsonWriter.FlushAsync(context.RequestAborted).ConfigureAwait(false); + } + } + + private static void WriteValue(System.Text.Json.Utf8JsonWriter jsonWriter, object? value) + { + ArgumentNullException.ThrowIfNull(jsonWriter); + + switch (value) + { + case null: + jsonWriter.WriteNullValue(); + break; + case string stringValue: + jsonWriter.WriteStringValue(stringValue); + break; + case bool boolValue: + jsonWriter.WriteBooleanValue(boolValue); + break; + case byte byteValue: + jsonWriter.WriteNumberValue(byteValue); + break; + case sbyte sbyteValue: + jsonWriter.WriteNumberValue(sbyteValue); + break; + case short shortValue: + jsonWriter.WriteNumberValue(shortValue); + break; + case ushort ushortValue: + jsonWriter.WriteNumberValue(ushortValue); + break; + case int intValue: + jsonWriter.WriteNumberValue(intValue); + break; + case uint uintValue: + jsonWriter.WriteNumberValue(uintValue); + break; + case long longValue: + jsonWriter.WriteNumberValue(longValue); + break; + case ulong ulongValue: + jsonWriter.WriteNumberValue(ulongValue); + break; + case float floatValue: + jsonWriter.WriteNumberValue(floatValue); + break; + case double doubleValue: + jsonWriter.WriteNumberValue(doubleValue); + break; + case decimal decimalValue: + jsonWriter.WriteNumberValue(decimalValue); + break; + default: + jsonWriter.WriteStringValue(value.ToString()); + break; + } + } +} diff --git a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/Ark.Tools.MediatorFramework.AzureFunctions.csproj b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/Ark.Tools.MediatorFramework.AzureFunctions.csproj index 58767ab9c..d121dbc2d 100644 --- a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/Ark.Tools.MediatorFramework.AzureFunctions.csproj +++ b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/Ark.Tools.MediatorFramework.AzureFunctions.csproj @@ -24,6 +24,7 @@ + diff --git a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsHttp.cs b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsHttp.cs index 4f66b5029..8effb47b4 100644 --- a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsHttp.cs +++ b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsHttp.cs @@ -1,6 +1,8 @@ // Copyright (C) 2024 Ark Energy S.r.l. All rights reserved. // Licensed under the MIT License. See LICENSE file for license information. +using Ark.Tools.AspNetCore.HealthChecks; + using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Diagnostics.HealthChecks; @@ -97,8 +99,32 @@ public static async Task CheckHealthAsync( ArgumentNullException.ThrowIfNull(healthChecks); var report = await healthChecks.CheckHealthAsync(cancellationToken).ConfigureAwait(false); - return Results.StatusCode(report.Status == HealthStatus.Healthy - ? StatusCodes.Status200OK - : StatusCodes.Status503ServiceUnavailable); + + return new DelegateResult(async httpContext => + { + httpContext.Response.StatusCode = report.Status == HealthStatus.Unhealthy + ? StatusCodes.Status503ServiceUnavailable + : StatusCodes.Status200OK; + httpContext.Response.Headers.CacheControl = "no-store, no-cache"; + httpContext.Response.Headers.Pragma = "no-cache"; + httpContext.Response.Headers.Expires = "Thu, 01 Jan 1970 00:00:00 GMT"; + await ArkHealthCheckResponseWriter.WriteResponseAsync(httpContext, report).ConfigureAwait(false); + }); + } + + private sealed class DelegateResult : IResult + { + private readonly Func _writer; + + public DelegateResult(Func writer) + { + _writer = writer; + } + + public async Task ExecuteAsync(HttpContext httpContext) + { + ArgumentNullException.ThrowIfNull(httpContext); + await _writer(httpContext).ConfigureAwait(false); + } } } diff --git a/tests/Ark.Tools.MediatorFramework.Tests/AzureFunctionsHttpTests.cs b/tests/Ark.Tools.MediatorFramework.Tests/AzureFunctionsHttpTests.cs index 833cbb9ff..0eedaa622 100644 --- a/tests/Ark.Tools.MediatorFramework.Tests/AzureFunctionsHttpTests.cs +++ b/tests/Ark.Tools.MediatorFramework.Tests/AzureFunctionsHttpTests.cs @@ -9,6 +9,8 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Diagnostics.HealthChecks; +using System.Text.Json.Nodes; + namespace Ark.Tools.MediatorFramework.Tests; /// Verifies Azure Functions file and streaming helpers. @@ -67,6 +69,7 @@ public async Task HealthCheckUsesRegisteredService() { RequestServices = provider, }; + context.Response.Body = new MemoryStream(); var result = await ArkAzureFunctionsHttp.CheckHealthAsync( provider.GetRequiredService(), @@ -75,6 +78,46 @@ public async Task HealthCheckUsesRegisteredService() await result.ExecuteAsync(context); context.Response.StatusCode.Should().Be(StatusCodes.Status200OK); + context.Response.Headers.CacheControl.ToString().Should().Be("no-store, no-cache"); + context.Response.Headers.Pragma.ToString().Should().Be("no-cache"); + context.Response.Headers.Expires.ToString().Should().Be("Thu, 01 Jan 1970 00:00:00 GMT"); + + context.Response.Body.Position = 0; + var json = await JsonNode.ParseAsync(context.Response.Body, cancellationToken: CancellationToken.None); + json!["status"]!.GetValue().Should().Be("Healthy"); + json!["results"]!.AsObject().Should().BeEmpty(); + } + + [TestMethod] + public async Task HealthCheckWritesFailedCheckDetails() + { + var services = new ServiceCollection(); + services.AddLogging(); + services.AddHealthChecks() + .AddCheck("failing", () => HealthCheckResult.Unhealthy("broken", data: new Dictionary(StringComparer.Ordinal) + { + ["answer"] = 42, + })); + await using var provider = services.BuildServiceProvider(); + var context = new DefaultHttpContext + { + RequestServices = provider, + }; + context.Response.Body = new MemoryStream(); + + var result = await ArkAzureFunctionsHttp.CheckHealthAsync( + provider.GetRequiredService(), + CancellationToken.None); + + await result.ExecuteAsync(context); + + context.Response.StatusCode.Should().Be(StatusCodes.Status503ServiceUnavailable); + context.Response.Body.Position = 0; + var json = await JsonNode.ParseAsync(context.Response.Body, cancellationToken: CancellationToken.None); + json!["status"]!.GetValue().Should().Be("Unhealthy"); + json["results"]!["failing"]!["status"]!.GetValue().Should().Be("Unhealthy"); + json["results"]!["failing"]!["description"]!.GetValue().Should().Be("broken"); + json["results"]!["failing"]!["data"]!["answer"]!.GetValue().Should().Be(42); } private static async IAsyncEnumerable Values() From 97f2f6ba4fd234f6c20d5a7cb74ad3a2e76739b1 Mon Sep 17 00:00:00 2001 From: Andrea Cuneo Date: Tue, 4 Aug 2026 09:46:10 +0200 Subject: [PATCH 12/16] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: Andrea Cuneo --- .../ArkHealthCheckResponseWriter.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckResponseWriter.cs b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckResponseWriter.cs index e342825d5..7101c8928 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckResponseWriter.cs +++ b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckResponseWriter.cs @@ -31,8 +31,7 @@ public static async Task WriteResponseAsync(HttpContext context, HealthReport he jsonWriter.WriteStartObject(entry.Key); jsonWriter.WriteString("status", entry.Value.Status.ToString()); jsonWriter.WriteString("description", entry.Value.Description); - if (entry.Value.Exception is not null) - jsonWriter.WriteString("exception", entry.Value.Exception.Message); + // Intentionally omit exception details from the HTTP response. jsonWriter.WriteStartObject("data"); foreach (var item in entry.Value.Data) From 7e38bc4fbc5148dc665a536692966a5ab148c5b2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 4 Aug 2026 08:16:09 +0000 Subject: [PATCH 13/16] fix(health): relocate UI extensions Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- .../Ark.Tools.Benchmarks/packages.lock.json | 5 +- ...atorFramework.Sample.AzureFunctions.csproj | 1 + .../Program.cs | 2 + .../packages.lock.json | 168 +++++++++++++ .../packages.lock.json | 211 ---------------- .../packages.lock.json | 226 +----------------- .../packages.lock.json | 31 ++- .../packages.lock.json | 30 ++- .../ProblemDetailsSample/packages.lock.json | 5 +- samples/TestLinkGenerator/packages.lock.json | 5 +- samples/WebApplicationDemo/packages.lock.json | 5 +- .../Ark.Tools.AspNetCore.HealthChecks.csproj | 10 - .../ArkHealthCheckExtension.cs | 43 +--- .../ArkHealthCheckResponseWriter.cs | 108 --------- .../packages.lock.json | 218 ----------------- .../Ark.Tools.AspNetCore.csproj | 8 + .../ArkHealthChecksUIExtension.cs | 63 +++++ .../UIHealthChecks.css | 2 +- .../Ark.Tools.AspNetCore/packages.lock.json | 45 ++-- ...ls.MediatorFramework.AzureFunctions.csproj | 2 +- .../ArkAzureFunctionsHttp.cs | 4 +- .../packages.lock.json | 14 ++ .../packages.lock.json | 5 +- .../packages.lock.json | 34 +++ .../packages.lock.json | 5 +- 25 files changed, 382 insertions(+), 868 deletions(-) delete mode 100644 src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckResponseWriter.cs create mode 100644 src/aspnetcore/Ark.Tools.AspNetCore/ArkHealthChecksUIExtension.cs rename src/aspnetcore/{Ark.Tools.AspNetCore.HealthChecks => Ark.Tools.AspNetCore}/UIHealthChecks.css (95%) diff --git a/benchmarks/Ark.Tools.Benchmarks/packages.lock.json b/benchmarks/Ark.Tools.Benchmarks/packages.lock.json index 349def96b..3ef3705ec 100644 --- a/benchmarks/Ark.Tools.Benchmarks/packages.lock.json +++ b/benchmarks/Ark.Tools.Benchmarks/packages.lock.json @@ -1041,6 +1041,8 @@ "Asp.Versioning.Http": "[10.0.0, )", "Asp.Versioning.Mvc.ApiExplorer": "[10.0.0, )", "Asp.Versioning.OData.ApiExplorer": "[10.0.0-rc.1, )", + "AspNetCore.HealthChecks.UI": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "FluentValidation": "[12.1.1, )", "Hellang.Middleware.ProblemDetails": "[6.5.1, )", "Microsoft.AspNetCore.OData": "[10.0.0-preview.2, )", @@ -1080,12 +1082,9 @@ "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", - "AspNetCore.HealthChecks.UI": "[9.0.0, )", "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", - "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "Azure.Identity": "[1.21.0, )", "Azure.Messaging.ServiceBus": "[7.20.2, )", - "KubernetesClient": "[19.0.2, )", "Microsoft.ApplicationInsights": "[2.23.0, )" } }, diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/Ark.MediatorFramework.Sample.AzureFunctions.csproj b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/Ark.MediatorFramework.Sample.AzureFunctions.csproj index 627921d64..c198174d3 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/Ark.MediatorFramework.Sample.AzureFunctions.csproj +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/Ark.MediatorFramework.Sample.AzureFunctions.csproj @@ -16,6 +16,7 @@ + diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/Program.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/Program.cs index 5d25ab38c..43c2b981c 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/Program.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/Program.cs @@ -3,6 +3,7 @@ using Ark.MediatorFramework.Sample.Application; using Ark.MediatorFramework.AzureFunctions; +using Ark.Tools.AspNetCore.HealthChecks; using Microsoft.AspNetCore.Authorization; using Microsoft.Azure.Functions.Worker.Builder; @@ -32,6 +33,7 @@ public static void Main(string[] args) var rebusContainer = AzureFunctionsRebusComposition.BuildContainer(serviceBusConnectionString); #pragma warning restore CA2000 builder.Services.AddArkAzureFunctions(rebusContainer); + builder.Services.AddArkHealthChecks(); builder.Services.AddArkAzureFunctionsBearerAuthentication(); builder.Services.AddAuthorization(options => { diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/packages.lock.json b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/packages.lock.json index f4bdebecd..d15d0999c 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/packages.lock.json +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.AzureFunctions/packages.lock.json @@ -48,6 +48,67 @@ "resolved": "18.7.23", "contentHash": "dyj6z8m+LFjpeH69hdnciCcRCmD0YgMlvuQEywiEshjqj/blgQ+PuWX8Vd5gkWQFoBN4e+TFxx6DvGNSv/gIKg==" }, + "AspNetCore.HealthChecks.AzureServiceBus": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "Uzml9qWAvN6xPJejdTLznx9SIczKs/exieiJCU0Kjivt4ZTcsLdE3u2g8HJr0VWhguQad2mpGkwXtQ9nWfkm4g==", + "dependencies": { + "Azure.Messaging.ServiceBus": "7.17.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, + "AspNetCore.HealthChecks.Network": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "Lke7ksxhzZK8qZhSrmxnhdOHkKInzVIdGk7JBAnROQ6M66nuO9ja6ShC0osw83oE+GZazkO+F36gfwD8HlHrXA==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "SSH.NET": "2023.0.0" + } + }, + "AspNetCore.HealthChecks.Oracle": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "q+vhCRPgxWviMtybuJMTXxM2GzA2/h2Cm+LJyafipxVV7iDCb8uTV41E8CZ6XFJhZfZ0VIEhzE3IAL2m4i+t7g==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "Oracle.ManagedDataAccess.Core": "3.21.120" + } + }, + "AspNetCore.HealthChecks.Publisher.ApplicationInsights": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "v2GAyHPxJQIH8mBD5bF4GQXvYODMOOb30vaMTvv6ShXnqR2K0YSjZSAMdMc+WEBcjtUvv+1o+Mv+sf9Ho+wXWw==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, + "AspNetCore.HealthChecks.SqlServer": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "UxCf65iCF2nU1u7AcB320abjL4CRg5swCgJECY6mKk1j5lrGMfVtskWwriGs1T29pYdRig9Vra3SPnP+4G82pA==", + "dependencies": { + "Microsoft.Data.SqlClient": "5.2.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, + "AspNetCore.HealthChecks.UI.Client": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "1Ub3Wvvbz7CMuFNWgLEc9qqQibiMoovDML/WHrwr5J83RPgtI20giCR92s/ipLgu7IIuqw+W/y7WpIeHqAICxg==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Core": "9.0.0" + } + }, + "AspNetCore.HealthChecks.UI.Core": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "TVriy4hgYnhfqz6NAzv8qe62Q8wf82iKUL6WV9selqeFZTq1ILi39Sic6sFQegRysvAVcnxKP/vY8z9Fk8x6XQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, "Azure.Core": { "type": "Transitive", "resolved": "1.60.0", @@ -474,6 +535,22 @@ "Microsoft.Extensions.Options": "10.0.9" } }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "zLgN22Zp9pk8RHlwssRTexw4+a6wqOnKWN+VejdPn5Yhjql4XiBhkFo35Nu8mmqHIk/UEmmCnMGLWq75aFfkOw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.11", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "So3JUdRxozRjvQ3cxU6F3nI/i4emDnjane6yMYcJhvTTTu29ltlIdoXjkFGRceIWz8yKvuEpzXItZ0x5GvN2nQ==" + }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", "resolved": "10.0.9", @@ -722,6 +799,11 @@ "resolved": "1.0.0", "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" }, + "Microsoft.Win32.SystemEvents": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A==" + }, "MimeKit": { "type": "Transitive", "resolved": "4.17.0", @@ -793,6 +875,16 @@ "NodaTime": "[3.0.0, 4.0.0)" } }, + "Oracle.ManagedDataAccess.Core": { + "type": "Transitive", + "resolved": "3.21.120", + "contentHash": "RrSu5ZlhIqpV7mFauPfc2AkCsuWXA2cWCNXOBW+Wt7R8g6wqonWIWZN3iyhwr4mZMRrClJB/SRMtQzQMHuZPmg==", + "dependencies": { + "System.Diagnostics.PerformanceCounter": "6.0.1", + "System.DirectoryServices": "6.0.1", + "System.DirectoryServices.Protocols": "6.0.2" + } + }, "Polly.Core": { "type": "Transitive", "resolved": "8.7.0", @@ -938,6 +1030,19 @@ "Newtonsoft.Json": "13.0.4" } }, + "SSH.NET": { + "type": "Transitive", + "resolved": "2023.0.0", + "contentHash": "g+3VDUrYhm0sqSxmlQFgRFrmBxhQvVh4pfn4pqjkX7WXE3tTjt1tIsOtjuz3mz/5s8gFFQVRydwCJ7Ohs54sJA==", + "dependencies": { + "SshNet.Security.Cryptography": "[1.3.0]" + } + }, + "SshNet.Security.Cryptography": { + "type": "Transitive", + "resolved": "1.3.0", + "contentHash": "5pBIXRjcSO/amY8WztpmNOhaaCNHY/B6CcYDI7FSTgqSyo/ZUojlLiKcsl+YGbxQuLX439qIkMfP0PHqxqJi/Q==" + }, "System.ClientModel": { "type": "Transitive", "resolved": "1.14.0", @@ -963,6 +1068,35 @@ "resolved": "10.0.0", "contentHash": "uaFRda9NjtbJRkdx311eXlAA3n2em7223c1A8d1VWyl+4FL9vkG7y2lpPfBU9HYdj/9KgdRNdn1vFK8ZYCYT/A==" }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "dDl7Gx3bmSrM2k2ZIm+ucEJnLloZRyvfQF1DvfvATcGF3jtaUBiPvChma+6ZcZzxWMirN3kCywkW7PILphXyMQ==", + "dependencies": { + "System.Configuration.ConfigurationManager": "6.0.0" + } + }, + "System.DirectoryServices": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "935IbO7h5FDGYxeO3cbx/CuvBBuk/VI8sENlfmXlh1pupNOB3LAGzdYdPY8CawGJFP7KNrHK5eUlsFoz3F6cuA==", + "dependencies": { + "System.Security.Permissions": "6.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "vDDPWwHn3/DNZ+kPkdXHoada+tKPEC9bVqDOr4hK6HBSP7hGCUTA0Zw6WU5qpGaqa5M1/V+axHMIv+DNEbIf6g==" + }, + "System.Drawing.Common": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==", + "dependencies": { + "Microsoft.Win32.SystemEvents": "6.0.0" + } + }, "System.IO.FileSystem.AccessControl": { "type": "Transitive", "resolved": "4.7.0", @@ -988,6 +1122,14 @@ "resolved": "9.0.13", "contentHash": "t8S9IDpjJKsLpLkeBdW8cWtcPyYqrGu93Dej1RO6WwuL/lkFSqWlan3rMJfortqz1mRIh+sys2AFsSA6jWJ3Jg==" }, + "System.Security.Permissions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==", + "dependencies": { + "System.Windows.Extensions": "6.0.0" + } + }, "System.ServiceModel.Primitives": { "type": "Transitive", "resolved": "10.0.652802", @@ -997,6 +1139,14 @@ "System.Security.Cryptography.Xml": "10.0.0" } }, + "System.Windows.Extensions": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==", + "dependencies": { + "System.Drawing.Common": "6.0.0" + } + }, "ark.mediatorframework.sample.application": { "type": "Project", "dependencies": { @@ -1039,6 +1189,23 @@ "Microsoft.Extensions.Options": "[10.0.10, )" } }, + "ark.tools.aspnetcore.healthchecks": { + "type": "Project", + "dependencies": { + "Ark.Tools.Core": "[1.0.0, )", + "Ark.Tools.SimpleInjector": "[1.0.0, )", + "Ark.Tools.SystemTextJson": "[1.0.0, )", + "AspNetCore.HealthChecks.AzureServiceBus": "[9.0.0, )", + "AspNetCore.HealthChecks.Network": "[9.0.0, )", + "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", + "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", + "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", + "Azure.Identity": "[1.21.0, )", + "Azure.Messaging.ServiceBus": "[7.20.2, )", + "Microsoft.ApplicationInsights": "[2.23.0, )" + } + }, "ark.tools.aspnetcore.problemdetails": { "type": "Project", "dependencies": { @@ -1073,6 +1240,7 @@ "Ark.Tools.MediatorFramework": "[1.0.0, )", "Ark.Tools.Solid": "[1.0.0, )", "Ark.Tools.SystemTextJson": "[1.0.0, )", + "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", "Microsoft.Azure.Functions.Worker": "[2.52.0, )", "Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore": "[2.1.1, )", "SimpleInjector": "[5.6.0, )" diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/packages.lock.json b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/packages.lock.json index 3d391954f..0ad4cbf73 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/packages.lock.json +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/packages.lock.json @@ -134,16 +134,6 @@ "Microsoft.Data.SqlClient": "5.2.2" } }, - "AspNetCore.HealthChecks.UI": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "r/bGIiFDm/Bv+S/OCcE1/YzM4Zul1nEKGRA42xcGqxaYmaQf1T+gFEReNNA+5nHXuXt5TRuBuVag1emXuwqe6w==", - "dependencies": { - "AspNetCore.HealthChecks.UI.Data": "9.0.0", - "KubernetesClient": "15.0.1", - "Microsoft.EntityFrameworkCore.Design": "8.0.11" - } - }, "AspNetCore.HealthChecks.UI.Client": { "type": "Transitive", "resolved": "9.0.0", @@ -157,24 +147,6 @@ "resolved": "9.0.0", "contentHash": "TVriy4hgYnhfqz6NAzv8qe62Q8wf82iKUL6WV9selqeFZTq1ILi39Sic6sFQegRysvAVcnxKP/vY8z9Fk8x6XQ==" }, - "AspNetCore.HealthChecks.UI.Data": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "bZkXUdiqXOkmhe3XHF+OIgPQKR8OXS8/+iDWegmxSXtbaIYwsT5+B0URT+P4OPvhj5tR2goMMZe5KwJBVHr+1g==", - "dependencies": { - "AspNetCore.HealthChecks.UI.Core": "9.0.0", - "Microsoft.EntityFrameworkCore": "8.0.0" - } - }, - "AspNetCore.HealthChecks.UI.InMemory.Storage": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "xuq+HBH8Ckz9r5d+yP1pk7cgIbPLBqCGfYu0MxtvbtsxIo7cv5nQoUCJsdgqN5/a4ndVUJZco6GjWFk6r4xN1w==", - "dependencies": { - "AspNetCore.HealthChecks.UI.Data": "9.0.0", - "Microsoft.EntityFrameworkCore.InMemory": "8.0.11" - } - }, "Azure.Core": { "type": "Transitive", "resolved": "1.60.0", @@ -259,11 +231,6 @@ "resolved": "12.1.1", "contentHash": "EPpkIe1yh1a0OXyC100oOA8WMbZvqUu5plwhvYcb7oSELfyUZzfxV48BLhvs3kKo4NwG7MGLNgy1RJiYtT8Dpw==" }, - "Fractions": { - "type": "Transitive", - "resolved": "7.3.0", - "contentHash": "2bETFWLBc8b7Ut2SVi+bxhGVwiSpknHYGBh2PADyGWONLkTxT7bKyDRhF8ao+XUv90tq8Fl7GTPxSI5bacIRJw==" - }, "Grpc.AspNetCore.Server": { "type": "Transitive", "resolved": "2.66.0", @@ -299,20 +266,6 @@ "resolved": "6.5.1", "contentHash": "LgceF4mPguB/q3NWs6T3bitOFnYIANSRvfhASMgVb8ks7fSqY8jbdBHoVEuUDmxg3T7+kF21qSE0jQv9hdpLng==" }, - "Humanizer.Core": { - "type": "Transitive", - "resolved": "2.14.1", - "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" - }, - "KubernetesClient": { - "type": "Transitive", - "resolved": "19.0.2", - "contentHash": "0m8FuzCDBygaXMbsb7qVapNZzTm4ftM7ECp/waTRh/XOUQziRF2rKJCRmsvYbBXgJkQvU+FBbkoa40hexzDC+g==", - "dependencies": { - "Fractions": "7.3.0", - "YamlDotNet": "16.3.0" - } - }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -481,49 +434,6 @@ "resolved": "10.0.2", "contentHash": "LG9Yll3B5aNpxv0+D47g6LiOiKBIlodhcHdQwcYzo8VeexFLGqx5ymetmA2aBRyo9cCcWsQWrFsdbsr8LvmWDw==" }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Transitive", - "resolved": "3.3.3", - "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" - }, - "Microsoft.CodeAnalysis.Common": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.3" - } - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", - "dependencies": { - "Microsoft.CodeAnalysis.Common": "[4.5.0]" - } - }, - "Microsoft.CodeAnalysis.CSharp.Workspaces": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", - "Microsoft.CodeAnalysis.Common": "[4.5.0]", - "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" - } - }, - "Microsoft.CodeAnalysis.Workspaces.Common": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.Bcl.AsyncInterfaces": "6.0.0", - "Microsoft.CodeAnalysis.Common": "[4.5.0]", - "System.Composition": "6.0.0" - } - }, "Microsoft.Data.SqlClient": { "type": "Transitive", "resolved": "7.0.2", @@ -558,58 +468,6 @@ "resolved": "6.0.2", "contentHash": "f+pRODTWX7Y67jXO3T5S2dIPZ9qMJNySjlZT/TKmWVNWe19N8jcWmHaqHnnchaq3gxEKv1SWVY5EFzOD06l41w==" }, - "Microsoft.EntityFrameworkCore": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "stbjWBTtpQ1HtqXMFyKnXFTr76PvaOHI2b2h85JqBi3eZr00nspvR/a90Zwh8CQ4rVawqLiTG0+0yZQWaav+sQ==", - "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "8.0.11", - "Microsoft.EntityFrameworkCore.Analyzers": "8.0.11" - } - }, - "Microsoft.EntityFrameworkCore.Abstractions": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "++zY0Ea724ku1jptWJmF7jm3I4IXTexfT4qi1ETcSFFF7qj+qm6rRgN7mTuKkwIETuXk0ikfzudryRjUGrrNKQ==" - }, - "Microsoft.EntityFrameworkCore.Analyzers": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "NI/AJQjtC7qgWM8Nr85sRkwlog2AnFer5RKP8xTUH0RuPF3nN0tGXBEeYJOLZWp+/+M/C6O7MMDRhKRE8bZwIA==" - }, - "Microsoft.EntityFrameworkCore.Design": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "KxOvpbaKiUmbLvenr0T/4F1Vdm0Sq+iajLbesQK7/WKB/Dx+FQHCZ0f5jCXrVWK2QKF9eHzQ5JPA1L6hcb25FQ==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", - "Microsoft.EntityFrameworkCore.Relational": "8.0.11", - "Microsoft.Extensions.DependencyModel": "8.0.2", - "Mono.TextTemplating": "2.2.1" - } - }, - "Microsoft.EntityFrameworkCore.InMemory": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "gFFdubZlRfudSw94OxO7s8OvLQZncnR0S1ll//wRtZP3mMYVeq8DrMnEILK6hBJwbTBB1SNm3apg9SdvdE/ySg==", - "dependencies": { - "Microsoft.EntityFrameworkCore": "8.0.11" - } - }, - "Microsoft.EntityFrameworkCore.Relational": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "3TuuW3i5I4Ro0yoaHmi2MqEDGObOVuhLaMEnd/heaLB1fcvm4fu4PevmC4BOWnI0vo176AIlV5o4rEQciLoohw==", - "dependencies": { - "Microsoft.EntityFrameworkCore": "8.0.11" - } - }, - "Microsoft.Extensions.DependencyModel": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" - }, "Microsoft.Extensions.Logging.ApplicationInsights": { "type": "Transitive", "resolved": "2.23.0", @@ -759,14 +617,6 @@ "System.Security.Cryptography.Pkcs": "10.0.0" } }, - "Mono.TextTemplating": { - "type": "Transitive", - "resolved": "2.2.1", - "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", - "dependencies": { - "System.CodeDom": "4.4.0" - } - }, "morelinq": { "type": "Transitive", "resolved": "4.4.0", @@ -1026,59 +876,6 @@ "System.Memory.Data": "10.0.3" } }, - "System.CodeDom": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" - }, - "System.Composition": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", - "dependencies": { - "System.Composition.AttributedModel": "6.0.0", - "System.Composition.Convention": "6.0.0", - "System.Composition.Hosting": "6.0.0", - "System.Composition.Runtime": "6.0.0", - "System.Composition.TypedParts": "6.0.0" - } - }, - "System.Composition.AttributedModel": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" - }, - "System.Composition.Convention": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", - "dependencies": { - "System.Composition.AttributedModel": "6.0.0" - } - }, - "System.Composition.Hosting": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", - "dependencies": { - "System.Composition.Runtime": "6.0.0" - } - }, - "System.Composition.Runtime": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" - }, - "System.Composition.TypedParts": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", - "dependencies": { - "System.Composition.AttributedModel": "6.0.0", - "System.Composition.Hosting": "6.0.0", - "System.Composition.Runtime": "6.0.0" - } - }, "System.Configuration.ConfigurationManager": { "type": "Transitive", "resolved": "9.0.13", @@ -1162,11 +959,6 @@ "System.Drawing.Common": "6.0.0" } }, - "YamlDotNet": { - "type": "Transitive", - "resolved": "16.3.0", - "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" - }, "ark.mediatorframework.sample.application": { "type": "Project", "dependencies": { @@ -1228,12 +1020,9 @@ "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", - "AspNetCore.HealthChecks.UI": "[9.0.0, )", "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", - "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "Azure.Identity": "[1.21.0, )", "Azure.Messaging.ServiceBus": "[7.20.2, )", - "KubernetesClient": "[19.0.2, )", "Microsoft.ApplicationInsights": "[2.23.0, )" } }, diff --git a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json index 290e44d09..1a6ec4f88 100644 --- a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json +++ b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json @@ -256,17 +256,6 @@ "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" } }, - "AspNetCore.HealthChecks.UI": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "r/bGIiFDm/Bv+S/OCcE1/YzM4Zul1nEKGRA42xcGqxaYmaQf1T+gFEReNNA+5nHXuXt5TRuBuVag1emXuwqe6w==", - "dependencies": { - "AspNetCore.HealthChecks.UI.Data": "9.0.0", - "KubernetesClient": "15.0.1", - "Microsoft.EntityFrameworkCore.Design": "8.0.11", - "Microsoft.Extensions.Http": "8.0.0" - } - }, "AspNetCore.HealthChecks.UI.Client": { "type": "Transitive", "resolved": "9.0.0", @@ -283,24 +272,6 @@ "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" } }, - "AspNetCore.HealthChecks.UI.Data": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "bZkXUdiqXOkmhe3XHF+OIgPQKR8OXS8/+iDWegmxSXtbaIYwsT5+B0URT+P4OPvhj5tR2goMMZe5KwJBVHr+1g==", - "dependencies": { - "AspNetCore.HealthChecks.UI.Core": "9.0.0", - "Microsoft.EntityFrameworkCore": "8.0.0" - } - }, - "AspNetCore.HealthChecks.UI.InMemory.Storage": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "xuq+HBH8Ckz9r5d+yP1pk7cgIbPLBqCGfYu0MxtvbtsxIo7cv5nQoUCJsdgqN5/a4ndVUJZco6GjWFk6r4xN1w==", - "dependencies": { - "AspNetCore.HealthChecks.UI.Data": "9.0.0", - "Microsoft.EntityFrameworkCore.InMemory": "8.0.11" - } - }, "Azure.Core": { "type": "Transitive", "resolved": "1.60.0", @@ -405,11 +376,6 @@ "resolved": "12.1.1", "contentHash": "EPpkIe1yh1a0OXyC100oOA8WMbZvqUu5plwhvYcb7oSELfyUZzfxV48BLhvs3kKo4NwG7MGLNgy1RJiYtT8Dpw==" }, - "Fractions": { - "type": "Transitive", - "resolved": "7.3.0", - "contentHash": "2bETFWLBc8b7Ut2SVi+bxhGVwiSpknHYGBh2PADyGWONLkTxT7bKyDRhF8ao+XUv90tq8Fl7GTPxSI5bacIRJw==" - }, "Gherkin": { "type": "Transitive", "resolved": "35.0.0", @@ -462,20 +428,6 @@ "resolved": "6.5.1", "contentHash": "LgceF4mPguB/q3NWs6T3bitOFnYIANSRvfhASMgVb8ks7fSqY8jbdBHoVEuUDmxg3T7+kF21qSE0jQv9hdpLng==" }, - "Humanizer.Core": { - "type": "Transitive", - "resolved": "2.14.1", - "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" - }, - "KubernetesClient": { - "type": "Transitive", - "resolved": "19.0.2", - "contentHash": "0m8FuzCDBygaXMbsb7qVapNZzTm4ftM7ECp/waTRh/XOUQziRF2rKJCRmsvYbBXgJkQvU+FBbkoa40hexzDC+g==", - "dependencies": { - "Fractions": "7.3.0", - "YamlDotNet": "16.3.0" - } - }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -816,49 +768,6 @@ "Microsoft.Build.Framework": "15.9.20" } }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Transitive", - "resolved": "3.3.3", - "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" - }, - "Microsoft.CodeAnalysis.Common": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.3" - } - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==", - "dependencies": { - "Microsoft.CodeAnalysis.Common": "[4.5.0]" - } - }, - "Microsoft.CodeAnalysis.CSharp.Workspaces": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.CodeAnalysis.CSharp": "[4.5.0]", - "Microsoft.CodeAnalysis.Common": "[4.5.0]", - "Microsoft.CodeAnalysis.Workspaces.Common": "[4.5.0]" - } - }, - "Microsoft.CodeAnalysis.Workspaces.Common": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.Bcl.AsyncInterfaces": "6.0.0", - "Microsoft.CodeAnalysis.Common": "[4.5.0]", - "System.Composition": "6.0.0" - } - }, "Microsoft.CodeCoverage": { "type": "Transitive", "resolved": "18.8.1", @@ -912,56 +821,6 @@ "resolved": "2.2.9", "contentHash": "WLbDc/W9XkHpGVtd1L6Vml8W6+PaaYZZTJASHjHF7W2WX/hld6bfNK102Ui+I3a6zIdx4+oKRJtMgHz44JmBfw==" }, - "Microsoft.EntityFrameworkCore": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "stbjWBTtpQ1HtqXMFyKnXFTr76PvaOHI2b2h85JqBi3eZr00nspvR/a90Zwh8CQ4rVawqLiTG0+0yZQWaav+sQ==", - "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "8.0.11", - "Microsoft.EntityFrameworkCore.Analyzers": "8.0.11", - "Microsoft.Extensions.Caching.Memory": "8.0.1", - "Microsoft.Extensions.Logging": "8.0.1" - } - }, - "Microsoft.EntityFrameworkCore.Abstractions": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "++zY0Ea724ku1jptWJmF7jm3I4IXTexfT4qi1ETcSFFF7qj+qm6rRgN7mTuKkwIETuXk0ikfzudryRjUGrrNKQ==" - }, - "Microsoft.EntityFrameworkCore.Analyzers": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "NI/AJQjtC7qgWM8Nr85sRkwlog2AnFer5RKP8xTUH0RuPF3nN0tGXBEeYJOLZWp+/+M/C6O7MMDRhKRE8bZwIA==" - }, - "Microsoft.EntityFrameworkCore.Design": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "KxOvpbaKiUmbLvenr0T/4F1Vdm0Sq+iajLbesQK7/WKB/Dx+FQHCZ0f5jCXrVWK2QKF9eHzQ5JPA1L6hcb25FQ==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", - "Microsoft.EntityFrameworkCore.Relational": "8.0.11", - "Microsoft.Extensions.DependencyModel": "8.0.2", - "Mono.TextTemplating": "2.2.1" - } - }, - "Microsoft.EntityFrameworkCore.InMemory": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "gFFdubZlRfudSw94OxO7s8OvLQZncnR0S1ll//wRtZP3mMYVeq8DrMnEILK6hBJwbTBB1SNm3apg9SdvdE/ySg==", - "dependencies": { - "Microsoft.EntityFrameworkCore": "8.0.11" - } - }, - "Microsoft.EntityFrameworkCore.Relational": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "3TuuW3i5I4Ro0yoaHmi2MqEDGObOVuhLaMEnd/heaLB1fcvm4fu4PevmC4BOWnI0vo176AIlV5o4rEQciLoohw==", - "dependencies": { - "Microsoft.EntityFrameworkCore": "8.0.11", - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0" - } - }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", "resolved": "10.0.0", @@ -1179,15 +1038,13 @@ }, "Microsoft.Extensions.Http": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "cWz4caHwvx0emoYe7NkHPxII/KkTI8R/LC9qdqJqnKv2poTJ4e2qqPGQqvRoQ5kaSA4FU5IV3qFAuLuOhoqULQ==", + "resolved": "6.0.0", + "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", - "Microsoft.Extensions.Diagnostics": "8.0.0", - "Microsoft.Extensions.Logging": "8.0.0", - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0" + "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", + "Microsoft.Extensions.Logging": "6.0.0", + "Microsoft.Extensions.Logging.Abstractions": "6.0.0", + "Microsoft.Extensions.Options": "6.0.0" } }, "Microsoft.Extensions.Localization.Abstractions": { @@ -1528,14 +1385,6 @@ "System.Security.Cryptography.Pkcs": "10.0.0" } }, - "Mono.TextTemplating": { - "type": "Transitive", - "resolved": "2.2.1", - "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", - "dependencies": { - "System.CodeDom": "4.4.0" - } - }, "morelinq": { "type": "Transitive", "resolved": "4.4.0", @@ -1819,64 +1668,11 @@ "System.Memory.Data": "10.0.3" } }, - "System.CodeDom": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" - }, "System.ComponentModel.Composition": { "type": "Transitive", "resolved": "8.0.0", "contentHash": "bGhUX5BTivJ9Wax0qnJy7uGq7dn/TQkEpJ2Fpu1etg8dbPwyDkUzNPc1d3I2/jUr9y4wDI3a1dkSmi8X21Pzbw==" }, - "System.Composition": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==", - "dependencies": { - "System.Composition.AttributedModel": "6.0.0", - "System.Composition.Convention": "6.0.0", - "System.Composition.Hosting": "6.0.0", - "System.Composition.Runtime": "6.0.0", - "System.Composition.TypedParts": "6.0.0" - } - }, - "System.Composition.AttributedModel": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==" - }, - "System.Composition.Convention": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==", - "dependencies": { - "System.Composition.AttributedModel": "6.0.0" - } - }, - "System.Composition.Hosting": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==", - "dependencies": { - "System.Composition.Runtime": "6.0.0" - } - }, - "System.Composition.Runtime": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==" - }, - "System.Composition.TypedParts": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==", - "dependencies": { - "System.Composition.AttributedModel": "6.0.0", - "System.Composition.Hosting": "6.0.0", - "System.Composition.Runtime": "6.0.0" - } - }, "System.Configuration.ConfigurationManager": { "type": "Transitive", "resolved": "9.0.13", @@ -1972,11 +1768,6 @@ "resolved": "8.0.0", "contentHash": "Obg3a90MkOw9mYKxrardLpY2u0axDMrSmy4JCdq2cYbelM2cUwmUir5Bomvd1yxmPL9h5LVHU1tuKBZpUjfASg==" }, - "YamlDotNet": { - "type": "Transitive", - "resolved": "16.3.0", - "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" - }, "ark.mediatorframework.sample.application": { "type": "Project", "dependencies": { @@ -2002,6 +1793,7 @@ "dependencies": { "Ark.MediatorFramework.Sample.Application": "[0.9.1, )", "Ark.MediatorFramework.Sample.RebusProcessor": "[0.9.1, )", + "Ark.Tools.AspNetCore.HealthChecks": "[1.0.0, )", "Ark.Tools.MediatorFramework.AzureFunctions": "[1.0.0, )", "Ark.Tools.MediatorFramework.Rebus": "[1.0.0, )", "Ark.Tools.Rebus": "[1.0.0, )" @@ -2078,12 +1870,9 @@ "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", - "AspNetCore.HealthChecks.UI": "[9.0.0, )", "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", - "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "Azure.Identity": "[1.21.0, )", "Azure.Messaging.ServiceBus": "[7.20.2, )", - "KubernetesClient": "[19.0.2, )", "Microsoft.ApplicationInsights": "[2.23.0, )" } }, @@ -2128,6 +1917,7 @@ "Ark.Tools.MediatorFramework": "[1.0.0, )", "Ark.Tools.Solid": "[1.0.0, )", "Ark.Tools.SystemTextJson": "[1.0.0, )", + "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", "Microsoft.Azure.Functions.Worker": "[2.52.0, )", "Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore": "[2.1.1, )", "SimpleInjector": "[5.6.0, )" diff --git a/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.Tests/packages.lock.json b/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.Tests/packages.lock.json index deeca9edd..7b99fd1db 100644 --- a/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.Tests/packages.lock.json +++ b/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.Tests/packages.lock.json @@ -596,13 +596,29 @@ "resolved": "2.14.1", "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" }, + "IdentityModel": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "nuhkbaDH9l5QzNJp2MtP3qio57MPtiRneUN8Ocr7od0JvSYaIe3gBj/vxllr11S/Qvu1AG4GZXoyv5469ewYDA==" + }, + "IdentityModel.OidcClient": { + "type": "Transitive", + "resolved": "5.2.1", + "contentHash": "OuPhDNAw/EoJVEmYO6/ChZUBcug4OGoGKTKLUyBCsGhlKegxJk25LYQ0EL7GCBMgkEL+BYNJukNZyaJ+JNaWog==", + "dependencies": { + "IdentityModel": "5.2.0", + "Microsoft.Extensions.Logging": "6.0.0" + } + }, "KubernetesClient": { "type": "Transitive", - "resolved": "19.0.2", - "contentHash": "0m8FuzCDBygaXMbsb7qVapNZzTm4ftM7ECp/waTRh/XOUQziRF2rKJCRmsvYbBXgJkQvU+FBbkoa40hexzDC+g==", + "resolved": "15.0.1", + "contentHash": "IOsMJaBpiHELr7ZeiJQypdtLDbc/HqxbEh9UMaDvLpBvGIzS+KhjA0LJVEbGgvubmhWHxLPfgHAL0le1zr2RwA==", "dependencies": { "Fractions": "7.3.0", - "YamlDotNet": "16.3.0" + "IdentityModel.OidcClient": "5.2.1", + "System.IdentityModel.Tokens.Jwt": "7.1.2", + "YamlDotNet": "16.0.0" } }, "Macross.Json.Extensions": { @@ -2096,8 +2112,8 @@ }, "YamlDotNet": { "type": "Transitive", - "resolved": "16.3.0", - "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" + "resolved": "16.0.0", + "contentHash": "kZ4jR5ltFhnjaUqK9x81zXRIUTH4PTXTTEmJDNQdkDLQhcv+2Nl19r0dCSvPW1mstOYBfXTnjdieRbUO6gHMDw==" }, "ark.reference.common": { "type": "Project", @@ -2182,6 +2198,8 @@ "Asp.Versioning.Http": "[10.0.0, )", "Asp.Versioning.Mvc.ApiExplorer": "[10.0.0, )", "Asp.Versioning.OData.ApiExplorer": "[10.0.0-rc.1, )", + "AspNetCore.HealthChecks.UI": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "FluentValidation": "[12.1.1, )", "Hellang.Middleware.ProblemDetails": "[6.5.1, )", "Microsoft.AspNetCore.OData": "[10.0.0-preview.2, )", @@ -2221,12 +2239,9 @@ "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", - "AspNetCore.HealthChecks.UI": "[9.0.0, )", "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", - "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "Azure.Identity": "[1.21.0, )", "Azure.Messaging.ServiceBus": "[7.20.2, )", - "KubernetesClient": "[19.0.2, )", "Microsoft.ApplicationInsights": "[2.23.0, )" } }, diff --git a/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.WebInterface/packages.lock.json b/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.WebInterface/packages.lock.json index 64cc918ee..7dc74e6c6 100644 --- a/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.WebInterface/packages.lock.json +++ b/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.WebInterface/packages.lock.json @@ -356,13 +356,28 @@ "resolved": "2.14.1", "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" }, + "IdentityModel": { + "type": "Transitive", + "resolved": "5.2.0", + "contentHash": "nuhkbaDH9l5QzNJp2MtP3qio57MPtiRneUN8Ocr7od0JvSYaIe3gBj/vxllr11S/Qvu1AG4GZXoyv5469ewYDA==" + }, + "IdentityModel.OidcClient": { + "type": "Transitive", + "resolved": "5.2.1", + "contentHash": "OuPhDNAw/EoJVEmYO6/ChZUBcug4OGoGKTKLUyBCsGhlKegxJk25LYQ0EL7GCBMgkEL+BYNJukNZyaJ+JNaWog==", + "dependencies": { + "IdentityModel": "5.2.0" + } + }, "KubernetesClient": { "type": "Transitive", - "resolved": "19.0.2", - "contentHash": "0m8FuzCDBygaXMbsb7qVapNZzTm4ftM7ECp/waTRh/XOUQziRF2rKJCRmsvYbBXgJkQvU+FBbkoa40hexzDC+g==", + "resolved": "15.0.1", + "contentHash": "IOsMJaBpiHELr7ZeiJQypdtLDbc/HqxbEh9UMaDvLpBvGIzS+KhjA0LJVEbGgvubmhWHxLPfgHAL0le1zr2RwA==", "dependencies": { "Fractions": "7.3.0", - "YamlDotNet": "16.3.0" + "IdentityModel.OidcClient": "5.2.1", + "System.IdentityModel.Tokens.Jwt": "7.1.2", + "YamlDotNet": "16.0.0" } }, "Macross.Json.Extensions": { @@ -1278,8 +1293,8 @@ }, "YamlDotNet": { "type": "Transitive", - "resolved": "16.3.0", - "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" + "resolved": "16.0.0", + "contentHash": "kZ4jR5ltFhnjaUqK9x81zXRIUTH4PTXTTEmJDNQdkDLQhcv+2Nl19r0dCSvPW1mstOYBfXTnjdieRbUO6gHMDw==" }, "ark.reference.common": { "type": "Project", @@ -1354,6 +1369,8 @@ "Asp.Versioning.Http": "[10.0.0, )", "Asp.Versioning.Mvc.ApiExplorer": "[10.0.0, )", "Asp.Versioning.OData.ApiExplorer": "[10.0.0-rc.1, )", + "AspNetCore.HealthChecks.UI": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "FluentValidation": "[12.1.1, )", "Hellang.Middleware.ProblemDetails": "[6.5.1, )", "Microsoft.AspNetCore.OData": "[10.0.0-preview.2, )", @@ -1393,12 +1410,9 @@ "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", - "AspNetCore.HealthChecks.UI": "[9.0.0, )", "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", - "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "Azure.Identity": "[1.21.0, )", "Azure.Messaging.ServiceBus": "[7.20.2, )", - "KubernetesClient": "[19.0.2, )", "Microsoft.ApplicationInsights": "[2.23.0, )" } }, diff --git a/samples/ProblemDetailsSample/packages.lock.json b/samples/ProblemDetailsSample/packages.lock.json index d46862523..4acfe9c57 100644 --- a/samples/ProblemDetailsSample/packages.lock.json +++ b/samples/ProblemDetailsSample/packages.lock.json @@ -501,6 +501,8 @@ "Asp.Versioning.Http": "[10.0.0, )", "Asp.Versioning.Mvc.ApiExplorer": "[10.0.0, )", "Asp.Versioning.OData.ApiExplorer": "[10.0.0-rc.1, )", + "AspNetCore.HealthChecks.UI": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "FluentValidation": "[12.1.1, )", "Hellang.Middleware.ProblemDetails": "[6.5.1, )", "Microsoft.AspNetCore.OData": "[10.0.0-preview.2, )", @@ -540,12 +542,9 @@ "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", - "AspNetCore.HealthChecks.UI": "[9.0.0, )", "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", - "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "Azure.Identity": "[1.21.0, )", "Azure.Messaging.ServiceBus": "[7.20.2, )", - "KubernetesClient": "[19.0.2, )", "Microsoft.ApplicationInsights": "[2.23.0, )" } }, diff --git a/samples/TestLinkGenerator/packages.lock.json b/samples/TestLinkGenerator/packages.lock.json index 4a2079b42..b64a38001 100644 --- a/samples/TestLinkGenerator/packages.lock.json +++ b/samples/TestLinkGenerator/packages.lock.json @@ -616,6 +616,8 @@ "Asp.Versioning.Http": "[10.0.0, )", "Asp.Versioning.Mvc.ApiExplorer": "[10.0.0, )", "Asp.Versioning.OData.ApiExplorer": "[10.0.0-rc.1, )", + "AspNetCore.HealthChecks.UI": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "FluentValidation": "[12.1.1, )", "Hellang.Middleware.ProblemDetails": "[6.5.1, )", "Microsoft.AspNetCore.OData": "[10.0.0-preview.2, )", @@ -655,12 +657,9 @@ "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", - "AspNetCore.HealthChecks.UI": "[9.0.0, )", "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", - "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "Azure.Identity": "[1.21.0, )", "Azure.Messaging.ServiceBus": "[7.20.2, )", - "KubernetesClient": "[19.0.2, )", "Microsoft.ApplicationInsights": "[2.23.0, )" } }, diff --git a/samples/WebApplicationDemo/packages.lock.json b/samples/WebApplicationDemo/packages.lock.json index 44a214ad6..d7f2667fb 100644 --- a/samples/WebApplicationDemo/packages.lock.json +++ b/samples/WebApplicationDemo/packages.lock.json @@ -652,6 +652,8 @@ "Asp.Versioning.Http": "[10.0.0, )", "Asp.Versioning.Mvc.ApiExplorer": "[10.0.0, )", "Asp.Versioning.OData.ApiExplorer": "[10.0.0-rc.1, )", + "AspNetCore.HealthChecks.UI": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "FluentValidation": "[12.1.1, )", "Hellang.Middleware.ProblemDetails": "[6.5.1, )", "Microsoft.AspNetCore.OData": "[10.0.0-preview.2, )", @@ -691,12 +693,9 @@ "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", - "AspNetCore.HealthChecks.UI": "[9.0.0, )", "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", - "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "Azure.Identity": "[1.21.0, )", "Azure.Messaging.ServiceBus": "[7.20.2, )", - "KubernetesClient": "[19.0.2, )", "Microsoft.ApplicationInsights": "[2.23.0, )" } }, diff --git a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/Ark.Tools.AspNetCore.HealthChecks.csproj b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/Ark.Tools.AspNetCore.HealthChecks.csproj index c7dc136ec..2c2932da0 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/Ark.Tools.AspNetCore.HealthChecks.csproj +++ b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/Ark.Tools.AspNetCore.HealthChecks.csproj @@ -37,14 +37,10 @@ - - - - @@ -53,10 +49,4 @@ - - - Always - - - diff --git a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckExtension.cs b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckExtension.cs index 8021ce94b..211b876cf 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckExtension.cs +++ b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckExtension.cs @@ -1,6 +1,6 @@ using HealthChecks.Network; using HealthChecks.Network.Core; -using HealthChecks.UI.Configuration; +using HealthChecks.UI.Client; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics.HealthChecks; @@ -25,51 +25,12 @@ public static IServiceCollection AddArkHealthChecks(this IServiceCollection serv return services; } - public static IServiceCollection AddArkHealthChecksUI(this IServiceCollection services) - { - services.AddHealthChecksUI(setupSettings: setup => - { - setup.SetEvaluationTimeInSeconds(60); - setup.MaximumHistoryEntriesPerEndpoint(50); - setup.AddHealthCheckEndpoint("Health Checks", "/healthCheck"); - } - ).AddInMemoryStorage(); - - services.AddArkHealthChecksUIOptions(o => - { - if (File.Exists(Path.Combine(Environment.CurrentDirectory, "UIHealthChecks.css"))) - o.AddCustomStylesheet("UIHealthChecks.css"); - var binPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UIHealthChecks.css"); - if (File.Exists(binPath)) - o.AddCustomStylesheet(binPath); - }); - - return services; - } - - public static IServiceCollection AddArkHealthChecksUIOptions(this IServiceCollection services, Action setup) - { - return services.AddSingleton(setup); - } - public static IEndpointRouteBuilder MapArkHealthChecks(this IEndpointRouteBuilder endpoints) { endpoints.MapHealthChecks("/healthCheck", new HealthCheckOptions { Predicate = _ => true, - ResponseWriter = ArkHealthCheckResponseWriter.WriteResponseAsync, - }); - - return endpoints; - } - - public static IEndpointRouteBuilder MapArkHealthChecksUI(this IEndpointRouteBuilder endpoints) - { - endpoints.MapHealthChecksUI(setup => - { - var configurers = endpoints.ServiceProvider.GetServices>(); - foreach (var c in configurers) - c?.Invoke(setup); + ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponseNoExceptionDetails, }); return endpoints; diff --git a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckResponseWriter.cs b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckResponseWriter.cs deleted file mode 100644 index 7101c8928..000000000 --- a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckResponseWriter.cs +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (C) 2024 Ark Energy S.r.l. All rights reserved. -// Licensed under the MIT License. See LICENSE file for license information. - -using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Diagnostics.HealthChecks; - -namespace Ark.Tools.AspNetCore.HealthChecks; - -/// Writes the shared JSON response for Ark health-check endpoints. -public static class ArkHealthCheckResponseWriter -{ - /// Writes a JSON health report response. - /// The current HTTP context. - /// The health report to serialize. - public static async Task WriteResponseAsync(HttpContext context, HealthReport healthReport) - { - ArgumentNullException.ThrowIfNull(context); - ArgumentNullException.ThrowIfNull(healthReport); - - context.Response.ContentType = "application/json; charset=utf-8"; - - var jsonWriter = new System.Text.Json.Utf8JsonWriter(context.Response.Body, new System.Text.Json.JsonWriterOptions { Indented = true }); - await using (jsonWriter.ConfigureAwait(false)) - { - jsonWriter.WriteStartObject(); - jsonWriter.WriteString("status", healthReport.Status.ToString()); - jsonWriter.WriteStartObject("results"); - - foreach (var entry in healthReport.Entries) - { - jsonWriter.WriteStartObject(entry.Key); - jsonWriter.WriteString("status", entry.Value.Status.ToString()); - jsonWriter.WriteString("description", entry.Value.Description); - // Intentionally omit exception details from the HTTP response. - jsonWriter.WriteStartObject("data"); - - foreach (var item in entry.Value.Data) - { - jsonWriter.WritePropertyName(item.Key); - WriteValue(jsonWriter, item.Value); - } - - jsonWriter.WriteEndObject(); - jsonWriter.WriteEndObject(); - - } - - jsonWriter.WriteEndObject(); - jsonWriter.WriteEndObject(); - - await jsonWriter.FlushAsync(context.RequestAborted).ConfigureAwait(false); - } - } - - private static void WriteValue(System.Text.Json.Utf8JsonWriter jsonWriter, object? value) - { - ArgumentNullException.ThrowIfNull(jsonWriter); - - switch (value) - { - case null: - jsonWriter.WriteNullValue(); - break; - case string stringValue: - jsonWriter.WriteStringValue(stringValue); - break; - case bool boolValue: - jsonWriter.WriteBooleanValue(boolValue); - break; - case byte byteValue: - jsonWriter.WriteNumberValue(byteValue); - break; - case sbyte sbyteValue: - jsonWriter.WriteNumberValue(sbyteValue); - break; - case short shortValue: - jsonWriter.WriteNumberValue(shortValue); - break; - case ushort ushortValue: - jsonWriter.WriteNumberValue(ushortValue); - break; - case int intValue: - jsonWriter.WriteNumberValue(intValue); - break; - case uint uintValue: - jsonWriter.WriteNumberValue(uintValue); - break; - case long longValue: - jsonWriter.WriteNumberValue(longValue); - break; - case ulong ulongValue: - jsonWriter.WriteNumberValue(ulongValue); - break; - case float floatValue: - jsonWriter.WriteNumberValue(floatValue); - break; - case double doubleValue: - jsonWriter.WriteNumberValue(doubleValue); - break; - case decimal decimalValue: - jsonWriter.WriteNumberValue(decimalValue); - break; - default: - jsonWriter.WriteStringValue(value.ToString()); - break; - } - } -} diff --git a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/packages.lock.json b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/packages.lock.json index c138911e6..b140af82b 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/packages.lock.json +++ b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/packages.lock.json @@ -47,17 +47,6 @@ "Microsoft.Data.SqlClient": "5.2.2" } }, - "AspNetCore.HealthChecks.UI": { - "type": "Direct", - "requested": "[9.0.0, )", - "resolved": "9.0.0", - "contentHash": "r/bGIiFDm/Bv+S/OCcE1/YzM4Zul1nEKGRA42xcGqxaYmaQf1T+gFEReNNA+5nHXuXt5TRuBuVag1emXuwqe6w==", - "dependencies": { - "AspNetCore.HealthChecks.UI.Data": "9.0.0", - "KubernetesClient": "15.0.1", - "Microsoft.EntityFrameworkCore.Design": "8.0.11" - } - }, "AspNetCore.HealthChecks.UI.Client": { "type": "Direct", "requested": "[9.0.0, )", @@ -67,16 +56,6 @@ "AspNetCore.HealthChecks.UI.Core": "9.0.0" } }, - "AspNetCore.HealthChecks.UI.InMemory.Storage": { - "type": "Direct", - "requested": "[9.0.0, )", - "resolved": "9.0.0", - "contentHash": "xuq+HBH8Ckz9r5d+yP1pk7cgIbPLBqCGfYu0MxtvbtsxIo7cv5nQoUCJsdgqN5/a4ndVUJZco6GjWFk6r4xN1w==", - "dependencies": { - "AspNetCore.HealthChecks.UI.Data": "9.0.0", - "Microsoft.EntityFrameworkCore.InMemory": "8.0.11" - } - }, "Azure.Identity": { "type": "Direct", "requested": "[1.21.0, )", @@ -103,16 +82,6 @@ "resolved": "0.1.2", "contentHash": "RQdzUtFVhwLwisP2Du7Ugm7ldwAzc+QJrlZWNIwHXcgq4b5fLwZgdN1203RdYiHS8OOALophC6yWekxu3UgN2g==" }, - "KubernetesClient": { - "type": "Direct", - "requested": "[19.0.2, )", - "resolved": "19.0.2", - "contentHash": "0m8FuzCDBygaXMbsb7qVapNZzTm4ftM7ECp/waTRh/XOUQziRF2rKJCRmsvYbBXgJkQvU+FBbkoa40hexzDC+g==", - "dependencies": { - "Fractions": "7.3.0", - "YamlDotNet": "16.3.0" - } - }, "Meziantou.Analyzer": { "type": "Direct", "requested": "[3.0.125, )", @@ -177,15 +146,6 @@ "resolved": "9.0.0", "contentHash": "TVriy4hgYnhfqz6NAzv8qe62Q8wf82iKUL6WV9selqeFZTq1ILi39Sic6sFQegRysvAVcnxKP/vY8z9Fk8x6XQ==" }, - "AspNetCore.HealthChecks.UI.Data": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "bZkXUdiqXOkmhe3XHF+OIgPQKR8OXS8/+iDWegmxSXtbaIYwsT5+B0URT+P4OPvhj5tR2goMMZe5KwJBVHr+1g==", - "dependencies": { - "AspNetCore.HealthChecks.UI.Core": "9.0.0", - "Microsoft.EntityFrameworkCore": "8.0.0" - } - }, "Azure.Core": { "type": "Transitive", "resolved": "1.60.0", @@ -212,16 +172,6 @@ "resolved": "2.6.2", "contentHash": "7oWOcvnntmMKNzDLsdxAYqApt+AjpRpP2CShjMfIa3umZ42UQMvH0tl1qAliYPNYO6vTdcGMqnRrCPmsfzTI1w==" }, - "Fractions": { - "type": "Transitive", - "resolved": "7.3.0", - "contentHash": "2bETFWLBc8b7Ut2SVi+bxhGVwiSpknHYGBh2PADyGWONLkTxT7bKyDRhF8ao+XUv90tq8Fl7GTPxSI5bacIRJw==" - }, - "Humanizer.Core": { - "type": "Transitive", - "resolved": "2.14.1", - "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" - }, "Microsoft.Azure.Amqp": { "type": "Transitive", "resolved": "2.7.0", @@ -245,11 +195,6 @@ "System.IO.Hashing": "10.0.10" } }, - "Microsoft.CodeAnalysis.Analyzers": { - "type": "Transitive", - "resolved": "3.11.0", - "contentHash": "v/EW3UE8/lbEYHoC2Qq7AR/DnmvpgdtAMndfQNmpuIMx/Mto8L5JnuCfdBYtgvalQOtfNCnxFejxuRrryvUTsg==" - }, "Microsoft.Data.SqlClient.Extensions.Abstractions": { "type": "Transitive", "resolved": "7.0.2", @@ -268,58 +213,6 @@ "resolved": "6.0.2", "contentHash": "f+pRODTWX7Y67jXO3T5S2dIPZ9qMJNySjlZT/TKmWVNWe19N8jcWmHaqHnnchaq3gxEKv1SWVY5EFzOD06l41w==" }, - "Microsoft.EntityFrameworkCore": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "stbjWBTtpQ1HtqXMFyKnXFTr76PvaOHI2b2h85JqBi3eZr00nspvR/a90Zwh8CQ4rVawqLiTG0+0yZQWaav+sQ==", - "dependencies": { - "Microsoft.EntityFrameworkCore.Abstractions": "8.0.11", - "Microsoft.EntityFrameworkCore.Analyzers": "8.0.11" - } - }, - "Microsoft.EntityFrameworkCore.Abstractions": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "++zY0Ea724ku1jptWJmF7jm3I4IXTexfT4qi1ETcSFFF7qj+qm6rRgN7mTuKkwIETuXk0ikfzudryRjUGrrNKQ==" - }, - "Microsoft.EntityFrameworkCore.Analyzers": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "NI/AJQjtC7qgWM8Nr85sRkwlog2AnFer5RKP8xTUH0RuPF3nN0tGXBEeYJOLZWp+/+M/C6O7MMDRhKRE8bZwIA==" - }, - "Microsoft.EntityFrameworkCore.Design": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "KxOvpbaKiUmbLvenr0T/4F1Vdm0Sq+iajLbesQK7/WKB/Dx+FQHCZ0f5jCXrVWK2QKF9eHzQ5JPA1L6hcb25FQ==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0", - "Microsoft.EntityFrameworkCore.Relational": "8.0.11", - "Microsoft.Extensions.DependencyModel": "8.0.2", - "Mono.TextTemplating": "2.2.1" - } - }, - "Microsoft.EntityFrameworkCore.InMemory": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "gFFdubZlRfudSw94OxO7s8OvLQZncnR0S1ll//wRtZP3mMYVeq8DrMnEILK6hBJwbTBB1SNm3apg9SdvdE/ySg==", - "dependencies": { - "Microsoft.EntityFrameworkCore": "8.0.11" - } - }, - "Microsoft.EntityFrameworkCore.Relational": { - "type": "Transitive", - "resolved": "8.0.11", - "contentHash": "3TuuW3i5I4Ro0yoaHmi2MqEDGObOVuhLaMEnd/heaLB1fcvm4fu4PevmC4BOWnI0vo176AIlV5o4rEQciLoohw==", - "dependencies": { - "Microsoft.EntityFrameworkCore": "8.0.11" - } - }, - "Microsoft.Extensions.DependencyModel": { - "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==" - }, "Microsoft.IdentityModel.Abstractions": { "type": "Transitive", "resolved": "8.21.0", @@ -352,14 +245,6 @@ "resolved": "1.0.0", "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" }, - "Mono.TextTemplating": { - "type": "Transitive", - "resolved": "2.2.1", - "contentHash": "KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==", - "dependencies": { - "System.CodeDom": "4.4.0" - } - }, "System.ClientModel": { "type": "Transitive", "resolved": "1.14.0", @@ -368,59 +253,6 @@ "System.Memory.Data": "10.0.3" } }, - "System.CodeDom": { - "type": "Transitive", - "resolved": "4.4.0", - "contentHash": "2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==" - }, - "System.Composition": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "3Djj70fFTraOarSKmRnmRy/zm4YurICm+kiCtI0dYRqGJnLX6nJ+G3WYuFJ173cAPax/gh96REcbNiVqcrypFQ==", - "dependencies": { - "System.Composition.AttributedModel": "9.0.0", - "System.Composition.Convention": "9.0.0", - "System.Composition.Hosting": "9.0.0", - "System.Composition.Runtime": "9.0.0", - "System.Composition.TypedParts": "9.0.0" - } - }, - "System.Composition.AttributedModel": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "iri00l/zIX9g4lHMY+Nz0qV1n40+jFYAmgsaiNn16xvt2RDwlqByNG4wgblagnDYxm3YSQQ0jLlC/7Xlk9CzyA==" - }, - "System.Composition.Convention": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "+vuqVP6xpi582XIjJi6OCsIxuoTZfR0M7WWufk3uGDeCl3wGW6KnpylUJ3iiXdPByPE0vR5TjJgR6hDLez4FQg==", - "dependencies": { - "System.Composition.AttributedModel": "9.0.0" - } - }, - "System.Composition.Hosting": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "OFqSeFeJYr7kHxDfaViGM1ymk7d4JxK//VSoNF9Ux0gpqkLsauDZpu89kTHHNdCWfSljbFcvAafGyBoY094btQ==", - "dependencies": { - "System.Composition.Runtime": "9.0.0" - } - }, - "System.Composition.Runtime": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "w1HOlQY1zsOWYussjFGZCEYF2UZXgvoYnS94NIu2CBnAGMbXFAX8PY8c92KwUItPmowal68jnVLBCzdrWLeEKA==" - }, - "System.Composition.TypedParts": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "aRZlojCCGEHDKqh43jaDgaVpYETsgd7Nx4g1zwLKMtv4iTo0627715ajEFNpEEBTgLmvZuv8K0EVxc3sM4NWJA==", - "dependencies": { - "System.Composition.AttributedModel": "9.0.0", - "System.Composition.Hosting": "9.0.0", - "System.Composition.Runtime": "9.0.0" - } - }, "System.Diagnostics.PerformanceCounter": { "type": "Transitive", "resolved": "8.0.0", @@ -454,11 +286,6 @@ "resolved": "10.0.10", "contentHash": "BKt0SQgq2lq3ESE68jkeLwv95ypANrPDtkTOIFGcnhg2aRUeUUBDrQlkVDZctrg1WenVcvn5P5XZnuYI7q6rFQ==" }, - "YamlDotNet": { - "type": "Transitive", - "resolved": "16.3.0", - "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" - }, "ark.tools.core": { "type": "Project", "dependencies": { @@ -498,51 +325,6 @@ "resolved": "3.0.0", "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" }, - "Microsoft.CodeAnalysis.Common": { - "type": "CentralTransitive", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "PC3tuwZYnC+idaPuoC/AZpEdwrtX7qFpmnrfQkgobGIWiYmGi5MCRtl5mx6QrfMGQpK78X2lfIEoZDLg/qnuHg==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.11.0" - } - }, - "Microsoft.CodeAnalysis.CSharp": { - "type": "CentralTransitive", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "568a6wcTivauIhbeWcCwfWwIn7UV7MeHEBvFB2uzGIpM2OhJ4eM/FZ8KS0yhPoNxnSpjGzz7x7CIjTxhslojQA==", - "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.11.0", - "Microsoft.CodeAnalysis.Common": "[4.14.0]" - } - }, - "Microsoft.CodeAnalysis.CSharp.Workspaces": { - "type": "CentralTransitive", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "QkgCEM4qJo6gdtblXtNgHqtykS61fxW+820hx5JN6n9DD4mQtqNB+6fPeJ3GQWg6jkkGz6oG9yZq7H3Gf0zwYw==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.CodeAnalysis.Analyzers": "3.11.0", - "Microsoft.CodeAnalysis.CSharp": "[4.14.0]", - "Microsoft.CodeAnalysis.Common": "[4.14.0]", - "Microsoft.CodeAnalysis.Workspaces.Common": "[4.14.0]", - "System.Composition": "9.0.0" - } - }, - "Microsoft.CodeAnalysis.Workspaces.Common": { - "type": "CentralTransitive", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "wNVK9JrqjqDC/WgBUFV6henDfrW87NPfo98nzah/+M/G1D6sBOPtXwqce3UQNn+6AjTnmkHYN1WV9XmTlPemTw==", - "dependencies": { - "Humanizer.Core": "2.14.1", - "Microsoft.CodeAnalysis.Analyzers": "3.11.0", - "Microsoft.CodeAnalysis.Common": "[4.14.0]", - "System.Composition": "9.0.0" - } - }, "Microsoft.Data.SqlClient": { "type": "CentralTransitive", "requested": "[7.0.2, )", diff --git a/src/aspnetcore/Ark.Tools.AspNetCore/Ark.Tools.AspNetCore.csproj b/src/aspnetcore/Ark.Tools.AspNetCore/Ark.Tools.AspNetCore.csproj index 159d7a800..ef679b57c 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore/Ark.Tools.AspNetCore.csproj +++ b/src/aspnetcore/Ark.Tools.AspNetCore/Ark.Tools.AspNetCore.csproj @@ -31,6 +31,8 @@ + + @@ -58,4 +60,10 @@ + + + Always + + + diff --git a/src/aspnetcore/Ark.Tools.AspNetCore/ArkHealthChecksUIExtension.cs b/src/aspnetcore/Ark.Tools.AspNetCore/ArkHealthChecksUIExtension.cs new file mode 100644 index 000000000..bfcb29c66 --- /dev/null +++ b/src/aspnetcore/Ark.Tools.AspNetCore/ArkHealthChecksUIExtension.cs @@ -0,0 +1,63 @@ +// Copyright (C) 2024 Ark Energy S.r.l. All rights reserved. +// Licensed under the MIT License. See LICENSE file for license information. + +using HealthChecks.UI.Configuration; + +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.DependencyInjection; + +namespace Ark.Tools.AspNetCore.HealthChecks; + +/// Provides extensions for the Ark Health Checks UI. +public static class ArkHealthChecksUIExtension +{ + /// Adds the Ark Health Checks UI services. + /// The service collection. + /// The service collection. + public static IServiceCollection AddArkHealthChecksUI(this IServiceCollection services) + { + services.AddHealthChecksUI(setupSettings: setup => + { + setup.SetEvaluationTimeInSeconds(60); + setup.MaximumHistoryEntriesPerEndpoint(50); + setup.AddHealthCheckEndpoint("Health Checks", "/healthCheck"); + } + ).AddInMemoryStorage(); + + services.AddArkHealthChecksUIOptions(o => + { + if (File.Exists(Path.Combine(Environment.CurrentDirectory, "UIHealthChecks.css"))) + o.AddCustomStylesheet("UIHealthChecks.css"); + var binPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UIHealthChecks.css"); + if (File.Exists(binPath)) + o.AddCustomStylesheet(binPath); + }); + + return services; + } + + /// Configures the Ark Health Checks UI. + /// The service collection. + /// The UI configuration action. + /// The service collection. + public static IServiceCollection AddArkHealthChecksUIOptions(this IServiceCollection services, Action setup) + { + return services.AddSingleton(setup); + } + + /// Maps the Ark Health Checks UI endpoints. + /// The endpoint route builder. + /// The endpoint route builder. + public static IEndpointRouteBuilder MapArkHealthChecksUI(this IEndpointRouteBuilder endpoints) + { + endpoints.MapHealthChecksUI(setup => + { + var configurers = endpoints.ServiceProvider.GetServices>(); + foreach (var c in configurers) + c?.Invoke(setup); + }); + + return endpoints; + } +} diff --git a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/UIHealthChecks.css b/src/aspnetcore/Ark.Tools.AspNetCore/UIHealthChecks.css similarity index 95% rename from src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/UIHealthChecks.css rename to src/aspnetcore/Ark.Tools.AspNetCore/UIHealthChecks.css index 67e7a35bc..08bb6403f 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/UIHealthChecks.css +++ b/src/aspnetcore/Ark.Tools.AspNetCore/UIHealthChecks.css @@ -1,4 +1,4 @@ -:root { +:root { --primaryColor: #68217a; --secondaryColor: #f4f4f4; --bgMenuActive: #8e47a0; diff --git a/src/aspnetcore/Ark.Tools.AspNetCore/packages.lock.json b/src/aspnetcore/Ark.Tools.AspNetCore/packages.lock.json index 18f51c35e..1c80c27dc 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore/packages.lock.json +++ b/src/aspnetcore/Ark.Tools.AspNetCore/packages.lock.json @@ -30,6 +30,27 @@ "Asp.Versioning.OData": "10.0.0-rc.1" } }, + "AspNetCore.HealthChecks.UI": { + "type": "Direct", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "r/bGIiFDm/Bv+S/OCcE1/YzM4Zul1nEKGRA42xcGqxaYmaQf1T+gFEReNNA+5nHXuXt5TRuBuVag1emXuwqe6w==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Data": "9.0.0", + "KubernetesClient": "15.0.1", + "Microsoft.EntityFrameworkCore.Design": "8.0.11" + } + }, + "AspNetCore.HealthChecks.UI.InMemory.Storage": { + "type": "Direct", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "xuq+HBH8Ckz9r5d+yP1pk7cgIbPLBqCGfYu0MxtvbtsxIo7cv5nQoUCJsdgqN5/a4ndVUJZco6GjWFk6r4xN1w==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Data": "9.0.0", + "Microsoft.EntityFrameworkCore.InMemory": "8.0.11" + } + }, "ErrorProne.NET.CoreAnalyzers": { "type": "Direct", "requested": "[0.1.2, )", @@ -656,12 +677,9 @@ "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", - "AspNetCore.HealthChecks.UI": "[9.0.0, )", "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", - "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "Azure.Identity": "[1.21.0, )", "Azure.Messaging.ServiceBus": "[7.20.2, )", - "KubernetesClient": "[19.0.2, )", "Microsoft.ApplicationInsights": "[2.23.0, )" } }, @@ -851,17 +869,6 @@ "Microsoft.Data.SqlClient": "5.2.2" } }, - "AspNetCore.HealthChecks.UI": { - "type": "CentralTransitive", - "requested": "[9.0.0, )", - "resolved": "9.0.0", - "contentHash": "r/bGIiFDm/Bv+S/OCcE1/YzM4Zul1nEKGRA42xcGqxaYmaQf1T+gFEReNNA+5nHXuXt5TRuBuVag1emXuwqe6w==", - "dependencies": { - "AspNetCore.HealthChecks.UI.Data": "9.0.0", - "KubernetesClient": "15.0.1", - "Microsoft.EntityFrameworkCore.Design": "8.0.11" - } - }, "AspNetCore.HealthChecks.UI.Client": { "type": "CentralTransitive", "requested": "[9.0.0, )", @@ -871,16 +878,6 @@ "AspNetCore.HealthChecks.UI.Core": "9.0.0" } }, - "AspNetCore.HealthChecks.UI.InMemory.Storage": { - "type": "CentralTransitive", - "requested": "[9.0.0, )", - "resolved": "9.0.0", - "contentHash": "xuq+HBH8Ckz9r5d+yP1pk7cgIbPLBqCGfYu0MxtvbtsxIo7cv5nQoUCJsdgqN5/a4ndVUJZco6GjWFk6r4xN1w==", - "dependencies": { - "AspNetCore.HealthChecks.UI.Data": "9.0.0", - "Microsoft.EntityFrameworkCore.InMemory": "8.0.11" - } - }, "Auth0.AuthenticationApi": { "type": "CentralTransitive", "requested": "[7.48.0, )", diff --git a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/Ark.Tools.MediatorFramework.AzureFunctions.csproj b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/Ark.Tools.MediatorFramework.AzureFunctions.csproj index d121dbc2d..dcb95e0d2 100644 --- a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/Ark.Tools.MediatorFramework.AzureFunctions.csproj +++ b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/Ark.Tools.MediatorFramework.AzureFunctions.csproj @@ -14,6 +14,7 @@ + @@ -24,7 +25,6 @@ - diff --git a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsHttp.cs b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsHttp.cs index 8effb47b4..cb0efafca 100644 --- a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsHttp.cs +++ b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/ArkAzureFunctionsHttp.cs @@ -1,7 +1,7 @@ // Copyright (C) 2024 Ark Energy S.r.l. All rights reserved. // Licensed under the MIT License. See LICENSE file for license information. -using Ark.Tools.AspNetCore.HealthChecks; +using HealthChecks.UI.Client; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Diagnostics.HealthChecks; @@ -108,7 +108,7 @@ public static async Task CheckHealthAsync( httpContext.Response.Headers.CacheControl = "no-store, no-cache"; httpContext.Response.Headers.Pragma = "no-cache"; httpContext.Response.Headers.Expires = "Thu, 01 Jan 1970 00:00:00 GMT"; - await ArkHealthCheckResponseWriter.WriteResponseAsync(httpContext, report).ConfigureAwait(false); + await UIResponseWriter.WriteHealthCheckUIResponseNoExceptionDetails(httpContext, report).ConfigureAwait(false); }); } diff --git a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/packages.lock.json b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/packages.lock.json index e5b960118..1a88cc9c0 100644 --- a/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/packages.lock.json +++ b/src/mediator-framework/Ark.Tools.MediatorFramework.AzureFunctions/packages.lock.json @@ -2,6 +2,15 @@ "version": 2, "dependencies": { "net10.0": { + "AspNetCore.HealthChecks.UI.Client": { + "type": "Direct", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "1Ub3Wvvbz7CMuFNWgLEc9qqQibiMoovDML/WHrwr5J83RPgtI20giCR92s/ipLgu7IIuqw+W/y7WpIeHqAICxg==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Core": "9.0.0" + } + }, "ErrorProne.NET.CoreAnalyzers": { "type": "Direct", "requested": "[0.1.2, )", @@ -89,6 +98,11 @@ "resolved": "5.6.0", "contentHash": "6LAI0eDUtm57Ruvnoqf9FpZ7YXEHtUnsupIyYsPyeVKEDwGEsXWbNk/8z1HhI3YCiLvyPxcov4eqcs7Fb5bD1A==" }, + "AspNetCore.HealthChecks.UI.Core": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "TVriy4hgYnhfqz6NAzv8qe62Q8wf82iKUL6WV9selqeFZTq1ILi39Sic6sFQegRysvAVcnxKP/vY8z9Fk8x6XQ==" + }, "Azure.Core": { "type": "Transitive", "resolved": "1.44.1", diff --git a/tests/Ark.Tools.AspNetCore.ProblemDetails.Tests/packages.lock.json b/tests/Ark.Tools.AspNetCore.ProblemDetails.Tests/packages.lock.json index a5c3ef156..29d753b2c 100644 --- a/tests/Ark.Tools.AspNetCore.ProblemDetails.Tests/packages.lock.json +++ b/tests/Ark.Tools.AspNetCore.ProblemDetails.Tests/packages.lock.json @@ -1040,6 +1040,8 @@ "Asp.Versioning.Http": "[10.0.0, )", "Asp.Versioning.Mvc.ApiExplorer": "[10.0.0, )", "Asp.Versioning.OData.ApiExplorer": "[10.0.0-rc.1, )", + "AspNetCore.HealthChecks.UI": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "FluentValidation": "[12.1.1, )", "Hellang.Middleware.ProblemDetails": "[6.5.1, )", "Microsoft.AspNetCore.OData": "[10.0.0-preview.2, )", @@ -1079,12 +1081,9 @@ "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", - "AspNetCore.HealthChecks.UI": "[9.0.0, )", "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", - "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "Azure.Identity": "[1.21.0, )", "Azure.Messaging.ServiceBus": "[7.20.2, )", - "KubernetesClient": "[19.0.2, )", "Microsoft.ApplicationInsights": "[2.23.0, )" } }, diff --git a/tests/Ark.Tools.MediatorFramework.Tests/packages.lock.json b/tests/Ark.Tools.MediatorFramework.Tests/packages.lock.json index 8c08e034c..17ac0ee12 100644 --- a/tests/Ark.Tools.MediatorFramework.Tests/packages.lock.json +++ b/tests/Ark.Tools.MediatorFramework.Tests/packages.lock.json @@ -171,6 +171,14 @@ "resolved": "11.0.1", "contentHash": "9Jqm26Yb5D833BSU6rH3taFB8Y+A67Y3GJRC6XFEBKc2ueQSfd0B4bU3cAGsUNrWUJd1V9Sgm5U7I8SNG5zJvA==" }, + "AspNetCore.HealthChecks.UI.Core": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "TVriy4hgYnhfqz6NAzv8qe62Q8wf82iKUL6WV9selqeFZTq1ILi39Sic6sFQegRysvAVcnxKP/vY8z9Fk8x6XQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, "Azure.Core": { "type": "Transitive", "resolved": "1.60.0", @@ -432,6 +440,22 @@ "Microsoft.Extensions.Options": "10.0.10" } }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "zLgN22Zp9pk8RHlwssRTexw4+a6wqOnKWN+VejdPn5Yhjql4XiBhkFo35Nu8mmqHIk/UEmmCnMGLWq75aFfkOw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.11", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "So3JUdRxozRjvQ3cxU6F3nI/i4emDnjane6yMYcJhvTTTu29ltlIdoXjkFGRceIWz8yKvuEpzXItZ0x5GvN2nQ==" + }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", "resolved": "10.0.10", @@ -761,6 +785,7 @@ "Ark.Tools.MediatorFramework": "[1.0.0, )", "Ark.Tools.Solid": "[1.0.0, )", "Ark.Tools.SystemTextJson": "[1.0.0, )", + "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", "Microsoft.Azure.Functions.Worker": "[2.52.0, )", "Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore": "[2.1.1, )", "SimpleInjector": "[5.6.0, )" @@ -903,6 +928,15 @@ "Macross.Json.Extensions": "[3.0.0, )" } }, + "AspNetCore.HealthChecks.UI.Client": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "1Ub3Wvvbz7CMuFNWgLEc9qqQibiMoovDML/WHrwr5J83RPgtI20giCR92s/ipLgu7IIuqw+W/y7WpIeHqAICxg==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Core": "9.0.0" + } + }, "Azure.Identity": { "type": "CentralTransitive", "requested": "[1.21.0, )", diff --git a/tests/WebApplicationDemo.Tests/packages.lock.json b/tests/WebApplicationDemo.Tests/packages.lock.json index 3fce39172..ec5b25210 100644 --- a/tests/WebApplicationDemo.Tests/packages.lock.json +++ b/tests/WebApplicationDemo.Tests/packages.lock.json @@ -888,6 +888,8 @@ "Asp.Versioning.Http": "[10.0.0, )", "Asp.Versioning.Mvc.ApiExplorer": "[10.0.0, )", "Asp.Versioning.OData.ApiExplorer": "[10.0.0-rc.1, )", + "AspNetCore.HealthChecks.UI": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "FluentValidation": "[12.1.1, )", "Hellang.Middleware.ProblemDetails": "[6.5.1, )", "Microsoft.AspNetCore.OData": "[10.0.0-preview.2, )", @@ -927,12 +929,9 @@ "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", - "AspNetCore.HealthChecks.UI": "[9.0.0, )", "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", - "AspNetCore.HealthChecks.UI.InMemory.Storage": "[9.0.0, )", "Azure.Identity": "[1.21.0, )", "Azure.Messaging.ServiceBus": "[7.20.2, )", - "KubernetesClient": "[19.0.2, )", "Microsoft.ApplicationInsights": "[2.23.0, )" } }, From 433401fb462f39cd71e262556626eceea8c976f6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 4 Aug 2026 08:30:39 +0000 Subject: [PATCH 14/16] fix(build): refresh dependency locks Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- .../packages.lock.json | 39 ++++++------------- .../packages.lock.json | 38 ++++++------------ .../Directory.Packages.props | 1 + 3 files changed, 25 insertions(+), 53 deletions(-) diff --git a/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.Tests/packages.lock.json b/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.Tests/packages.lock.json index 7b99fd1db..008bcd17a 100644 --- a/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.Tests/packages.lock.json +++ b/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.Tests/packages.lock.json @@ -596,31 +596,6 @@ "resolved": "2.14.1", "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" }, - "IdentityModel": { - "type": "Transitive", - "resolved": "5.2.0", - "contentHash": "nuhkbaDH9l5QzNJp2MtP3qio57MPtiRneUN8Ocr7od0JvSYaIe3gBj/vxllr11S/Qvu1AG4GZXoyv5469ewYDA==" - }, - "IdentityModel.OidcClient": { - "type": "Transitive", - "resolved": "5.2.1", - "contentHash": "OuPhDNAw/EoJVEmYO6/ChZUBcug4OGoGKTKLUyBCsGhlKegxJk25LYQ0EL7GCBMgkEL+BYNJukNZyaJ+JNaWog==", - "dependencies": { - "IdentityModel": "5.2.0", - "Microsoft.Extensions.Logging": "6.0.0" - } - }, - "KubernetesClient": { - "type": "Transitive", - "resolved": "15.0.1", - "contentHash": "IOsMJaBpiHELr7ZeiJQypdtLDbc/HqxbEh9UMaDvLpBvGIzS+KhjA0LJVEbGgvubmhWHxLPfgHAL0le1zr2RwA==", - "dependencies": { - "Fractions": "7.3.0", - "IdentityModel.OidcClient": "5.2.1", - "System.IdentityModel.Tokens.Jwt": "7.1.2", - "YamlDotNet": "16.0.0" - } - }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -2112,8 +2087,8 @@ }, "YamlDotNet": { "type": "Transitive", - "resolved": "16.0.0", - "contentHash": "kZ4jR5ltFhnjaUqK9x81zXRIUTH4PTXTTEmJDNQdkDLQhcv+2Nl19r0dCSvPW1mstOYBfXTnjdieRbUO6gHMDw==" + "resolved": "16.3.0", + "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, "ark.reference.common": { "type": "Project", @@ -2514,6 +2489,16 @@ "Azure.Storage.Common": "12.28.0" } }, + "KubernetesClient": { + "type": "CentralTransitive", + "requested": "[19.0.2, )", + "resolved": "19.0.2", + "contentHash": "0m8FuzCDBygaXMbsb7qVapNZzTm4ftM7ECp/waTRh/XOUQziRF2rKJCRmsvYbBXgJkQvU+FBbkoa40hexzDC+g==", + "dependencies": { + "Fractions": "7.3.0", + "YamlDotNet": "16.3.0" + } + }, "MailKit": { "type": "CentralTransitive", "requested": "[4.17.0, )", diff --git a/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.WebInterface/packages.lock.json b/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.WebInterface/packages.lock.json index 7dc74e6c6..18997bcb5 100644 --- a/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.WebInterface/packages.lock.json +++ b/samples/Ark.ReferenceProject/Core/Ark.Reference.Core.WebInterface/packages.lock.json @@ -356,30 +356,6 @@ "resolved": "2.14.1", "contentHash": "lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==" }, - "IdentityModel": { - "type": "Transitive", - "resolved": "5.2.0", - "contentHash": "nuhkbaDH9l5QzNJp2MtP3qio57MPtiRneUN8Ocr7od0JvSYaIe3gBj/vxllr11S/Qvu1AG4GZXoyv5469ewYDA==" - }, - "IdentityModel.OidcClient": { - "type": "Transitive", - "resolved": "5.2.1", - "contentHash": "OuPhDNAw/EoJVEmYO6/ChZUBcug4OGoGKTKLUyBCsGhlKegxJk25LYQ0EL7GCBMgkEL+BYNJukNZyaJ+JNaWog==", - "dependencies": { - "IdentityModel": "5.2.0" - } - }, - "KubernetesClient": { - "type": "Transitive", - "resolved": "15.0.1", - "contentHash": "IOsMJaBpiHELr7ZeiJQypdtLDbc/HqxbEh9UMaDvLpBvGIzS+KhjA0LJVEbGgvubmhWHxLPfgHAL0le1zr2RwA==", - "dependencies": { - "Fractions": "7.3.0", - "IdentityModel.OidcClient": "5.2.1", - "System.IdentityModel.Tokens.Jwt": "7.1.2", - "YamlDotNet": "16.0.0" - } - }, "Macross.Json.Extensions": { "type": "Transitive", "resolved": "3.0.0", @@ -1293,8 +1269,8 @@ }, "YamlDotNet": { "type": "Transitive", - "resolved": "16.0.0", - "contentHash": "kZ4jR5ltFhnjaUqK9x81zXRIUTH4PTXTTEmJDNQdkDLQhcv+2Nl19r0dCSvPW1mstOYBfXTnjdieRbUO6gHMDw==" + "resolved": "16.3.0", + "contentHash": "SgMOdxbz8X65z8hraIs6hOEdnkH6hESTAIUa7viEngHOYaH+6q5XJmwr1+yb9vJpNQ19hCQY69xbFsLtXpobQA==" }, "ark.reference.common": { "type": "Project", @@ -1655,6 +1631,16 @@ "Azure.Storage.Common": "12.28.0" } }, + "KubernetesClient": { + "type": "CentralTransitive", + "requested": "[19.0.2, )", + "resolved": "19.0.2", + "contentHash": "0m8FuzCDBygaXMbsb7qVapNZzTm4ftM7ECp/waTRh/XOUQziRF2rKJCRmsvYbBXgJkQvU+FBbkoa40hexzDC+g==", + "dependencies": { + "Fractions": "7.3.0", + "YamlDotNet": "16.3.0" + } + }, "MailKit": { "type": "CentralTransitive", "requested": "[4.17.0, )", diff --git a/samples/Ark.ReferenceProject/Directory.Packages.props b/samples/Ark.ReferenceProject/Directory.Packages.props index ed3ddd3a4..951183802 100644 --- a/samples/Ark.ReferenceProject/Directory.Packages.props +++ b/samples/Ark.ReferenceProject/Directory.Packages.props @@ -67,6 +67,7 @@ + From cb04b1e5418740cd5c969c88ed986e126e7171de Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 4 Aug 2026 08:35:46 +0000 Subject: [PATCH 15/16] test(health): match response entry schema Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- .../AzureFunctionsHttpTests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/Ark.Tools.MediatorFramework.Tests/AzureFunctionsHttpTests.cs b/tests/Ark.Tools.MediatorFramework.Tests/AzureFunctionsHttpTests.cs index 0eedaa622..9a6c743ef 100644 --- a/tests/Ark.Tools.MediatorFramework.Tests/AzureFunctionsHttpTests.cs +++ b/tests/Ark.Tools.MediatorFramework.Tests/AzureFunctionsHttpTests.cs @@ -85,7 +85,7 @@ public async Task HealthCheckUsesRegisteredService() context.Response.Body.Position = 0; var json = await JsonNode.ParseAsync(context.Response.Body, cancellationToken: CancellationToken.None); json!["status"]!.GetValue().Should().Be("Healthy"); - json!["results"]!.AsObject().Should().BeEmpty(); + json!["entries"]!.AsObject().Should().BeEmpty(); } [TestMethod] @@ -115,9 +115,9 @@ public async Task HealthCheckWritesFailedCheckDetails() context.Response.Body.Position = 0; var json = await JsonNode.ParseAsync(context.Response.Body, cancellationToken: CancellationToken.None); json!["status"]!.GetValue().Should().Be("Unhealthy"); - json["results"]!["failing"]!["status"]!.GetValue().Should().Be("Unhealthy"); - json["results"]!["failing"]!["description"]!.GetValue().Should().Be("broken"); - json["results"]!["failing"]!["data"]!["answer"]!.GetValue().Should().Be(42); + json["entries"]!["failing"]!["status"]!.GetValue().Should().Be("Unhealthy"); + json["entries"]!["failing"]!["description"]!.GetValue().Should().Be("broken"); + json["entries"]!["failing"]!["data"]!["answer"]!.GetValue().Should().Be(42); } private static async IAsyncEnumerable Values() From 7d3fd5dc0666f443cf85742d7a38e688f4a1f21e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 4 Aug 2026 09:13:39 +0000 Subject: [PATCH 16/16] fix(MinimalApi): compose health checks Co-authored-by: AndreaCuneo <5227688+AndreaCuneo@users.noreply.github.com> --- .../SampleStartup.cs | 4 +- .../packages.lock.json | 1 + .../packages.lock.json | 1 + .../ArkHealthCheckExtension.cs | 2 +- .../Ark.Tools.AspNetCore.MinimalApi.csproj | 1 + .../ArkMinimalApiHostExtensions.cs | 15 + .../packages.lock.json | 381 +++++++++++++++ .../ArkHealthChecksUIExtension.cs | 4 +- .../ArkMinimalApiHostVerificationTests.cs | 27 +- .../packages.lock.json | 435 ++++++++++++++++++ 10 files changed, 862 insertions(+), 9 deletions(-) diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/SampleStartup.cs b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/SampleStartup.cs index 0d9032590..e635e8694 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/SampleStartup.cs +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/SampleStartup.cs @@ -8,7 +8,6 @@ using Ark.Tools.AspNetCore.MessagePackFormatter; using Ark.Tools.AspNetCore.MinimalApi; using Ark.Tools.AspNetCore.ProblemDetails; -using Ark.Tools.AspNetCore.HealthChecks; using Ark.Tools.MediatorFramework.Grpc; using Ark.Tools.MediatorFramework.MinimalApi; using Ark.Tools.Rebus; @@ -130,7 +129,6 @@ public void ConfigureServices(IServiceCollection services) services.AddRouting(); services.AddControllers(); - services.AddArkHealthChecks(); var messagePackResolver = CompositeResolver.Create( MessagePack.NodaTime.NodatimeResolver.Instance, @@ -183,7 +181,7 @@ public void Configure(IApplicationBuilder app) // Source-generated endpoints for the selected [HttpEndpoint] contracts. endpoints.MapArkEndpointsFromAssembly( versionPrefix: "/api/v{version}"); - endpoints.MapArkHealthChecks(); + endpoints.MapArkMinimalApiHost(); endpoints.MapArkGrpcServicesFromAssembly(); endpoints.MapGrpcService(); endpoints.MapCodeFirstGrpcReflectionService().AllowAnonymous(); diff --git a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/packages.lock.json b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/packages.lock.json index b9d6fdebe..01f07e6f0 100644 --- a/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/packages.lock.json +++ b/samples/Ark.MediatorFramework.Sample/src/Ark.MediatorFramework.Sample.WebInterface/packages.lock.json @@ -1036,6 +1036,7 @@ "ark.tools.aspnetcore.minimalapi": { "type": "Project", "dependencies": { + "Ark.Tools.AspNetCore.HealthChecks": "[1.0.0, )", "SimpleInjector": "[5.6.0, )", "SimpleInjector.Integration.AspNetCore.Mvc.Core": "[5.5.0, )" } diff --git a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json index 25757404e..4981ada57 100644 --- a/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json +++ b/samples/Ark.MediatorFramework.Sample/test/Ark.MediatorFramework.Sample.Tests/packages.lock.json @@ -1887,6 +1887,7 @@ "ark.tools.aspnetcore.minimalapi": { "type": "Project", "dependencies": { + "Ark.Tools.AspNetCore.HealthChecks": "[1.0.0, )", "SimpleInjector": "[5.6.0, )", "SimpleInjector.Integration.AspNetCore.Mvc.Core": "[5.5.0, )" } diff --git a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckExtension.cs b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckExtension.cs index 211b876cf..5d8b26905 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckExtension.cs +++ b/src/aspnetcore/Ark.Tools.AspNetCore.HealthChecks/ArkHealthCheckExtension.cs @@ -31,7 +31,7 @@ public static IEndpointRouteBuilder MapArkHealthChecks(this IEndpointRouteBuilde { Predicate = _ => true, ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponseNoExceptionDetails, - }); + }).AllowAnonymous(); return endpoints; } diff --git a/src/aspnetcore/Ark.Tools.AspNetCore.MinimalApi/Ark.Tools.AspNetCore.MinimalApi.csproj b/src/aspnetcore/Ark.Tools.AspNetCore.MinimalApi/Ark.Tools.AspNetCore.MinimalApi.csproj index a83f6aa4a..f5cc69412 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore.MinimalApi/Ark.Tools.AspNetCore.MinimalApi.csproj +++ b/src/aspnetcore/Ark.Tools.AspNetCore.MinimalApi/Ark.Tools.AspNetCore.MinimalApi.csproj @@ -13,6 +13,7 @@ + diff --git a/src/aspnetcore/Ark.Tools.AspNetCore.MinimalApi/ArkMinimalApiHostExtensions.cs b/src/aspnetcore/Ark.Tools.AspNetCore.MinimalApi/ArkMinimalApiHostExtensions.cs index 12a14f66f..14ea7b103 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore.MinimalApi/ArkMinimalApiHostExtensions.cs +++ b/src/aspnetcore/Ark.Tools.AspNetCore.MinimalApi/ArkMinimalApiHostExtensions.cs @@ -3,9 +3,12 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Ark.Tools.AspNetCore.HealthChecks; + using SimpleInjector; namespace Ark.Tools.AspNetCore.MinimalApi; @@ -55,6 +58,7 @@ public static IServiceCollection AddArkMinimalApiHost( services.AddHttpContextAccessor(); services.AddAuthentication(); + services.AddArkHealthChecks(); services.AddAuthorization(authorization => { if (options.RequireAuthenticatedUser) @@ -107,6 +111,17 @@ public static IApplicationBuilder UseArkMinimalApiHost( return app; } + /// Maps standard Ark Minimal API endpoints. + /// The application endpoint route builder. + /// The original endpoint route builder. + public static IEndpointRouteBuilder MapArkMinimalApiHost(this IEndpointRouteBuilder endpoints) + { + ArgumentNullException.ThrowIfNull(endpoints); + + endpoints.MapArkHealthChecks(); + return endpoints; + } + private sealed class SimpleInjectorVerificationHostedService : IHostedService { private readonly Container _container; diff --git a/src/aspnetcore/Ark.Tools.AspNetCore.MinimalApi/packages.lock.json b/src/aspnetcore/Ark.Tools.AspNetCore.MinimalApi/packages.lock.json index 95b4707cc..9a89952c9 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore.MinimalApi/packages.lock.json +++ b/src/aspnetcore/Ark.Tools.AspNetCore.MinimalApi/packages.lock.json @@ -71,6 +71,52 @@ "SimpleInjector.Integration.AspNetCore": "5.5.0" } }, + "AspNetCore.HealthChecks.UI.Core": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "TVriy4hgYnhfqz6NAzv8qe62Q8wf82iKUL6WV9selqeFZTq1ILi39Sic6sFQegRysvAVcnxKP/vY8z9Fk8x6XQ==" + }, + "Azure.Core": { + "type": "Transitive", + "resolved": "1.60.0", + "contentHash": "qCa5DLAq0w14aTl9/bvMZNA/QxPzYj1a4zakrpeudxWd4D4YliRHRfccD3yFECeHkMkvQjMmyWLggb8bzhDVKA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.9", + "Microsoft.Identity.Client": "4.84.2", + "Microsoft.Identity.Client.Extensions.Msal": "4.84.2", + "System.ClientModel": "1.14.0", + "System.Memory.Data": "10.0.9" + } + }, + "Azure.Core.Amqp": { + "type": "Transitive", + "resolved": "1.3.1", + "contentHash": "AY1ZM4WwLBb9L2WwQoWs7wS2XKYg83tp3yVVdgySdebGN0FuIszuEqCy3Nhv6qHpbkjx/NGuOTsUbF/oNGBgwA==", + "dependencies": { + "Microsoft.Azure.Amqp": "2.6.7", + "System.Memory.Data": "1.0.2" + } + }, + "BouncyCastle.Cryptography": { + "type": "Transitive", + "resolved": "2.6.2", + "contentHash": "7oWOcvnntmMKNzDLsdxAYqApt+AjpRpP2CShjMfIa3umZ42UQMvH0tl1qAliYPNYO6vTdcGMqnRrCPmsfzTI1w==" + }, + "Microsoft.Azure.Amqp": { + "type": "Transitive", + "resolved": "2.7.0", + "contentHash": "gm/AEakujttMzrDhZ5QpRz3fICVkYDn/oDG9SmxDP+J7R8JDBXYU9WWG7hr6wQy40mY+wjUF0yUGXDPRDRNJwQ==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "10.0.9", + "contentHash": "Aq7M8lG6BrHeatqKqncVm9m55ec34k6nnfPRLe/PvGg+b/pAsRM2ejofeKmCLjTXMa+5NGXm382f8CG/D5WDow==" + }, + "Microsoft.Bcl.Cryptography": { + "type": "Transitive", + "resolved": "10.0.2", + "contentHash": "LG9Yll3B5aNpxv0+D47g6LiOiKBIlodhcHdQwcYzo8VeexFLGqx5ymetmA2aBRyo9cCcWsQWrFsdbsr8LvmWDw==" + }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", "resolved": "10.0.301", @@ -79,11 +125,56 @@ "System.IO.Hashing": "10.0.10" } }, + "Microsoft.Data.SqlClient.Extensions.Abstractions": { + "type": "Transitive", + "resolved": "7.0.2", + "contentHash": "Zx7z61fG2Nc6LdDn4jA7b5Aj1ABrljkOPRE31RvVUdjF6IgbG60leDUhMCafsnWFgaheiK3iqpLe+kbf5Z5L8Q==", + "dependencies": { + "Microsoft.Data.SqlClient.Internal.Logging": "[7.0.2, 8.0.0)" + } + }, + "Microsoft.Data.SqlClient.Internal.Logging": { + "type": "Transitive", + "resolved": "7.0.2", + "contentHash": "iqgYBbGSVy/DIYWjzmQOa964Kn4rs4wW5vg2IamqVK0fQqfTiILVR5hMK27XWqoyONtAZs+VxH354cPJBtSnbg==" + }, + "Microsoft.Data.SqlClient.SNI.runtime": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "f+pRODTWX7Y67jXO3T5S2dIPZ9qMJNySjlZT/TKmWVNWe19N8jcWmHaqHnnchaq3gxEKv1SWVY5EFzOD06l41w==" + }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "8.21.0", + "contentHash": "XYgEmYpUvng0oYIagDJ+uebboQSnWtCV7q9zMyXlBw6ZqLLCHcmGUb7TpXvQ3HWY4OzbOCUQm2Ac0saPSnwqSw==" + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "8.21.0", + "contentHash": "LgIWUUX386xCbvjq2ex8iXGIu2raDWrrIQ4OyYZKaNWMhzvN8YOTbAYMFJC+iHmKnkNBM8g7mLak9KQodldH3g==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.21.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "8.21.0", + "contentHash": "xFnFEl4VrhAJEbqtRrpgfAACgkm6NYo7cWYKYROH00N9/M5OYrRwTP0lHsginnLrqPrseLcSqAueQNRCyGNsdw==", + "dependencies": { + "Microsoft.Bcl.Cryptography": "10.0.2", + "Microsoft.IdentityModel.Logging": "8.21.0" + } + }, "Microsoft.SourceLink.Common": { "type": "Transitive", "resolved": "10.0.301", "contentHash": "oz44EclJdAYVZcRb9dSbWd+6RaE+8a4j5zdE+O7yw5qPRZZhu3pcpDZ/Moy6pLeIXZqBP1FMd8CSE0sgJAGV0g==" }, + "Microsoft.SqlServer.Server": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" + }, "SimpleInjector.Integration.AspNetCore": { "type": "Transitive", "resolved": "5.5.0", @@ -111,10 +202,300 @@ "SimpleInjector": "5.4.0" } }, + "System.ClientModel": { + "type": "Transitive", + "resolved": "1.14.0", + "contentHash": "yhIJHDW3Hh5kcvhHv3ww1T8qvya06Nlwo/SR/rke4/fHXtyKiqQV/9b/VDhnVI7QUcMnpfvh4pIEFhNsTDLeKQ==", + "dependencies": { + "System.Memory.Data": "10.0.3" + } + }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "7pSU+qkmdkwbikAvn4kpvClfyffaR7dYJw7ucBtO5d6m/7wgKZIULOZAGFLMIMOFFmg7xC67TYKptHxcbqQm+Q==" + }, "System.IO.Hashing": { "type": "Transitive", "resolved": "10.0.10", "contentHash": "eE839zyWZD/UBZYzP2lu9fhHX6RWe63/jz3Jxf+JumzO/db+Vc2s7CMiDwxk9ti2NTUft2tdRx31Rw2OjKbecA==" + }, + "System.Memory.Data": { + "type": "Transitive", + "resolved": "10.0.9", + "contentHash": "YweovHiLUoEdbr2Xv8eRqCSkTu1vMms4a6xBHaQiMSFVy32PL+hXv6Vhol2NWOmLHjaVgTyhJ3R52U6JxS6w3Q==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "9.0.13", + "contentHash": "dxJhkuoaelvWy588wPXjShNks+ZMiSgXnN75/u+DPbER5PqKrLPDftE0BvGM7nDK/scQAVlD+gRXlCAAjWi58Q==" + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "BKt0SQgq2lq3ESE68jkeLwv95ypANrPDtkTOIFGcnhg2aRUeUUBDrQlkVDZctrg1WenVcvn5P5XZnuYI7q6rFQ==" + }, + "ark.tools.aspnetcore.healthchecks": { + "type": "Project", + "dependencies": { + "Ark.Tools.Core": "[1.0.0, )", + "Ark.Tools.SimpleInjector": "[1.0.0, )", + "Ark.Tools.SystemTextJson": "[1.0.0, )", + "AspNetCore.HealthChecks.AzureServiceBus": "[9.0.0, )", + "AspNetCore.HealthChecks.Network": "[9.0.0, )", + "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", + "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", + "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", + "Azure.Identity": "[1.21.0, )", + "Azure.Messaging.ServiceBus": "[7.20.2, )", + "Microsoft.ApplicationInsights": "[2.23.0, )" + } + }, + "ark.tools.core": { + "type": "Project", + "dependencies": { + "NodaTime": "[3.3.3, )" + } + }, + "ark.tools.nodatime": { + "type": "Project", + "dependencies": { + "Ark.Tools.Core": "[1.0.0, )" + } + }, + "ark.tools.nodatime.systemtextjson": { + "type": "Project", + "dependencies": { + "Ark.Tools.Nodatime": "[1.0.0, )", + "NodaTime.Serialization.SystemTextJson": "[1.4.0, )" + } + }, + "ark.tools.simpleinjector": { + "type": "Project", + "dependencies": { + "SimpleInjector": "[5.6.0, )" + } + }, + "ark.tools.systemtextjson": { + "type": "Project", + "dependencies": { + "Ark.Tools.Core": "[1.0.0, )", + "Ark.Tools.Nodatime.SystemTextJson": "[1.0.0, )", + "Macross.Json.Extensions": "[3.0.0, )" + } + }, + "AspNetCore.HealthChecks.AzureServiceBus": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "Uzml9qWAvN6xPJejdTLznx9SIczKs/exieiJCU0Kjivt4ZTcsLdE3u2g8HJr0VWhguQad2mpGkwXtQ9nWfkm4g==", + "dependencies": { + "Azure.Messaging.ServiceBus": "7.17.0" + } + }, + "AspNetCore.HealthChecks.Network": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "Lke7ksxhzZK8qZhSrmxnhdOHkKInzVIdGk7JBAnROQ6M66nuO9ja6ShC0osw83oE+GZazkO+F36gfwD8HlHrXA==", + "dependencies": { + "SSH.NET": "2023.0.0" + } + }, + "AspNetCore.HealthChecks.Oracle": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "q+vhCRPgxWviMtybuJMTXxM2GzA2/h2Cm+LJyafipxVV7iDCb8uTV41E8CZ6XFJhZfZ0VIEhzE3IAL2m4i+t7g==", + "dependencies": { + "Oracle.ManagedDataAccess.Core": "3.21.120" + } + }, + "AspNetCore.HealthChecks.Publisher.ApplicationInsights": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "v2GAyHPxJQIH8mBD5bF4GQXvYODMOOb30vaMTvv6ShXnqR2K0YSjZSAMdMc+WEBcjtUvv+1o+Mv+sf9Ho+wXWw==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0" + } + }, + "AspNetCore.HealthChecks.SqlServer": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "UxCf65iCF2nU1u7AcB320abjL4CRg5swCgJECY6mKk1j5lrGMfVtskWwriGs1T29pYdRig9Vra3SPnP+4G82pA==", + "dependencies": { + "Microsoft.Data.SqlClient": "5.2.2" + } + }, + "AspNetCore.HealthChecks.UI.Client": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "1Ub3Wvvbz7CMuFNWgLEc9qqQibiMoovDML/WHrwr5J83RPgtI20giCR92s/ipLgu7IIuqw+W/y7WpIeHqAICxg==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Core": "9.0.0" + } + }, + "Azure.Identity": { + "type": "CentralTransitive", + "requested": "[1.21.0, )", + "resolved": "1.21.0", + "contentHash": "GeFv8sGwRKvDKwI2WFy8r0mhmlxEVZg24Sit2NogTjiSO8RVjllWM65OT6e1sKjOvG8V74y7hAbaELUUPjZQSw==", + "dependencies": { + "Azure.Core": "1.53.0" + } + }, + "Azure.Messaging.ServiceBus": { + "type": "CentralTransitive", + "requested": "[7.20.2, )", + "resolved": "7.20.2", + "contentHash": "mwr5c3Qs7FWUtwzlLOtVixYDpUuA+Ln7sNirljTHZR8kDhzdr2grlqx0RRBvGV+IDCRHt1jIRb+hi0MUzjeVmw==", + "dependencies": { + "Azure.Core": "1.60.0", + "Azure.Core.Amqp": "1.3.1", + "Microsoft.Azure.Amqp": "2.7.0" + } + }, + "Macross.Json.Extensions": { + "type": "CentralTransitive", + "requested": "[3.0.0, )", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, + "Microsoft.ApplicationInsights": { + "type": "CentralTransitive", + "requested": "[2.23.0, )", + "resolved": "2.23.0", + "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" + }, + "Microsoft.Data.SqlClient": { + "type": "CentralTransitive", + "requested": "[7.0.2, )", + "resolved": "7.0.2", + "contentHash": "zwv76lANFQQI6Gmp6ntkzMWIWVqm8Wf4Mz00AeGCk1n8HCi5afi6bNynSe18uI0xeL0n6J+Myjk9AiIsL5oSqw==", + "dependencies": { + "Microsoft.Bcl.Cryptography": "9.0.13", + "Microsoft.Data.SqlClient.Extensions.Abstractions": "[7.0.2, 8.0.0)", + "Microsoft.Data.SqlClient.Internal.Logging": "[7.0.2, 8.0.0)", + "Microsoft.Data.SqlClient.SNI.runtime": "[6.0.2, 7.0.0)", + "Microsoft.IdentityModel.JsonWebTokens": "8.16.0", + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "8.16.0", + "Microsoft.SqlServer.Server": "[1.0.0, 2.0.0)", + "System.Configuration.ConfigurationManager": "9.0.13", + "System.Security.Cryptography.Pkcs": "9.0.13" + } + }, + "Microsoft.Identity.Client": { + "type": "CentralTransitive", + "requested": "[4.87.0, )", + "resolved": "4.87.0", + "contentHash": "ERObBpS3b6kc92D/Z86zSd/MpWvdJu97BNamRzg5V4y59KwnxzfhM762tgiNnKoIwTbnIBOcwGPFGQ4DvShLvw==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.14.0" + } + }, + "Microsoft.Identity.Client.Extensions.Msal": { + "type": "CentralTransitive", + "requested": "[4.87.0, )", + "resolved": "4.87.0", + "contentHash": "TyBuYz7Nldl0rhC4Fza/yAM4MATEf+YG4CCh5Kl10UXeT/JOzI4yag8/juD2ZinhiQSmJl+BFzMjEWY75JCX5Q==", + "dependencies": { + "Microsoft.Identity.Client": "4.87.0", + "System.Security.Cryptography.ProtectedData": "4.5.0" + } + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "CentralTransitive", + "requested": "[8.21.0, )", + "resolved": "8.21.0", + "contentHash": "iiA5uimwlRe4Drd8YKOaB8IQkgGOjxGjO6mu5zCGFjaEBpB6yNOluZ33zJFXiW5MQYRC6ypMnOXsiR5SPrO+tw==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.21.0" + } + }, + "Microsoft.IdentityModel.Protocols": { + "type": "CentralTransitive", + "requested": "[8.21.0, )", + "resolved": "8.21.0", + "contentHash": "83hO6NhkUSaOFLeQmIzUSoCgVLhzGc+JMQZvo5sKw51NDBmVfoUPcJiMvyJtyrwTdwxNNqkcjjwhC5ktP449bw==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.21.0" + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect": { + "type": "CentralTransitive", + "requested": "[8.21.0, )", + "resolved": "8.21.0", + "contentHash": "V6A4CFcST3M6r4fFuPw2qpjZjw9QkWrN3kPCn3GT3GbsMpuae7QYu18jR+9peGgyFR3HCSXUba+pB/Lm9Vmk9A==", + "dependencies": { + "Microsoft.IdentityModel.Protocols": "8.21.0", + "System.IdentityModel.Tokens.Jwt": "8.21.0" + } + }, + "NodaTime": { + "type": "CentralTransitive", + "requested": "[3.3.3, )", + "resolved": "3.3.3", + "contentHash": "EwouHZv99j5hraq34yQqvCQGDR59dynxPHlxFm2vY/sw2N2aR8cFel29ZxPqohjBWp9Qsnld7QCY+7uZ2PESGg==" + }, + "NodaTime.Serialization.SystemTextJson": { + "type": "CentralTransitive", + "requested": "[1.4.0, )", + "resolved": "1.4.0", + "contentHash": "jGe0WLNAoRb3efOgsa5iecmMuzP+LNdtw2Rs4N9+2pS4YN+kg8e9Z48Jk47WWebcpqF81YdWT2KNInbXZXTS7w==", + "dependencies": { + "NodaTime": "[3.0.0, 4.0.0)" + } + }, + "Oracle.ManagedDataAccess.Core": { + "type": "CentralTransitive", + "requested": "[23.26.300, )", + "resolved": "23.26.300", + "contentHash": "5iRUVwLiw2+QgD1gp8ebFuS3xppoig9ogLcnTUfM5DcHEE6A9+Py/XAqZIVknOo9SaDJg+hOOSWZd+H8jgOprg==", + "dependencies": { + "System.Diagnostics.PerformanceCounter": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.2", + "System.Security.Cryptography.Pkcs": "8.0.1" + } + }, + "SSH.NET": { + "type": "CentralTransitive", + "requested": "[2025.1.0, )", + "resolved": "2025.1.0", + "contentHash": "jrnbtf0ItVaXAe6jE8X/kSLa6uC+0C+7W1vepcnRQB/rD88qy4IxG7Lf1FIbWmkoc4iVXv0pKrz+Wc6J4ngmHw==", + "dependencies": { + "BouncyCastle.Cryptography": "2.6.2" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "CentralTransitive", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "64jtHt9yLYi6VHMF5AwDj6BGM/MZrygv55SXl0MOIkFsFjGwRuxV3/QgEm7NTp3TQIx+YNX4S6dNpY08fJ3+3g==", + "dependencies": { + "System.Security.Cryptography.ProtectedData": "10.0.10" + } + }, + "System.IdentityModel.Tokens.Jwt": { + "type": "CentralTransitive", + "requested": "[8.21.0, )", + "resolved": "8.21.0", + "contentHash": "dKsTkmlpUf/I6g1Aw9joWaZAahXvC0gWGQvkXW1IjZLSefC/4LhQI0tL0VIs64/NZQbl4XnQvLQyu6c7z1pMxg==", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.21.0", + "Microsoft.IdentityModel.Tokens": "8.21.0" + } } } } diff --git a/src/aspnetcore/Ark.Tools.AspNetCore/ArkHealthChecksUIExtension.cs b/src/aspnetcore/Ark.Tools.AspNetCore/ArkHealthChecksUIExtension.cs index bfcb29c66..0ed28ee17 100644 --- a/src/aspnetcore/Ark.Tools.AspNetCore/ArkHealthChecksUIExtension.cs +++ b/src/aspnetcore/Ark.Tools.AspNetCore/ArkHealthChecksUIExtension.cs @@ -27,9 +27,9 @@ public static IServiceCollection AddArkHealthChecksUI(this IServiceCollection se services.AddArkHealthChecksUIOptions(o => { - if (File.Exists(Path.Combine(Environment.CurrentDirectory, "UIHealthChecks.css"))) + if (File.Exists(Path.Join(Environment.CurrentDirectory, "UIHealthChecks.css"))) o.AddCustomStylesheet("UIHealthChecks.css"); - var binPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "UIHealthChecks.css"); + var binPath = Path.Join(AppDomain.CurrentDomain.BaseDirectory, "UIHealthChecks.css"); if (File.Exists(binPath)) o.AddCustomStylesheet(binPath); }); diff --git a/tests/Ark.Tools.AspNetCore.MinimalApi.Tests/ArkMinimalApiHostVerificationTests.cs b/tests/Ark.Tools.AspNetCore.MinimalApi.Tests/ArkMinimalApiHostVerificationTests.cs index f765757c9..1710067c0 100644 --- a/tests/Ark.Tools.AspNetCore.MinimalApi.Tests/ArkMinimalApiHostVerificationTests.cs +++ b/tests/Ark.Tools.AspNetCore.MinimalApi.Tests/ArkMinimalApiHostVerificationTests.cs @@ -12,6 +12,8 @@ using SimpleInjector; +using System.Net; + namespace Ark.Tools.AspNetCore.MinimalApi.Tests; /// Verifies that container verification gates host startup. @@ -73,10 +75,27 @@ public async Task VerificationAndStartupCallbackCompleteBeforeFirstRequest() response.Should().Be("pong"); } + [TestMethod] + public async Task HealthChecksAreAnonymousWhenAuthenticationIsRequired() + { + await using var container = new Container(); + using var host = await CreateHostAsync( + container, + start: true, + requireAuthenticatedUser: true).ConfigureAwait(false); + + using var client = host.GetTestClient(); + using var response = await client.GetAsync( + new Uri("/healthCheck", UriKind.Relative)).ConfigureAwait(false); + + response.StatusCode.Should().Be(HttpStatusCode.OK); + } + private static async Task CreateHostAsync( Container container, bool start, - Action? configure = null) + Action? configure = null, + bool requireAuthenticatedUser = false) { var host = new HostBuilder() .ConfigureWebHost(web => @@ -84,13 +103,15 @@ private static async Task CreateHostAsync( web.UseTestServer(); web.ConfigureServices(services => services.AddRouting().AddArkMinimalApiHost(container, options => { - options.RequireAuthenticatedUser = false; + options.RequireAuthenticatedUser = requireAuthenticatedUser; configure?.Invoke(options); })); web.Configure(app => { app.UseArkMinimalApiHost(container); - app.UseEndpoints(endpoints => endpoints.MapGet("/ping", ([FromServices] StartupProbe? probe) => + app.UseEndpoints(endpoints => endpoints + .MapArkMinimalApiHost() + .MapGet("/ping", ([FromServices] StartupProbe? probe) => { probe?.Started.Should().BeTrue(); return "pong"; diff --git a/tests/Ark.Tools.AspNetCore.MinimalApi.Tests/packages.lock.json b/tests/Ark.Tools.AspNetCore.MinimalApi.Tests/packages.lock.json index 520d273d8..be1f67c7d 100644 --- a/tests/Ark.Tools.AspNetCore.MinimalApi.Tests/packages.lock.json +++ b/tests/Ark.Tools.AspNetCore.MinimalApi.Tests/packages.lock.json @@ -161,11 +161,80 @@ "resolved": "11.0.1", "contentHash": "9Jqm26Yb5D833BSU6rH3taFB8Y+A67Y3GJRC6XFEBKc2ueQSfd0B4bU3cAGsUNrWUJd1V9Sgm5U7I8SNG5zJvA==" }, + "AspNetCore.HealthChecks.UI.Core": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "TVriy4hgYnhfqz6NAzv8qe62Q8wf82iKUL6WV9selqeFZTq1ILi39Sic6sFQegRysvAVcnxKP/vY8z9Fk8x6XQ==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, + "Azure.Core": { + "type": "Transitive", + "resolved": "1.60.0", + "contentHash": "qCa5DLAq0w14aTl9/bvMZNA/QxPzYj1a4zakrpeudxWd4D4YliRHRfccD3yFECeHkMkvQjMmyWLggb8bzhDVKA==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "10.0.9", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.9", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.9", + "Microsoft.Identity.Client": "4.84.2", + "Microsoft.Identity.Client.Extensions.Msal": "4.84.2", + "System.ClientModel": "1.14.0", + "System.Memory.Data": "10.0.9" + } + }, + "Azure.Core.Amqp": { + "type": "Transitive", + "resolved": "1.3.1", + "contentHash": "AY1ZM4WwLBb9L2WwQoWs7wS2XKYg83tp3yVVdgySdebGN0FuIszuEqCy3Nhv6qHpbkjx/NGuOTsUbF/oNGBgwA==", + "dependencies": { + "Microsoft.Azure.Amqp": "2.6.7", + "System.Memory.Data": "1.0.2" + } + }, + "BouncyCastle.Cryptography": { + "type": "Transitive", + "resolved": "2.6.2", + "contentHash": "7oWOcvnntmMKNzDLsdxAYqApt+AjpRpP2CShjMfIa3umZ42UQMvH0tl1qAliYPNYO6vTdcGMqnRrCPmsfzTI1w==" + }, + "Microsoft.Azure.Amqp": { + "type": "Transitive", + "resolved": "2.7.0", + "contentHash": "gm/AEakujttMzrDhZ5QpRz3fICVkYDn/oDG9SmxDP+J7R8JDBXYU9WWG7hr6wQy40mY+wjUF0yUGXDPRDRNJwQ==" + }, + "Microsoft.Bcl.AsyncInterfaces": { + "type": "Transitive", + "resolved": "10.0.9", + "contentHash": "Aq7M8lG6BrHeatqKqncVm9m55ec34k6nnfPRLe/PvGg+b/pAsRM2ejofeKmCLjTXMa+5NGXm382f8CG/D5WDow==" + }, + "Microsoft.Bcl.Cryptography": { + "type": "Transitive", + "resolved": "10.0.2", + "contentHash": "LG9Yll3B5aNpxv0+D47g6LiOiKBIlodhcHdQwcYzo8VeexFLGqx5ymetmA2aBRyo9cCcWsQWrFsdbsr8LvmWDw==" + }, "Microsoft.CodeCoverage": { "type": "Transitive", "resolved": "18.8.1", "contentHash": "Eclse/ZZjr4lmWzZFNN9h/OluhKL+SK/QbUyKUewgX139aGeyMEO/DkMPwuFs2MixvanTnz6891rF8UHDg+W4Q==" }, + "Microsoft.Data.SqlClient.Extensions.Abstractions": { + "type": "Transitive", + "resolved": "7.0.2", + "contentHash": "Zx7z61fG2Nc6LdDn4jA7b5Aj1ABrljkOPRE31RvVUdjF6IgbG60leDUhMCafsnWFgaheiK3iqpLe+kbf5Z5L8Q==", + "dependencies": { + "Microsoft.Data.SqlClient.Internal.Logging": "[7.0.2, 8.0.0)" + } + }, + "Microsoft.Data.SqlClient.Internal.Logging": { + "type": "Transitive", + "resolved": "7.0.2", + "contentHash": "iqgYBbGSVy/DIYWjzmQOa964Kn4rs4wW5vg2IamqVK0fQqfTiILVR5hMK27XWqoyONtAZs+VxH354cPJBtSnbg==" + }, + "Microsoft.Data.SqlClient.SNI.runtime": { + "type": "Transitive", + "resolved": "6.0.2", + "contentHash": "f+pRODTWX7Y67jXO3T5S2dIPZ9qMJNySjlZT/TKmWVNWe19N8jcWmHaqHnnchaq3gxEKv1SWVY5EFzOD06l41w==" + }, "Microsoft.Diagnostics.NETCore.Client": { "type": "Transitive", "resolved": "0.2.607501", @@ -179,6 +248,18 @@ "resolved": "2.2.9", "contentHash": "WLbDc/W9XkHpGVtd1L6Vml8W6+PaaYZZTJASHjHF7W2WX/hld6bfNK102Ui+I3a6zIdx4+oKRJtMgHz44JmBfw==" }, + "Microsoft.Extensions.Caching.Memory": { + "type": "Transitive", + "resolved": "9.0.13", + "contentHash": "OdQmN8LYcUEu20Fxii9mk68nHJGL+JPXF3w0+hxenf0oDDdDBA+ZV/S92FmIgAWAElowIiFA/g0x+8YB1g80Hg==", + "dependencies": { + "Microsoft.Extensions.Caching.Abstractions": "9.0.13", + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.13", + "Microsoft.Extensions.Logging.Abstractions": "9.0.13", + "Microsoft.Extensions.Options": "9.0.13", + "Microsoft.Extensions.Primitives": "9.0.13" + } + }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", "resolved": "10.0.10", @@ -198,6 +279,22 @@ "Microsoft.Extensions.Options": "10.0.10" } }, + "Microsoft.Extensions.Diagnostics.HealthChecks": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "zLgN22Zp9pk8RHlwssRTexw4+a6wqOnKWN+VejdPn5Yhjql4XiBhkFo35Nu8mmqHIk/UEmmCnMGLWq75aFfkOw==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "8.0.11", + "Microsoft.Extensions.Hosting.Abstractions": "8.0.1", + "Microsoft.Extensions.Logging.Abstractions": "8.0.2", + "Microsoft.Extensions.Options": "8.0.2" + } + }, + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { + "type": "Transitive", + "resolved": "8.0.11", + "contentHash": "So3JUdRxozRjvQ3cxU6F3nI/i4emDnjane6yMYcJhvTTTu29ltlIdoXjkFGRceIWz8yKvuEpzXItZ0x5GvN2nQ==" + }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", "resolved": "10.0.10", @@ -221,6 +318,34 @@ "resolved": "10.0.10", "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" }, + "Microsoft.IdentityModel.Abstractions": { + "type": "Transitive", + "resolved": "8.21.0", + "contentHash": "XYgEmYpUvng0oYIagDJ+uebboQSnWtCV7q9zMyXlBw6ZqLLCHcmGUb7TpXvQ3HWY4OzbOCUQm2Ac0saPSnwqSw==" + }, + "Microsoft.IdentityModel.Logging": { + "type": "Transitive", + "resolved": "8.21.0", + "contentHash": "LgIWUUX386xCbvjq2ex8iXGIu2raDWrrIQ4OyYZKaNWMhzvN8YOTbAYMFJC+iHmKnkNBM8g7mLak9KQodldH3g==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.21.0" + } + }, + "Microsoft.IdentityModel.Tokens": { + "type": "Transitive", + "resolved": "8.21.0", + "contentHash": "xFnFEl4VrhAJEbqtRrpgfAACgkm6NYo7cWYKYROH00N9/M5OYrRwTP0lHsginnLrqPrseLcSqAueQNRCyGNsdw==", + "dependencies": { + "Microsoft.Bcl.Cryptography": "10.0.2", + "Microsoft.Extensions.Logging.Abstractions": "8.0.0", + "Microsoft.IdentityModel.Logging": "8.21.0" + } + }, + "Microsoft.SqlServer.Server": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "N4KeF3cpcm1PUHym1RmakkzfkEv3GRMyofVv40uXsQhCQeglr2OHNcUk2WOG51AKpGO8ynGpo9M/kFXSzghwug==" + }, "Microsoft.Testing.Extensions.Telemetry": { "type": "Transitive", "resolved": "2.3.2", @@ -303,19 +428,226 @@ "SimpleInjector": "5.4.0" } }, + "System.ClientModel": { + "type": "Transitive", + "resolved": "1.14.0", + "contentHash": "yhIJHDW3Hh5kcvhHv3ww1T8qvya06Nlwo/SR/rke4/fHXtyKiqQV/9b/VDhnVI7QUcMnpfvh4pIEFhNsTDLeKQ==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "10.0.3", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.3", + "Microsoft.Extensions.Logging.Abstractions": "10.0.3", + "System.Memory.Data": "10.0.3" + } + }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "OvGz3PrzuAI/Sj7LTcXcCe3FClRI1IyRMZjNONcZtFh+Ww7nAtSh4kh08r8KVe/xxkXJPjR0Y1jF7H+N42d4xQ==" + }, + "System.Diagnostics.PerformanceCounter": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "lX6DXxtJqVGWw7N/QmVoiCyVQ+Q/Xp+jVXPr3gLK1jJExSn1qmAjJQeb8gnOYeeBTG3E3PmG1nu92eYj/TEjpg==", + "dependencies": { + "System.Configuration.ConfigurationManager": "8.0.0" + } + }, + "System.DirectoryServices.Protocols": { + "type": "Transitive", + "resolved": "8.0.2", + "contentHash": "7pSU+qkmdkwbikAvn4kpvClfyffaR7dYJw7ucBtO5d6m/7wgKZIULOZAGFLMIMOFFmg7xC67TYKptHxcbqQm+Q==" + }, + "System.Memory.Data": { + "type": "Transitive", + "resolved": "10.0.9", + "contentHash": "YweovHiLUoEdbr2Xv8eRqCSkTu1vMms4a6xBHaQiMSFVy32PL+hXv6Vhol2NWOmLHjaVgTyhJ3R52U6JxS6w3Q==" + }, + "System.Security.Cryptography.Pkcs": { + "type": "Transitive", + "resolved": "9.0.13", + "contentHash": "dxJhkuoaelvWy588wPXjShNks+ZMiSgXnN75/u+DPbER5PqKrLPDftE0BvGM7nDK/scQAVlD+gRXlCAAjWi58Q==" + }, + "System.Security.Cryptography.ProtectedData": { + "type": "Transitive", + "resolved": "10.0.10", + "contentHash": "BKt0SQgq2lq3ESE68jkeLwv95ypANrPDtkTOIFGcnhg2aRUeUUBDrQlkVDZctrg1WenVcvn5P5XZnuYI7q6rFQ==" + }, + "ark.tools.aspnetcore.healthchecks": { + "type": "Project", + "dependencies": { + "Ark.Tools.Core": "[1.0.0, )", + "Ark.Tools.SimpleInjector": "[1.0.0, )", + "Ark.Tools.SystemTextJson": "[1.0.0, )", + "AspNetCore.HealthChecks.AzureServiceBus": "[9.0.0, )", + "AspNetCore.HealthChecks.Network": "[9.0.0, )", + "AspNetCore.HealthChecks.Oracle": "[9.0.0, )", + "AspNetCore.HealthChecks.Publisher.ApplicationInsights": "[9.0.0, )", + "AspNetCore.HealthChecks.SqlServer": "[9.0.0, )", + "AspNetCore.HealthChecks.UI.Client": "[9.0.0, )", + "Azure.Identity": "[1.21.0, )", + "Azure.Messaging.ServiceBus": "[7.20.2, )", + "Microsoft.ApplicationInsights": "[2.23.0, )" + } + }, "ark.tools.aspnetcore.minimalapi": { "type": "Project", "dependencies": { + "Ark.Tools.AspNetCore.HealthChecks": "[1.0.0, )", "SimpleInjector": "[5.6.0, )", "SimpleInjector.Integration.AspNetCore.Mvc.Core": "[5.5.0, )" } }, + "ark.tools.core": { + "type": "Project", + "dependencies": { + "NodaTime": "[3.3.3, )" + } + }, + "ark.tools.nodatime": { + "type": "Project", + "dependencies": { + "Ark.Tools.Core": "[1.0.0, )" + } + }, + "ark.tools.nodatime.systemtextjson": { + "type": "Project", + "dependencies": { + "Ark.Tools.Nodatime": "[1.0.0, )", + "NodaTime.Serialization.SystemTextJson": "[1.4.0, )" + } + }, + "ark.tools.simpleinjector": { + "type": "Project", + "dependencies": { + "SimpleInjector": "[5.6.0, )" + } + }, + "ark.tools.systemtextjson": { + "type": "Project", + "dependencies": { + "Ark.Tools.Core": "[1.0.0, )", + "Ark.Tools.Nodatime.SystemTextJson": "[1.0.0, )", + "Macross.Json.Extensions": "[3.0.0, )" + } + }, + "AspNetCore.HealthChecks.AzureServiceBus": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "Uzml9qWAvN6xPJejdTLznx9SIczKs/exieiJCU0Kjivt4ZTcsLdE3u2g8HJr0VWhguQad2mpGkwXtQ9nWfkm4g==", + "dependencies": { + "Azure.Messaging.ServiceBus": "7.17.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, + "AspNetCore.HealthChecks.Network": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "Lke7ksxhzZK8qZhSrmxnhdOHkKInzVIdGk7JBAnROQ6M66nuO9ja6ShC0osw83oE+GZazkO+F36gfwD8HlHrXA==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "SSH.NET": "2023.0.0" + } + }, + "AspNetCore.HealthChecks.Oracle": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "q+vhCRPgxWviMtybuJMTXxM2GzA2/h2Cm+LJyafipxVV7iDCb8uTV41E8CZ6XFJhZfZ0VIEhzE3IAL2m4i+t7g==", + "dependencies": { + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", + "Oracle.ManagedDataAccess.Core": "3.21.120" + } + }, + "AspNetCore.HealthChecks.Publisher.ApplicationInsights": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "v2GAyHPxJQIH8mBD5bF4GQXvYODMOOb30vaMTvv6ShXnqR2K0YSjZSAMdMc+WEBcjtUvv+1o+Mv+sf9Ho+wXWw==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.21.0", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, + "AspNetCore.HealthChecks.SqlServer": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "UxCf65iCF2nU1u7AcB320abjL4CRg5swCgJECY6mKk1j5lrGMfVtskWwriGs1T29pYdRig9Vra3SPnP+4G82pA==", + "dependencies": { + "Microsoft.Data.SqlClient": "5.2.2", + "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11" + } + }, + "AspNetCore.HealthChecks.UI.Client": { + "type": "CentralTransitive", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "1Ub3Wvvbz7CMuFNWgLEc9qqQibiMoovDML/WHrwr5J83RPgtI20giCR92s/ipLgu7IIuqw+W/y7WpIeHqAICxg==", + "dependencies": { + "AspNetCore.HealthChecks.UI.Core": "9.0.0" + } + }, + "Azure.Identity": { + "type": "CentralTransitive", + "requested": "[1.21.0, )", + "resolved": "1.21.0", + "contentHash": "GeFv8sGwRKvDKwI2WFy8r0mhmlxEVZg24Sit2NogTjiSO8RVjllWM65OT6e1sKjOvG8V74y7hAbaELUUPjZQSw==", + "dependencies": { + "Azure.Core": "1.53.0" + } + }, + "Azure.Messaging.ServiceBus": { + "type": "CentralTransitive", + "requested": "[7.20.2, )", + "resolved": "7.20.2", + "contentHash": "mwr5c3Qs7FWUtwzlLOtVixYDpUuA+Ln7sNirljTHZR8kDhzdr2grlqx0RRBvGV+IDCRHt1jIRb+hi0MUzjeVmw==", + "dependencies": { + "Azure.Core": "1.60.0", + "Azure.Core.Amqp": "1.3.1", + "Microsoft.Azure.Amqp": "2.7.0" + } + }, + "Macross.Json.Extensions": { + "type": "CentralTransitive", + "requested": "[3.0.0, )", + "resolved": "3.0.0", + "contentHash": "AkNshs6dopj8FXsmkkJxvLivN2SyDJQDbjcds5lo9+Y6L4zpcoXdmzXQ3VVN+AIWQr0CTD5A7vkuHGAr2aypZg==" + }, "Microsoft.ApplicationInsights": { "type": "CentralTransitive", "requested": "[2.23.0, )", "resolved": "2.23.0", "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==" }, + "Microsoft.Data.SqlClient": { + "type": "CentralTransitive", + "requested": "[7.0.2, )", + "resolved": "7.0.2", + "contentHash": "zwv76lANFQQI6Gmp6ntkzMWIWVqm8Wf4Mz00AeGCk1n8HCi5afi6bNynSe18uI0xeL0n6J+Myjk9AiIsL5oSqw==", + "dependencies": { + "Microsoft.Bcl.Cryptography": "9.0.13", + "Microsoft.Data.SqlClient.Extensions.Abstractions": "[7.0.2, 8.0.0)", + "Microsoft.Data.SqlClient.Internal.Logging": "[7.0.2, 8.0.0)", + "Microsoft.Data.SqlClient.SNI.runtime": "[6.0.2, 7.0.0)", + "Microsoft.Extensions.Caching.Memory": "9.0.13", + "Microsoft.IdentityModel.JsonWebTokens": "8.16.0", + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "8.16.0", + "Microsoft.SqlServer.Server": "[1.0.0, 2.0.0)", + "System.Configuration.ConfigurationManager": "9.0.13", + "System.Security.Cryptography.Pkcs": "9.0.13" + } + }, + "Microsoft.Extensions.Caching.Abstractions": { + "type": "CentralTransitive", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "4ZFBNE+jzR+CrWWlhOesnmywCW7pYKT0dxyAQRdL11yJwxe4jvcAu31eorFtEkoFeCDcUTeNssgPv2yaRRptaQ==", + "dependencies": { + "Microsoft.Extensions.Primitives": "10.0.10" + } + }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "CentralTransitive", "requested": "[10.0.10, )", @@ -357,12 +689,85 @@ "Microsoft.Extensions.Primitives": "10.0.10" } }, + "Microsoft.Identity.Client": { + "type": "CentralTransitive", + "requested": "[4.87.0, )", + "resolved": "4.87.0", + "contentHash": "ERObBpS3b6kc92D/Z86zSd/MpWvdJu97BNamRzg5V4y59KwnxzfhM762tgiNnKoIwTbnIBOcwGPFGQ4DvShLvw==", + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.14.0" + } + }, + "Microsoft.Identity.Client.Extensions.Msal": { + "type": "CentralTransitive", + "requested": "[4.87.0, )", + "resolved": "4.87.0", + "contentHash": "TyBuYz7Nldl0rhC4Fza/yAM4MATEf+YG4CCh5Kl10UXeT/JOzI4yag8/juD2ZinhiQSmJl+BFzMjEWY75JCX5Q==", + "dependencies": { + "Microsoft.Identity.Client": "4.87.0", + "System.Security.Cryptography.ProtectedData": "4.5.0" + } + }, + "Microsoft.IdentityModel.JsonWebTokens": { + "type": "CentralTransitive", + "requested": "[8.21.0, )", + "resolved": "8.21.0", + "contentHash": "iiA5uimwlRe4Drd8YKOaB8IQkgGOjxGjO6mu5zCGFjaEBpB6yNOluZ33zJFXiW5MQYRC6ypMnOXsiR5SPrO+tw==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.21.0" + } + }, + "Microsoft.IdentityModel.Protocols": { + "type": "CentralTransitive", + "requested": "[8.21.0, )", + "resolved": "8.21.0", + "contentHash": "83hO6NhkUSaOFLeQmIzUSoCgVLhzGc+JMQZvo5sKw51NDBmVfoUPcJiMvyJtyrwTdwxNNqkcjjwhC5ktP449bw==", + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.21.0" + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect": { + "type": "CentralTransitive", + "requested": "[8.21.0, )", + "resolved": "8.21.0", + "contentHash": "V6A4CFcST3M6r4fFuPw2qpjZjw9QkWrN3kPCn3GT3GbsMpuae7QYu18jR+9peGgyFR3HCSXUba+pB/Lm9Vmk9A==", + "dependencies": { + "Microsoft.IdentityModel.Protocols": "8.21.0", + "System.IdentityModel.Tokens.Jwt": "8.21.0" + } + }, "Microsoft.Testing.Platform": { "type": "CentralTransitive", "requested": "[2.3.2, )", "resolved": "2.3.2", "contentHash": "FuJgIEfNU+rFHJYGhuqA8uup+3cryJ1N67Tijqo01Jd5xAr28ptz0aXkFfSqK3MhAUmGsrPpgQ92+3+0oXv8AA==" }, + "NodaTime": { + "type": "CentralTransitive", + "requested": "[3.3.3, )", + "resolved": "3.3.3", + "contentHash": "EwouHZv99j5hraq34yQqvCQGDR59dynxPHlxFm2vY/sw2N2aR8cFel29ZxPqohjBWp9Qsnld7QCY+7uZ2PESGg==" + }, + "NodaTime.Serialization.SystemTextJson": { + "type": "CentralTransitive", + "requested": "[1.4.0, )", + "resolved": "1.4.0", + "contentHash": "jGe0WLNAoRb3efOgsa5iecmMuzP+LNdtw2Rs4N9+2pS4YN+kg8e9Z48Jk47WWebcpqF81YdWT2KNInbXZXTS7w==", + "dependencies": { + "NodaTime": "[3.0.0, 4.0.0)" + } + }, + "Oracle.ManagedDataAccess.Core": { + "type": "CentralTransitive", + "requested": "[23.26.300, )", + "resolved": "23.26.300", + "contentHash": "5iRUVwLiw2+QgD1gp8ebFuS3xppoig9ogLcnTUfM5DcHEE6A9+Py/XAqZIVknOo9SaDJg+hOOSWZd+H8jgOprg==", + "dependencies": { + "System.Diagnostics.PerformanceCounter": "8.0.0", + "System.DirectoryServices.Protocols": "8.0.2", + "System.Security.Cryptography.Pkcs": "8.0.1" + } + }, "SimpleInjector": { "type": "CentralTransitive", "requested": "[5.6.0, )", @@ -378,6 +783,36 @@ "SimpleInjector": "5.4.0", "SimpleInjector.Integration.AspNetCore": "5.5.0" } + }, + "SSH.NET": { + "type": "CentralTransitive", + "requested": "[2025.1.0, )", + "resolved": "2025.1.0", + "contentHash": "jrnbtf0ItVaXAe6jE8X/kSLa6uC+0C+7W1vepcnRQB/rD88qy4IxG7Lf1FIbWmkoc4iVXv0pKrz+Wc6J4ngmHw==", + "dependencies": { + "BouncyCastle.Cryptography": "2.6.2", + "Microsoft.Extensions.Logging.Abstractions": "8.0.3" + } + }, + "System.Configuration.ConfigurationManager": { + "type": "CentralTransitive", + "requested": "[10.0.10, )", + "resolved": "10.0.10", + "contentHash": "64jtHt9yLYi6VHMF5AwDj6BGM/MZrygv55SXl0MOIkFsFjGwRuxV3/QgEm7NTp3TQIx+YNX4S6dNpY08fJ3+3g==", + "dependencies": { + "System.Diagnostics.EventLog": "10.0.10", + "System.Security.Cryptography.ProtectedData": "10.0.10" + } + }, + "System.IdentityModel.Tokens.Jwt": { + "type": "CentralTransitive", + "requested": "[8.21.0, )", + "resolved": "8.21.0", + "contentHash": "dKsTkmlpUf/I6g1Aw9joWaZAahXvC0gWGQvkXW1IjZLSefC/4LhQI0tL0VIs64/NZQbl4XnQvLQyu6c7z1pMxg==", + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.21.0", + "Microsoft.IdentityModel.Tokens": "8.21.0" + } } } }