使用 Azure Functions Core Tools 在本地运行 Azure 函数时出现问题

Posted

技术标签:

【中文标题】使用 Azure Functions Core Tools 在本地运行 Azure 函数时出现问题【英文标题】:Problem when running Azure function locally using Azure Functions Core Tools 【发布时间】:2022-01-09 22:06:17 【问题描述】:

我正在开发一个持久的 Azure 功能。我正在使用 .NET Core 3.1。它是一个 HTTP 触发的函数。当我从 Visual Studio 调试它然后通过调用端点来触发它时,一切正常。

在同一台机器上,我安装了 Azure Functions Core Tools (4.0.3971)。我运行存储模拟器:

C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator\AzureStorageEmulator.exe start

然后转到我的函数所在的目录并输入:

func start

一切都和以前一样,所以我通过向端点发出请求来触发我的函数。它开始工作,但随后抛出以下错误:

[2021-12-03T14:25:51.081Z] Executed 'MyFunction_Process' (Failed, Id=f709e4c0-f74e-4303-a68b-6d5d55f0f7e5, Duration=2182ms)
[2021-12-03T14:25:51.086Z] System.Private.CoreLib: Exception while executing function: MyFunctionIntegration_Process. Microsoft.EntityFrameworkCore: The type initializer for 'Microsoft.EntityFrameworkCore.EnumerableMethods' threw an exception. System.Linq: Sequence contains more than one matching element.
[2021-12-03T14:25:51.101Z] myfunctionsingleinstance: Function 'MyFunction_Process (Activity)' failed with an error. Reason: System.TypeInitializationException: The type initializer for 'Microsoft.EntityFrameworkCore.EnumerableMethods' threw an exception.
[2021-12-03T14:25:51.106Z]  ---> System.InvalidOperationException: Sequence contains more than one matching element
[2021-12-03T14:25:51.110Z]    at System.Linq.ThrowHelper.ThrowMoreThanOneMatchException()
[2021-12-03T14:25:51.112Z]    at System.Linq.Enumerable.TryGetSingle[TSource](IEnumerable`1 source, Func`2 predicate, Boolean& found)
[2021-12-03T14:25:51.113Z]    at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source, Func`2 predicate)
[2021-12-03T14:25:51.115Z]    at Microsoft.EntityFrameworkCore.EnumerableMethods..cctor()
[2021-12-03T14:25:51.116Z]    --- End of inner exception stack trace ---
[2021-12-03T14:25:51.117Z]    at Microsoft.EntityFrameworkCore.EnumerableMethods.get_AnyWithPredicate()
[2021-12-03T14:25:51.119Z]    at Microsoft.EntityFrameworkCore.Query.Internal.AllAnyToContainsRewritingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
[2021-12-03T14:25:51.121Z]    at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
[2021-12-03T14:25:51.124Z]    at Microsoft.EntityFrameworkCore.Query.QueryTranslationPreprocessor.Process(Expression query)
[2021-12-03T14:25:51.126Z]    at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
[2021-12-03T14:25:51.128Z]    at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
[2021-12-03T14:25:51.129Z]    at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
[2021-12-03T14:25:51.131Z]    at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass9_0`1.<Execute>b__0()
[2021-12-03T14:25:51.133Z]    at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey, Func`1 compiler)
[2021-12-03T14:25:51.134Z]    at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
[2021-12-03T14:25:51.136Z]    at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
[2021-12-03T14:25:51.140Z]    at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
[2021-12-03T14:25:51.141Z]    at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetEnumerator()
[2021-12-03T14:25:51.143Z]    at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.IncludableQueryable`2.GetEnumerator()
[2021-12-03T14:25:51.144Z]    at System.Linq.Enumerable.ToDictionary[TSource,TKey](IEnumerable`1 source, Func`2 keySelector, IEqualityComparer`1 comparer)
[2021-12-03T14:25:51.146Z]    at System.Linq.Enumerable.ToDictionary[TSource,TKey](IEnumerable`1 source, Func`2 keySelector)
[2021-12-03T14:25:51.148Z]    at Logistics.Infrastructure.MyFunctionIntegration.Integration.GetDbRows(ILogger log) in C:\Users\Michal\source\repos\Logistics\src\backend\src\infrastructure\Logistics.Infrastructure.MyFunctionIntegration\Integration.cs:line 103
...

第 103 行是:

var dbEntities = _dbContext.Carriers.IgnoreQueryFilters().Include(c => c.CarrierGitd.Address).ToDictionary(c => c.CarrierGitd?.LicenseNumber);

所以当我尝试从数据库中获取数据时会发生这种情况。但它工作正常,当我在 VS 中调试时。数据库是一样的。问题在哪里?

【问题讨论】:

【参考方案1】:

当我在 SecondLib 依赖项中将 Microsoft.EntityFrameworkCore 升级到 5.0.0 时,问题就消失了。

<ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite" Version="5.0.0" />
  </ItemGroup>

TargetFramework 没有被触动

<TargetFramework>netcoreapp3.1</TargetFramework>
<AzureFunctionsVersion>v3</AzureFunctionsVersion>

注意:

我在 Azure Functions 核心工具版本 3 中遇到了同样的问题。如果您的实体框架核心版本在第二个 lib 依赖项中是 5.x,请升级并尝试一次。或者如果可能,将 Azure Functions Core 工具版本降级到 3 并检查。

【讨论】:

我降级到 Azure Functions Core Tools 3 并开始工作。谢谢! 你好@MichalB。很高兴您的问题得到解决!【参考方案2】:

我需要同时支持 v3 和 v4 函数项目,所以我只复制了 V3 工具目录 C:\Program Files\Microsoft\Azure Functions Core Tools(然后将其命名为“Azure Functions Core Tools v3”),安装了 V4 并创建了一个批处理文件在旧 v3 项目的目录中运行正确的“func.exe”。

【讨论】:

以上是关于使用 Azure Functions Core Tools 在本地运行 Azure 函数时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

Azure Functions Swashbuckle:在重建期间无法解析程序集“Microsoft.AspNetCore.Mvc.Core”

如何在使用 .NET Core 3.1 通过 Visual Studio 2019 开发 Azure Functions 时使用 AD 身份验证

如何将 Azure Functions v3 迁移到 .net core 5.0

Azure Functions 3.1 .NET Core HttpResponse 在序列化对象上更改大小写

如何在 .NET Core 3.1 的 Azure Functions 中将 Serilog 配置为默认日志提供程序?

AZURE_FUNCTIONS_ENVIRONMENT 与 ASPNETCORE_ENVIRONMENT