String array input from query string in Az Function .net5

910 Views Asked by At

Migrated my Azure Function to .net5 the other day and now I'm struggling with basic input binding stuff.

My query => /api/query?sgtins=foo1&sgtins=foo2

On version 3.1, a simple req.Query["sgtins"] would do the job. But now on .net5 I have no idea. Using strings, ints etc. is fine but as soon as I use an IEnumerable it crashes during runtime. Any ideas? Documentation regarding .net5 is pathetic at the moment :(

This is my demo code. Using url as mentioned above.

enter image description here

Here is the exception;

[2021-06-14T08:34:53.015Z] Executed 'Functions.QueryProductEntities' (Failed, Id=5f33b8ab-fdb2-483c-93fc-6dac3bb25ddc, Duration=531ms) [2021-06-14T08:34:53.015Z] System.Private.CoreLib: Exception while executing function: Functions.QueryProductEntities. System.Private.CoreLib: Result: Failure [2021-06-14T08:34:53.015Z] Exception: Microsoft.Azure.Functions.Worker.Diagnostics.Exceptions.FunctionInputConverterException: Error converting 1 input parameters for Function 'QueryProductEntities': Cannot convert input parameter 'sgtins' to type 'System.Collections.Generic.IEnumerable`1[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]' from type 'System.String'. [2021-06-14T08:34:53.015Z] at Microsoft.Azure.Functions.Worker.Context.Features.DefaultModelBindingFeature.BindFunctionInput(FunctionContext context) in D:\a\1\s\src\DotNetWorker.Core\Context\Features\DefaultModelBindingFeature.cs:line 70 [2021-06-14T08:34:53.015Z] at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionExecutor.ExecuteAsync(FunctionContext context) in D:\a\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionExecutor.cs:line 37 [2021-06-14T08:34:53.015Z] at Microsoft.Azure.Functions.Worker.OutputBindings.OutputBindingsMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a\1\s\src\DotNetWorker.Core\OutputBindings\OutputBindingsMiddleware.cs:line 13 [2021-06-14T08:34:53.015Z] at Microsoft.Azure.Functions.Worker.GrpcWorker.InvocationRequestHandlerAsync(InvocationRequest request, IFunctionsApplication application, IInvocationFeaturesFactory invocationFeaturesFactory, ObjectSerializer serializer, IOutputBindingsInfoProvider outputBindingsInfoProvider) in D:\a\1\s\src\DotNetWorker.Grpc\GrpcWorker.cs:line 166 [2021-06-14T08:34:53.015Z] Stack: at Microsoft.Azure.Functions.Worker.Context.Features.DefaultModelBindingFeature.BindFunctionInput(FunctionContext context) in D:\a\1\s\src\DotNetWorker.Core\Context\Features\DefaultModelBindingFeature.cs:line 70 [2021-06-14T08:34:53.015Z] at Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionExecutor.ExecuteAsync(FunctionContext context) in D:\a\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionExecutor.cs:line 37 [2021-06-14T08:34:53.015Z] at Microsoft.Azure.Functions.Worker.OutputBindings.OutputBindingsMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a\1\s\src\DotNetWorker.Core\OutputBindings\OutputBindingsMiddleware.cs:line 13 [2021-06-14T08:34:53.015Z] at Microsoft.Azure.Functions.Worker.GrpcWorker.InvocationRequestHandlerAsync(InvocationRequest request, IFunctionsApplication application, IInvocationFeaturesFactory invocationFeaturesFactory, ObjectSerializer serializer, IOutputBindingsInfoProvider outputBindingsInfoProvider) in D:\a\1\s\src\DotNetWorker.Grpc\GrpcWorker.cs:line 166.

1

There are 1 best solutions below

2
user1672994 On BEST ANSWER

Use the Microsoft.AspNetCore.WebUtilities.QueryHelpers to parse the HttpRequestData.Uri to get the query parameter.

 var queryDictionary = 
    Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(req.Uri.Query);

Now using above dictionary you can the get values collections as

var sgtins = queryDictionary["sgtins"];

Here sgtins is type of StringValues struct. Check StringValues.