Azure函数:无法加载文件或程序集Microsoft.IdentityModel.Tokens,版本为5.2.1.0。

15
我正在编写 Azure 函数以生成 JWT 令牌并将其返回给客户端。代码在本地控制台应用程序中经过测试,似乎一切正常。这是工作中的控制台应用程序和我的函数应用程序中包含的包引用: 当使用 "func host start" 在本地运行函数主机并执行代码时,会出现以下错误:
"Could not load file or assembly 'Microsoft.IdentityModel.Tokens, Version=5.2.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'."
我不明白为什么会发生这种情况,dll 文件与我的应用程序 dll 文件一起位于输出文件夹中。我唯一能想到的是函数主机有自己的一套包,从中获取源码,并且这个包还没有可用,因为它只发布了 12 天。
我不确定。有关此问题发生的原因或如何解决它的任何帮助?
详细信息: Azure Functions Core 工具 (2.0.1-beta.22) 函数运行时版本: 2.0.11415.0

如果有演示代码会更有帮助。 - Tom Sun - MSFT
在处理请求时发生了未处理的异常。 FileLoadException: 无法加载文件或程序集“System.IdentityModel.Tokens.Jwt,Version=5.2.1.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”。 - ubienewbie
我遇到了非常相似的问题...在本地运行正常,但推送到Azure后失败了... - ubienewbie
4个回答

19

我遇到了这个问题,似乎与Azure函数SDK中的某种错误相关。解决方法是添加:

<_FunctionsSkipCleanOutput>true</_FunctionsSkipCleanOutput>

按照此处的说明,将内容添加到您的csproj文件中。


7

我已经安装了这个包 Microsoft.AspNetCore.Authentication.JwtBearer

对于我来说,问题已经解决了。

你可以卸载 System.IdentityModel.Tokens.Jwt

因为 Microsoft 的包依赖于系统包,所以它会自动安装。


这对我也起作用。由于我的应用程序在.NET 6中运行,所以我不得不采用早期版本,但它使事情有了进展。 - nimrod

1
我能够通过使用旧版本的nuget包来解决这个问题。 我的起点是,我从旧项目复制了一个类文件到新项目中。 类文件引用了JwtSecurityToken。 在新项目中,这无法编译,因此我从nuget包管理器中添加了Security.IdentityModel.Tokens.Jwt。 我只添加了最新版本。 这在本地工作得很好,但像您一样,在发布到Azure时失败了。 然后我查看了旧项目并注意到它正在使用5.1.4版本的Security.IdentityModel.Tokens.Jwt。 因此,我将其降级到该版本,并在发布时成功了。

FWIW:这是我做这件事时的v2预览运行时版本。

https://<mysite>.azurewebsites.net/admin/host/status?code=<myadminkey>
{
"id": "<mysite>",
"state": "Running",
"version": "2.0.11587.0",
"versionDetails": "2.0.11587.0-beta1 Commit hash: 1e9e7a8dc8a68a3eff63ee8604926a8d3d1902d6"
}

0

简介

以上方法都不适用于我,这种情况偶尔会发生,但今天一直出现。唯一的原因是 Microsoft.IdentityModel.Tokens 没有在执行项目中被直接引用,而是在一个引用项目中。虽然库位于 bin 文件夹中,但它仍然无法加载。

参考资料

解决另一个问题的此解决方案 获取提示后,我能够像下面这样解决它:

解决方案

在应用程序入口类中创建一个静态构造函数

static MainClass()
{
    AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}

添加处理程序。
private static System.Reflection.Assembly? CurrentDomain_AssemblyResolve(object? sender, ResolveEventArgs args)
{
    var domain = sender as AppDomain;
    var assemblies = domain.GetAssemblies();

    foreach(var assembly in assemblies)
    {
        if (assembly.FullName.IsEqualTo(args.Name))
        {
            return assembly;
        }
    }

    var folder = AppDomain.CurrentDomain.BaseDirectory;
    var name = args.GetLibraryName().Name.Split(Symbols.Comma).FirstOrDefault();
    var library = $"{name}.dll";
    var file = Path.Combine(folder, library);

    if (File.Exists(file))
    {
        return Assembly.LoadFrom(file);
    }

    return null;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接