Refactor HTTP handling in InvokeRecActionCommand

Updated `ReC.Application.csproj` to include `Microsoft.Extensions.Http` for improved HTTP client management. Refactored `InvokeRecActionCommandHandler` to use `IHttpClientFactory` for creating `HttpClient` instances, enhancing resource efficiency. Simplified HTTP method handling by replacing the switch statement with a dynamic `HttpMethod` and `HttpRequestMessage` approach. Removed redundant `using` directives and renamed `header` to `headers` for clarity. Removed `BadRequestException` for unsupported REST types, streamlining error handling.
This commit is contained in:
Developer 02 2025-11-26 21:35:53 +01:00
parent 0837bca6cb
commit 7c00060f74
2 changed files with 10 additions and 20 deletions

View File

@ -13,6 +13,7 @@
<PackageReference Include="DigitalData.Core.Exceptions" Version="1.1.0" /> <PackageReference Include="DigitalData.Core.Exceptions" Version="1.1.0" />
<PackageReference Include="MediatR" Version="13.1.0" /> <PackageReference Include="MediatR" Version="13.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.11" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.11" />
<PackageReference Include="Microsoft.Extensions.Http" Version="10.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -1,7 +1,5 @@
using DigitalData.Core.Exceptions; using MediatR;
using MediatR;
using ReC.Application.RecActions.Queries; using ReC.Application.RecActions.Queries;
using System.Net.Http;
namespace ReC.Application.RecActions.Commands; namespace ReC.Application.RecActions.Commands;
@ -15,31 +13,22 @@ public static class InvokeRecActionCommandExtensions
=> sender.Send(new InvokeRecActionCommand { ProfileId = profileId }); => sender.Send(new InvokeRecActionCommand { ProfileId = profileId });
} }
public class InvokeRecActionCommandHandler(ISender sender) : IRequestHandler<InvokeRecActionCommand> public class InvokeRecActionCommandHandler(ISender sender, IHttpClientFactory clientFactory) : IRequestHandler<InvokeRecActionCommand>
{ {
public async Task Handle(InvokeRecActionCommand request, CancellationToken cancel) public async Task Handle(InvokeRecActionCommand request, CancellationToken cancel)
{ {
var actions = await sender.Send(request as ReadRecActionQuery, cancel); var actions = await sender.Send(request as ReadRecActionQuery, cancel);
var http = clientFactory.CreateClient();
foreach (var action in actions) foreach (var action in actions)
{ {
using var http = new HttpClient(); var method = new HttpMethod(action.RestType.ToUpper());
var msg = new HttpRequestMessage(method, action.EndpointUri);
var response = action.RestType?.ToUpper().Trim() switch
{
"GET" => await http.GetAsync(action.EndpointUri, cancel),
"POST" => await http.PostAsync(action.EndpointUri, null, cancel),
"PUT" => await http.PutAsync(action.EndpointUri, null, cancel),
"DELETE" => await http.DeleteAsync(action.EndpointUri, cancel),
"PATCH" => await http.PatchAsync(action.EndpointUri, null, cancel),
"HEAD" => await http.SendAsync(new HttpRequestMessage(HttpMethod.Head, action.EndpointUri), cancel),
"OPTIONS" => await http.SendAsync(new HttpRequestMessage(HttpMethod.Options, action.EndpointUri), cancel),
"TRACE" => await http.SendAsync(new HttpRequestMessage(HttpMethod.Trace, action.EndpointUri), cancel),
_ => throw new BadRequestException($"The REST type {action.RestType} is not supported.")
};
var response = await http.SendAsync(msg, cancel);
var body = await response.Content.ReadAsStringAsync(cancel); var body = await response.Content.ReadAsStringAsync(cancel);
var header = response.Headers.ToDictionary(); var headers = response.Headers.ToDictionary();
} }
} }
} }