Azure Functions v3 无法加载文件或程序集“Microsoft.Extensions.Primitives, Version=5.0.0.0

问题描述

在运行名为“Test”的 Azure 函数重定向到我们要使用的服务的外部 URL 后,我遇到了上述错误

 [FunctionName("Test")]
        public IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous,"get","post",Route = null)]HttpRequest req)
        {
            Log.information("C# HTTP trigger function processed a request.");
            
            string url = _authenticationService.GetAuthorizationUri().ToString();
            return new RedirectResult(url);

        }

位于 URL 的站点提示用户授权使用他们的数据,并执行重定向到我们“AuthorizationCallback”之前授权的 URL,以及一个查询字符串参数。

[FunctionName("AuthorizationCallback")]
        public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous,Route = null)] HttpRequest req)
        {
            Log.information("C# HTTP trigger function processed a request.");

            string code = req.Query["code"];
            try
            {
                if (!string.IsNullOrEmpty(code))
                { 
                    await _authenticationService.ExchangeCodeForAccesstoken(code);
                    return new OkResult();
                }
            }
            catch (System.Exception)
            {
                return new UnauthorizedResult();
            }
            return new NotFoundResult();
        }

AuthorizationCallback 函数被命中但在控制台中产生以下错误

enter image description here

这些是当前项目对解决方案的依赖(设置为启动项目):

These are my deps

我已经尝试在当前项目中安装最新的稳定版本 (5.0.0) 和之前的版本 (3.1.13) Microsoft.Extensions.Primitives,但我仍然遇到相同的错误。我注意到无法加载的包在 microsoft.azure.webjobs (3.0.23) 中,在 microsoft.azure.webjobs.extensions.storage (4.0.4) 中,但这些在 完全是另一个项目,用于另一个 azure 函数(blob 触发)。关于如何克服这个错误的任何想法?谢谢大家。

解决方法

适用于 .NET Core 3 的 Azure Functions 主机使用进程内托管模型,这实质上意味着您可以使用的 Microsoft 程序集版本受到限制。发生的情况是项目中的某些内容引用了较新版本的 Microsoft.Extensions.Primitives,但 Azure Functions 主机应用程序已加载该库的较旧版本。

对于 Azure Functions .NET Core 3,您应该将所有 Microsoft.Extensions.* 库限制为 v3.x。您当前拥有 Microsoft.Extensions.DependencyInjection 5.0.1,应将其更改为 3.x。检查 Microsoft.Extensions.* 级别或下方任何位置的任何其他 Packages 库(提示:您可以通过将 Microsoft.Extensions 放在解决方案资源管理器顶部的输入框中快速找到它们)。您可能需要降级其他具有 Microsoft.Extensions.Primitives 作为依赖项的库。

可能还可以通过手动编写一个 bindingRedirect 来将新版本指向旧版本。 Microsoft.Extensions.* 软件包跨版本相对稳定,因此可能会起作用。不过,这会让我非常紧张。