.Net Standard 2 包中的 Newtonsoft.Json 依赖项会导致 ASP.Net 核心 MVC 2.



对不起,标题太长了!我对dotnet核心很陌生,所以我怀疑我在这里遇到了依赖问题,但我无法弄清楚原因。这里是:

我已经将一个.Net 4.5.2 库重建为 .Net Standard 2.0 库。该库依赖于Newtonsoft.Json 11.0.1。我将整个项目打包为(本地)nuget 包,因为这似乎是使其可用于多个项目的适当方法。这是存储库:https://github.com/oliver-wood/realex-hpp-dotnet-standard。

这个想法是在 dotnet 核心 2.0 Web 项目中引用此包。所以我启动了Visual Studio,并选择了一个普通的 ASP.Net 核心MVC 2.0应用程序。快速调试显示它启动正常。 https://github.com/oliver-wood/realex-test-dotnetcore

然后我安装了 nuget 包,Web 项目构建没有问题。但是,一旦我开始调试,我就会收到运行时错误:

System.TypeLoadException has been thrown
"Could not load type 'System.Runtime.Serialization.SerializationBinder' 
from assembly 'netstandard, Version=2.0.0.0, Culture=neutral, 
PublicKeyToken=cc7b13ffcd2ddd51'."

运行时错误的图片

at Newtonsoft.Json.JsonSerializer..ctor()
at Newtonsoft.Json.JsonSerializer.Create(JsonSerializerSettings settings)
at Microsoft.AspNetCore.Mvc.ViewFeatures.CookieTempDataProvider..ctor(IDataProtectionProvider dataProtectionProvider, ILoggerFactory loggerFactory, IOptions`1 options)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitIEnumerable(IEnumerableCallSite enumerableCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitSingleton(SingletonCallSite singletonCallSite, ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass22_0.<RealizeService>b__0(ServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
at Microsoft.AspNetCore.Builder.MvcApplicationBuilderExtensions.UseMvc(IApplicationBuilder app, Action`1 configureRoutes)
at realex_test_dotnetcore.Startup.Configure(IApplicationBuilder app, IHostingEnvironment env) in /Users/oliver/Dev/realex-test-dotnetcore/realex-test-dotnetcore/Startup.cs:line 41
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at Microsoft.AspNetCore.Hosting.ConventionBasedStartup.Configure(IApplicationBuilder app)
at Microsoft.AspNetCore.Hosting.Internal.AutoRequestServicesStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder builder)
at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
at realex_test_dotnetcore.Program.BuildWebHost(String[] args) in /Users/oliver/Dev/realex-test-dotnetcore/realex-test-dotnetcore/Program.cs:line 21
at realex_test_dotnetcore.Program.Main(String[] args) in /Users/oliver/Dev/realex-test-dotnetcore/realex-test-dotnetcore/Program.cs:line 17

往下看,Json.Net 被牵连了,看起来它被初创公司在引擎盖下调用.cs调用app.UseMvc()

看起来很像Newtonsoft.Json和内置的dotnet核心库之间存在冲突,但我不确定如何缩小范围并纠正它。任何关于如何解决或接近解决方案的想法,将不胜感激!

在下面的评论@will-x之后于3月17日编辑

我已经在网络标准 1.6 上重建了 nuget 包。这涉及安装更多软件包来填补corefx中的空白,并适当地重写一些代码。Newtonsoft.Json仍然是最新版本11.0.1。

这在我看来并不理想,但让我的发展继续下去。我相当确定我的客户不会给猴子的,但我给;如果可能的话,我更愿意使用最新版本,但如果有问题,我想实用主义会胜出。

我遇到了同样的问题。

我正在维护一个 asp.net 核心 2.0 项目,该项目引用了两个 nuget 包,我也维护这两个包。 asp.net 核心项目的稳定(生产)版本基于 dotnet sdk 2.1.4,两个 nuget 包面向 .netstandard1.6。 最近,asp 项目升级到 dotnet sdk 2.1.101,nuget 包也升级到目标 .netstandard2.0。 asp 项目编译正常,但是在调试中运行时,我看到了像您这样的确切异常。 我也认为它牵涉到Newtonsoft.Json,所以我将Newtonsoft.Json版本从11.0.1降级到10.0.3。 之后,该项目在调试中运行,但在发布过程中抛出异常。 dotnet 发布过程的视图预编译步骤中发生异常:

Could not load file or assembly 'System.Runtime.InteropServices.RuntimeInformation, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
at Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Internal.AssemblyMetadataGenerator.AddAssemblyMetadata(CSharpCompiler compiler, CSharpCompilation compilation, CompilationOptions compilationOptions)
at Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Internal.PrecompileRunCommand.CompileViews(ViewCompilationInfo[] results, String assemblyname)
at Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Internal.PrecompileRunCommand.Execute()
at Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args)
at Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Internal.PrecompilationApplication.Execute(String[] args)

然后,我重新生成了 nuget 包以显式引用 .netstandard 库 2.0.0(而不是默认的 2.0.1)。 这样,asp 项目使用最新的 NewtonSoft.Json 包在调试模式下成功运行。 但是,视图预编译仍然失败。 这时我放弃了。

目前,asp 项目引用了面向 .netstandard 1.6 的旧版本的 nuget 包。 这允许 asp 项目升级继续进行。 但阴影仍然存在于它与.netstandard 2.0软件包的兼容性。

如果对您来说很紧急(就像在我们的例子中,由于在 2.0.6 之前的 aspnetcore 运行时发现了安全漏洞),也许您可以尝试将 nuget 包向下编译为 .netstandard 1.6。

我遇到了同样的问题,并通过确保我项目上的所有 NewtonSoft.Json 依赖项都是 10.0.1 版来解决它。

.net core mvc 中间件依赖于此版本,我在其他项目中引用了较新版本。

最新更新