diff --git a/Directory.Build.props b/Directory.Build.props index 851d849..e49e299 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -17,6 +17,6 @@ README.md MIT - 0.4.1 + 0.4.2 \ No newline at end of file diff --git a/ModEndpoints.sln b/ModEndpoints.sln index 8d1fbd9..78e7e70 100644 --- a/ModEndpoints.sln +++ b/ModEndpoints.sln @@ -7,6 +7,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "__SolutionItems", "__Soluti ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig Directory.Build.props = Directory.Build.props + LICENSE.txt = LICENSE.txt README.md = README.md EndProjectSection EndProject diff --git a/samples/Client/Program.cs b/samples/Client/Program.cs index 069fd3c..3209c36 100644 --- a/samples/Client/Program.cs +++ b/samples/Client/Program.cs @@ -9,7 +9,7 @@ HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); -var baseAddress = "https://localhost:7012/api/v1/storesWithServiceEndpoint/"; +var baseAddress = "https://localhost:7012/api/"; var clientName = "ShowcaseApi.Client"; //builder.Services.AddRemoteServiceWithNewClient(clientName, // (sp, client) => @@ -48,7 +48,10 @@ static async Task CallRemoteServicesAsync(IServiceProvider hostProvider) //resolve service channel from DI var channel = provider.GetRequiredService(); //send request over channel to remote ServiceResultEndpoint - var listResult = await channel.SendAsync(new ListStoresRequest(), default); + var listResult = await channel.SendAsync( + new ListStoresRequest(), + default, + endpointUriPrefix: "v1/storesWithServiceEndpoint/"); if (listResult.IsOk) { @@ -57,7 +60,10 @@ static async Task CallRemoteServicesAsync(IServiceProvider hostProvider) if (id is not null) { //send request over channel to remote ServiceResultEndpoint - var getResult = await channel.SendAsync(new GetStoreByIdRequest(Id: id.Value), default); + var getResult = await channel.SendAsync( + new GetStoreByIdRequest(Id: id.Value), + default, + endpointUriPrefix: "v1/storesWithServiceEndpoint/"); if (getResult.IsOk) { Console.WriteLine(getResult.Value); diff --git a/src/ModEndpoints.RemoteServices/IServiceChannel.cs b/src/ModEndpoints.RemoteServices/IServiceChannel.cs index 01a46ea..11487f4 100644 --- a/src/ModEndpoints.RemoteServices/IServiceChannel.cs +++ b/src/ModEndpoints.RemoteServices/IServiceChannel.cs @@ -9,6 +9,7 @@ public interface IServiceChannel Task> SendAsync( TRequest req, CancellationToken ct, + string? endpointUriPrefix = null, MediaTypeHeaderValue? mediaType = null, JsonSerializerOptions? jsonSerializerOptions = null, Action? configureRequestHeaders = null, @@ -18,6 +19,7 @@ Task> SendAsync( Task SendAsync( TRequest req, CancellationToken ct, + string? endpointUriPrefix = null, MediaTypeHeaderValue? mediaType = null, JsonSerializerOptions? jsonSerializerOptions = null, Action? configureRequestHeaders = null, diff --git a/src/ModEndpoints.RemoteServices/ServiceChannel.cs b/src/ModEndpoints.RemoteServices/ServiceChannel.cs index 7336dec..e39140c 100644 --- a/src/ModEndpoints.RemoteServices/ServiceChannel.cs +++ b/src/ModEndpoints.RemoteServices/ServiceChannel.cs @@ -17,6 +17,7 @@ public class ServiceChannel( public async Task> SendAsync( TRequest req, CancellationToken ct, + string? endpointUriPrefix = null, MediaTypeHeaderValue? mediaType = null, JsonSerializerOptions? jsonSerializerOptions = null, Action? configureRequestHeaders = null, @@ -39,7 +40,9 @@ public async Task> SendAsync( { return Result.CriticalError(string.Format(NoChannelRegistrationFound, typeof(TRequest))); } - using (HttpRequestMessage httpReq = new(HttpMethod.Post, requestUriResult.Value)) + using (HttpRequestMessage httpReq = new( + HttpMethod.Post, + ServiceChannel.Combine(endpointUriPrefix, requestUriResult.Value))) { httpReq.Content = JsonContent.Create(req, mediaType, jsonSerializerOptions); configureRequestHeaders?.Invoke(httpReq.Headers); @@ -60,6 +63,7 @@ public async Task> SendAsync( public async Task SendAsync( TRequest req, CancellationToken ct, + string? endpointUriPrefix = null, MediaTypeHeaderValue? mediaType = null, JsonSerializerOptions? jsonSerializerOptions = null, Action? configureRequestHeaders = null, @@ -81,7 +85,9 @@ public async Task SendAsync( { return Result.CriticalError(string.Format(NoChannelRegistrationFound, typeof(TRequest))); } - using (HttpRequestMessage httpReq = new(HttpMethod.Post, requestUriResult.Value)) + using (HttpRequestMessage httpReq = new( + HttpMethod.Post, + ServiceChannel.Combine(endpointUriPrefix, requestUriResult.Value))) { httpReq.Content = JsonContent.Create(req, mediaType, jsonSerializerOptions); configureRequestHeaders?.Invoke(httpReq.Headers); @@ -98,4 +104,16 @@ public async Task SendAsync( return ex; } } + + private static string Combine(string? endpointUriPrefix, string endpointUri) + { + if (string.IsNullOrWhiteSpace(endpointUriPrefix)) + { + return endpointUri; + } + return string.Format( + "{0}/{1}", + endpointUriPrefix.TrimEnd('/'), + endpointUri.TrimStart('/')); + } }