我最近更新了我的AzureFunctions2app(针对.NET Core2.2)到AzureFunctions3(针对.NET Core3.1)。此升级不包括代码或逻辑更改,只包括框架和包更新。
这就是变化的程度。
以前的项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AzureFunctionsVersion>v2</AzureFunctionsVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="2.2.0" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.29" />
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
</ItemGroup>
...
</Project>更新的项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AzureFunctionsVersion>v3</AzureFunctionsVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Azure.Functions.Extensions" Version="1.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="3.1.0" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.2" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
</ItemGroup>
...
</Project>我有一个HTTP触发器函数,它从Azure表存储数据库读取数据。这一功能已经在生产中运行了将近一年,没有任何问题。在部署升级(v3)函数应用程序之后,我在调用从Azure存储读取数据的HTTP触发器函数时观察到许多OutOfMemoryException的出现。这导致了500个答复。这个函数可以正常工作,偶尔不会抛出一个OutOfMemoryException。我不知道成功和失败之间的区别。
这是发生异常的方法:
private async Task<IEnumerable<T>> ExecuteQuery<T>(CloudTable table, TableQuery<T> query) where T : ITableEntity, new()
{
var results = new List<T>();
TableContinuationToken token = null;
do
{
// Read entities from each query segment.
var segment = await table.ExecuteQuerySegmentedAsync(query, token);
token = segment.ContinuationToken;
results.AddRange(segment); // Build collection of records.
}
while (token != null);
return results;
}应用程序洞察显示,在发生do/while之前,这个OutOfMemoryException循环成功地执行了大约4到6次(不一致)查询段。经过数小时的尝试,我无法在本地复制此错误,甚至指向相同的Azure表存储实例。
我确实将函数应用程序的FUNCTIONS_EXTENSION_VERSION应用程序设置从~2更改为~3。
在这个应用程序中还有其他几个HTTP触发器函数和计时器触发器函数,它们可以从其他来源读取/写入数据,并且可以正常工作。甚至还有一个HTTP触发器函数,它成功地将数据写入相同的Azure表存储表,从而在读取过程中引发问题。目前,我已经重新构建了以v2为目标的Azure函数应用程序(不再有OutOfMemoryException)。
有人知道我可能错过了什么,或者我可以做些什么来解决这个OutOfMemoryException问题吗?
更新
只有当Azure函数应用程序平台设置为64位时,才会出现此OutOfMemoryException问题。当设置为32位时,OutOfMemoryExceptions的狂暴停止。
对于其他在这里寻找解决方案的人,只需将您的功能应用程序平台切换到32位,直到微软解决了本期。

更新:
对于任何阅读这篇文章的人来说,微软在2020年2月初发布了一个修复本期的版本。
https://stackoverflow.com/questions/59548452
复制相似问题