diff --git a/extensions/Worker.Extensions.Rpc/src/ConfigurationExtensions.cs b/extensions/Worker.Extensions.Rpc/src/ConfigurationExtensions.cs index 3c3d64415..cb2bc2132 100644 --- a/extensions/Worker.Extensions.Rpc/src/ConfigurationExtensions.cs +++ b/extensions/Worker.Extensions.Rpc/src/ConfigurationExtensions.cs @@ -18,10 +18,22 @@ internal static class ConfigurationExtensions /// public static Uri GetFunctionsHostGrpcUri(this IConfiguration configuration) { - string uriString = $"http://{configuration["HOST"]}:{configuration["PORT"]}"; - if (!Uri.TryCreate(uriString, UriKind.Absolute, out Uri? grpcUri)) + Uri? grpcUri; + var functionsUri = configuration["Functions:Worker:HostEndpoint"]; + if (functionsUri is not null) { - throw new InvalidOperationException($"The gRPC channel URI '{uriString}' could not be parsed."); + if (!Uri.TryCreate(functionsUri, UriKind.Absolute, out grpcUri)) + { + throw new InvalidOperationException($"The gRPC channel URI '{functionsUri}' could not be parsed."); + } + } + else + { + var uriString = $"http://{configuration["HOST"]}:{configuration["PORT"]}"; + if (!Uri.TryCreate(uriString, UriKind.Absolute, out grpcUri)) + { + throw new InvalidOperationException($"The gRPC channel URI '{uriString}' could not be parsed."); + } } return grpcUri; diff --git a/release_notes.md b/release_notes.md index 1511f44a7..d210c4639 100644 --- a/release_notes.md +++ b/release_notes.md @@ -14,4 +14,6 @@ ### Microsoft.Azure.Functions.Worker.Grpc +- Added support for handling the new command line arguments with "functions-" prefix. (#1897) - Adding optional parameter support (#1868) + \ No newline at end of file diff --git a/src/DotNetWorker.Grpc/GrpcServiceCollectionExtensions.cs b/src/DotNetWorker.Grpc/GrpcServiceCollectionExtensions.cs index d95637d4b..30fa969e5 100644 --- a/src/DotNetWorker.Grpc/GrpcServiceCollectionExtensions.cs +++ b/src/DotNetWorker.Grpc/GrpcServiceCollectionExtensions.cs @@ -11,7 +11,6 @@ using Microsoft.Azure.Functions.Worker.Diagnostics; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Azure.Functions.Worker.Handlers; namespace Microsoft.Extensions.DependencyInjection @@ -68,12 +67,38 @@ public static IServiceCollection AddGrpc(this IServiceCollection services) #endif services.AddOptions() - .Configure((arguments, config) => + .Configure((grpcWorkerStartupOption, config) => { - config.Bind(arguments); + grpcWorkerStartupOption.HostEndpoint = GetFunctionsHostGrpcUri(config); + grpcWorkerStartupOption.RequestId = config["Functions:Worker:RequestId"] ?? config["requestId"]; + grpcWorkerStartupOption.WorkerId = config["Functions:Worker:WorkerId"] ?? config["workerId"]; + grpcWorkerStartupOption.GrpcMaxMessageLength = config.GetValue("Functions:Worker:GrpcMaxMessageLength", null) ?? config.GetValue("grpcMaxMessageLength"); }); return services; } + + private static Uri GetFunctionsHostGrpcUri(IConfiguration configuration) + { + Uri? grpcUri; + var functionsUri = configuration["Functions:Worker:HostEndpoint"]; + if (functionsUri is not null) + { + if (!Uri.TryCreate(functionsUri, UriKind.Absolute, out grpcUri)) + { + throw new InvalidOperationException($"The gRPC channel URI '{functionsUri}' could not be parsed."); + } + } + else + { + var uriString = $"http://{configuration["HOST"]}:{configuration["PORT"]}"; + if (!Uri.TryCreate(uriString, UriKind.Absolute, out grpcUri)) + { + throw new InvalidOperationException($"The gRPC channel URI '{uriString}' could not be parsed."); + } + } + + return grpcUri; + } } } diff --git a/src/DotNetWorker.Grpc/GrpcStartupOptions.cs b/src/DotNetWorker.Grpc/GrpcStartupOptions.cs index 2f25a5d21..01279ba09 100644 --- a/src/DotNetWorker.Grpc/GrpcStartupOptions.cs +++ b/src/DotNetWorker.Grpc/GrpcStartupOptions.cs @@ -2,13 +2,13 @@ // Licensed under the MIT License. See License.txt in the project root for license information. +using System; + namespace Microsoft.Azure.Functions.Worker { internal class GrpcWorkerStartupOptions { - public string? Host { get; set; } - - public int Port { get; set; } + public Uri? HostEndpoint { get; set; } public string? WorkerId { get; set; } diff --git a/src/DotNetWorker.Grpc/GrpcWorkerClientFactory.cs b/src/DotNetWorker.Grpc/GrpcWorkerClientFactory.cs index d24ab0fdb..b34fff467 100644 --- a/src/DotNetWorker.Grpc/GrpcWorkerClientFactory.cs +++ b/src/DotNetWorker.Grpc/GrpcWorkerClientFactory.cs @@ -104,15 +104,8 @@ private async Task StartReaderAsync(IAsyncStreamReader respons private FunctionRpcClient CreateClient() { - string uriString = $"http://{_startupOptions.Host}:{_startupOptions.Port}"; - if (!Uri.TryCreate(uriString, UriKind.Absolute, out Uri? grpcUri)) - { - throw new InvalidOperationException($"The gRPC channel URI '{uriString}' could not be parsed."); - } - - #if NET5_0_OR_GREATER - GrpcChannel grpcChannel = GrpcChannel.ForAddress(grpcUri, new GrpcChannelOptions() + GrpcChannel grpcChannel = GrpcChannel.ForAddress(_startupOptions.HostEndpoint!.AbsoluteUri, new GrpcChannelOptions() { MaxReceiveMessageSize = _startupOptions.GrpcMaxMessageLength, MaxSendMessageSize = _startupOptions.GrpcMaxMessageLength, @@ -126,7 +119,7 @@ private FunctionRpcClient CreateClient() new ChannelOption(GrpcCore.ChannelOptions.MaxSendMessageLength, _startupOptions.GrpcMaxMessageLength) }; - GrpcCore.Channel grpcChannel = new GrpcCore.Channel(_startupOptions.Host, _startupOptions.Port, ChannelCredentials.Insecure, options); + GrpcCore.Channel grpcChannel = new GrpcCore.Channel(_startupOptions.HostEndpoint!.Host, _startupOptions.HostEndpoint.Port, ChannelCredentials.Insecure, options); #endif return new FunctionRpcClient(grpcChannel); diff --git a/src/DotNetWorker/Hosting/WorkerHostBuilderExtensions.cs b/src/DotNetWorker/Hosting/WorkerHostBuilderExtensions.cs index bbb09eb3d..8722b8cda 100644 --- a/src/DotNetWorker/Hosting/WorkerHostBuilderExtensions.cs +++ b/src/DotNetWorker/Hosting/WorkerHostBuilderExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.Text.Json; using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Configuration; @@ -200,7 +201,14 @@ internal static void RegisterCommandLine(IConfigurationBuilder builder, string[] cmdLine[i] = $"\"{arg}\""; } - builder.AddCommandLine(cmdLine); + var switchMappings = new Dictionary + { + { "--functions-uri", "Functions:Worker:HostEndpoint" }, + { "--functions-request-id", "Functions:Worker:RequestId" }, + { "--functions-worker-id", "Functions:Worker:WorkerId" }, + { "--functions-grpc-max-message-length", "Functions:Worker:GrpcMaxMessageLength" }, + }; + builder.AddCommandLine(cmdLine, switchMappings); } } }