从 Az Function .net5

问题描述

前几天将我的 Azure 函数迁移到 .net5,现在我正在为基本的输入绑定问题苦苦挣扎。

我的查询 => /api/query?sgtins=foo1&sgtins=foo2

在 3.1 版中,一个简单的 req.Query["sgtins"] 就可以完成这项工作。但现在在 .net5 上我不知道。使用字符串、整数等很好,但是一旦我使用 IEnumerable,它就会在运行时崩溃。有任何想法吗?目前关于 .net5 的文档很可悲:(

这是我的演示代码。如上所述使用 url。

enter image description here

这是个例外;

[2021-06-14T08:34:53.015Z] 执行“Functions.QueryProductEntities”(失败,Id=5f33b8ab-fdb2-483c-93fc-6dac3bb25ddc,持续时间=531ms) [2021-06-14T08:34:53.015Z] System.Private.CoreLib:执行函数时出现异常:Functions.QueryProductEntities。 System.Private.CoreLib:结果:失败 [2021-06-14T08:34:53.015Z] 异常:Microsoft.Azure.Functions.Worker.Diagnostics.Exceptions.FunctionInputConverterException:将函数“QueryProductEntities”的 1 个输入参数转换为错误:无法将输入参数“sgtins”转换为“System”类型.Collections.Generic.IEnumerable`1[[System.String,System.Private.CoreLib,Version=5.0.0.0,Culture=neutral,PublicKeyToken=7cec85d7bea7798e]]' 来自'System.String'类型。 [2021-06-14T08:34:53.015Z] 在 Microsoft.Azure.Functions.Worker.Context.Features.DefaultModelBindingFeature.BindFunctionInput(FunctionContext context) 在 D:\a\1\s\src\DotNetWorker.Core\Context\ Features\DefaultModelBindingFeature.cs:line 70 [2021-06-14T08:34:53.015Z] 在 D:\a\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionExecutor 中的 Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionExecutor.ExecuteAsync(FunctionContext context)。 cs:第37行 [2021-06-14T08:34:53.015Z] 在 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] 在 Microsoft.Azure.Functions.Worker.GrpcWorker.InvocationRequestHandlerAsync(InvocationRequest 请求,IFunctionsApplication 应用程序,IInvocationFeaturesFactory invocationFeaturesFactory,ObjectSerializer 序列化程序,IoUtputBindingsInfoProvider 输出绑定:\InfoProvider)\ src\DotNetWorker.Grpc\GrpcWorker.cs:line 166 [2021-06-14T08:34:53.015Z] 堆栈:在 Microsoft.Azure.Functions.Worker.Context.Features.DefaultModelBindingFeature.BindFunctionInput(FunctionContext context) 在 D:\a\1\s\src\DotNetWorker.Core\ Context\Features\DefaultModelBindingFeature.cs:line 70 [2021-06-14T08:34:53.015Z] 在 D:\a\1\s\src\DotNetWorker.Core\Invocation\DefaultFunctionExecutor 中的 Microsoft.Azure.Functions.Worker.Invocation.DefaultFunctionExecutor.ExecuteAsync(FunctionContext context)。 cs:第37行 [2021-06-14T08:34:53.015Z] 在 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] 在 Microsoft.Azure.Functions.Worker.GrpcWorker.InvocationRequestHandlerAsync(InvocationRequest 请求,IFunctionsApplication 应用程序,IInvocationFeaturesFactory invocationFeaturesFactory,ObjectSerializer 序列化程序,IoUtputBindingsInfoProvider 输出绑定:\InfoProvider)\ src\DotNetWorker.Grpc\GrpcWorker.cs:line 166.

解决方法

使用 Microsoft.AspNetCore.WebUtilities.QueryHelpers 解析 HttpRequestData.Uri 以获取查询参数。

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

现在使用上面的字典你可以得到值集合

var sgtins = queryDictionary["sgtins"];

这里的 sgtinsStringValues 结构体的类型。检查StringValues