Azure Function App使用System.Runtime.Caching内存缓存时程序集加载失败问题求助
解决Azure Functions中System.Runtime.Caching加载System.Configuration.ConfigurationManager失败的问题
你在基于.NET Core 3.1的Azure Functions v3环境中使用System.Runtime.Caching.MemoryCache时遇到的程序集加载错误,大概率是因为高版本依赖包与Functions运行环境的兼容性问题——虽然你已经安装了对应版本的System.Configuration.ConfigurationManager,但.NET Core 3.1的Functions运行时在加载5.0.0版本的程序集时存在上下文匹配问题。下面是几个可行的解决方案:
方案1:降低依赖包版本到适配.NET Core 3.1的稳定版
最直接的修复方式是把System.Runtime.Caching和System.Configuration.ConfigurationManager的版本降到4.7.0,这个版本是专门为.NET Core 3.1优化的,和Azure Functions v3环境兼容性更好。
修改你的csproj文件:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <AzureFunctionsVersion>v3</AzureFunctionsVersion> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.11" /> <PackageReference Include="System.Configuration.ConfigurationManager" Version="4.7.0" /> <PackageReference Include="System.Runtime.Caching" Version="4.7.0" /> </ItemGroup> </Project>
修改后重新构建部署,就能解决加载问题。
方案2:添加程序集绑定重定向(若坚持使用5.0.0版本)
如果你一定要保留5.0.0版本的依赖包,可以通过绑定重定向让运行时正确定位程序集:
- 在项目根目录创建
runtimeconfig.template.json文件,内容如下:
{ "configProperties": { "assemblyBinding": { "dependencies": { "System.Configuration.ConfigurationManager": { "assemblyVersion": "5.0.0.0", "publicKeyToken": "cc7b13ffcd2ddd51" } } } } }
- 同时在csproj中开启自动绑定重定向:
<PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <AzureFunctionsVersion>v3</AzureFunctionsVersion> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>
方案3:改用.NET Core原生的IMemoryCache(推荐)
更符合.NET Core和Azure Functions生态的做法是使用原生的IMemoryCache,它支持依赖注入,彻底避免System.Runtime.Caching带来的兼容性问题:
- 创建Startup类注册服务:
using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection; [assembly: FunctionsStartup(typeof(YourFunctionAppNamespace.Startup))] namespace YourFunctionAppNamespace { public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { // 注册IMemoryCache服务 builder.Services.AddMemoryCache(); } } }
- 修改Function类,通过构造函数注入IMemoryCache:
using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; using System.Threading.Tasks; public class Function1 { private readonly IMemoryCache _memoryCache; // 通过构造函数注入IMemoryCache public Function1(IMemoryCache memoryCache) { _memoryCache = memoryCache; } [FunctionName("Function1")] public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log) { // 使用IMemoryCache缓存数据 _memoryCache.Set("123", "123", new MemoryCacheEntryOptions { Priority = CacheItemPriority.Normal }); return new OkObjectResult(""); } }
这个方案不仅解决了当前的程序集加载问题,也更贴合Azure Functions的最佳实践,后续维护起来更顺畅。
内容的提问来源于stack exchange,提问作者prakashrajansakthivel
相关产品推荐
相关产品推荐

