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.
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.
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.