2

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 Answer 1

3

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.

Sign up to request clarification or add additional context in comments.

2 Comments

Thank you sir! That worked! Very odd that this basic input binding functionally isn't there out of the box.
You can access the query parameters by adding them to function parameter list. stackoverflow.com/a/69256872/6332983

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.