无法加载类型'System.IdentityModel.Tokens.JwtSecurityToken'

10

我有两个库。其中一个使用另一个库,而消费库本身被 Web 应用程序所使用。Web 应用程序返回以下错误,而实例化类型(执行 JWT 签名验证)的代码在两个库的单元测试中都能够成功执行。库和应用程序的目标框架为 .NET 4.5.2,我已验证 Web 应用程序的 .csproj 文件具有有效的引用。

<Reference Include="System.IdentityModel.Tokens.Jwt, Version=5.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">      <HintPath>..\packages\System.IdentityModel.Tokens.Jwt.5.1.4\lib\net451\System.IdentityModel.Tokens.Jwt.dll</HintPath>
 </Reference>

我无法找到GAC中要删除的程序集

C:\Program Files (x86)\Microsoft Visual Studio 11.0>gacutil /u System.IdentityMo
del.Tokens.Jwt
Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.17929
Copyright (c) Microsoft Corporation.  All rights reserved.

No assemblies found matching: System.IdentityModel.Tokens.Jwt
Number of assemblies uninstalled = 0
Number of failures = 0

我已经尝试过清理、重建、重启、删除/bin和/lib并重新构建,但是仍然无法解决问题。个人认为这可能不是System.IdentityModel.Tokens.Jwt本身的问题,而是我需要关于类加载错误等故障排除的指导。我已经专门重新安装了.Tokens包以及所有其他包:

nuget install packages.config

我仍然会出现错误,不是在构建时,而是只有在执行时才会出现:
Server Error in '/' Application.

Could not load type 'System.IdentityModel.Tokens.JwtSecurityToken' from assembly 'System.IdentityModel.Tokens.Jwt, Version=5.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.TypeLoadException: Could not load type 'System.IdentityModel.Tokens.JwtSecurityToken' from assembly 'System.IdentityModel.Tokens.Jwt, Version=5.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.

Source Error: 


Line 12:     protected void Application_Start(object sender, EventArgs e)
Line 13:     {
Line 14:       GlobalConfiguration.Configure(WebApiConfig.Register);
Line 15:     }
Line 16: 

Source File: C:\Dev\Git\Connect-Applications\ControllerlessApp\src\Connect.Rest.MainApp\Global.asax.cs    Line: 14 

Stack Trace: 


[TypeLoadException: Could not load type 'System.IdentityModel.Tokens.JwtSecurityToken' from assembly 'System.IdentityModel.Tokens.Jwt, Version=5.1.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'.]
   System.Reflection.RuntimeAssembly.GetExportedTypes(RuntimeAssembly assembly, ObjectHandleOnStack retTypes) +0
   System.Reflection.RuntimeAssembly.GetExportedTypes() +31
   Plex.Web.UI.ServiceResolverDefaults..ctor() +842

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +138
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +105
   System.Activator.CreateInstance(Type type) +12
   Plex.Activation.AssemblyDefaultRegistrationConvention.Process(Type type, Registry registry) +118
   StructureMap.StringExtensions.Each(IEnumerable`1 enumerable, Action`1 action) in c:\BuildAgent\work\767273992e840853\src\StructureMap\Extensions.cs:10
   StructureMap.StringExtensions.Each(IEnumerable`1 enumerable, Action`1 action) in c:\BuildAgent\work\767273992e840853\src\StructureMap\Extensions.cs:10
   StructureMap.Graph.AssemblyScanner.ScanForAll(PluginGraph pluginGraph) in c:\BuildAgent\work\767273992e840853\src\StructureMap\Graph\AssemblyScanner.cs:248
   StructureMap.Graph.PluginGraph.Seal() in c:\BuildAgent\work\767273992e840853\src\StructureMap\Graph\PluginGraph.cs:121
   StructureMap.PluginGraphBuilder.Build() in c:\BuildAgent\work\767273992e840853\src\StructureMap\PluginGraphBuilder.cs:72
   StructureMap.Container..ctor(Action`1 action) in c:\BuildAgent\work\767273992e840853\src\StructureMap\Container.cs:25
   Plex.Activation.ServiceResolverBuilder.Initialize(ApplicationContext context) +288
   Connect.Rest.Framework.Hosting2.Infrastructure.AppDomainSharedServices.get_ServiceResolver() +1373
   Connect.Rest.Framework.Hosting2.WebApiConfig.Register(HttpConfiguration config) +80
   System.Web.Http.GlobalConfiguration.Configure(Action`1 configurationCallback) +63
   Connect.Rest.MainApp.WebApiApplication.Application_Start(Object sender, EventArgs e) in C:\Dev\Git\Connect-Applications\ControllerlessApp\src\Connect.Rest.MainApp\Global.asax.cs:14

[HttpException (0x80004005): Exception has been thrown by the target of an invocation.]
   System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context, HttpApplication app) +544
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +186
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +172
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +402
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +343

[HttpException (0x80004005): Exception has been thrown by the target of an invocation.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +579
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +112
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +716

你是否已经将JWT库发布到bin文件夹中? - Gusman
谢谢@Gusman。我的做法是将实例化此类型并对其进行所有必要操作的基础库中的所有DLL复制到应用程序的bin目录中。但这并没有改变行为。 - Tom Schulte
1
我遇到了类似的问题,奇怪的是它在单元测试项目中可以运行,但在 Web API 中却不能,两个项目都使用相同版本的 System.IdentityModel.Tokens.Jwt。在我的情况下,我不能只降级到 v4,因为我有其他依赖项需要 v5,这非常令人恼火。 - Nicholas J. Markkula
1个回答

15

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