'无法从程序集'Microsoft.AspNetCore.Mvc.Formatters.Json,版本= 3.0.0.0加载类型'Microsoft.AspNetCore.Mvc.MvcJsonOptions'

fin*_*s10 5 c# json.net asp.net-core-mvc asp.net-core-3.0 .net-standard-2.1

netstandard2.1netcoreapp3.0Web应用程序中使用库。在中添加服务时Startup,出现以下错误:

'无法从程序集'Microsoft.AspNetCore.Mvc.Formatters.Json,版本= 3.0.0.0加载类型'Microsoft.AspNetCore.Mvc.MvcJsonOptions'

我还在Microsoft.AspNetCore.Mvc类库中使用了2.2.0包中的某些功能。

这是我的图书馆.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
  </ItemGroup>

</Project>
Run Code Online (Sandbox Code Playgroud)

这是ServiceExtensions我图书馆的课,

public static class ServiceExtensions
{
    public static IMvcBuilder AddMyLibrary(this IMvcBuilder builder)
    {
        builder.Services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        builder.AddJsonOptions(options =>
        {
            options.SerializerSettings.ContractResolver = new DefaultContractResolver();
        });
        builder.Services.ConfigureOptions<ConfigureLibraryOptions>();

        return builder;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的ConfigureLibraryOptions课,

public class ConfigureLibraryOptions : IConfigureOptions<MvcOptions>
{
    public void Configure(MvcOptions options)
    {
        options.ModelBinderProviders.Insert(0, new CustomBinderProvider());
    }
}
Run Code Online (Sandbox Code Playgroud)

这是ConfigureServices来自Startup

services.AddControllersWithViews().AddMyLibrary();
Run Code Online (Sandbox Code Playgroud)

请帮助我为什么会出现此错误,并协助解决该问题?

sil*_*ire 19

您收到错误的原因是因为MvcJsonOptions已在 .NET Core 3.0 中删除;您可以在此处阅读有关重大更改的更多信息。

  • 这意味着我无法在“netcoreapp3.0”中引用“Microsoft.AspNetCore.Mvc”2.2.0 使用“netstandard2.1”类库?相反,我应该将“netstandard2.1”更改为“netcoreapp3.0”并将“FrameworkReference”添加到“Microsoft.AspNetCore.App”? (2认同)

Yas*_*osh 18

netstandard2.1 到 netcoreapp3.0 MvcJsonOptions -> MvcNewtonsoftJsonOptions

public IServiceProvider ConfigureServices(IServiceCollection services)
{
            //MVC
            services.AddControllersWithViews(options =>
            {
            }).AddNewtonsoftJson();

            services.PostConfigure<MvcNewtonsoftJsonOptions>(options => {
                options.SerializerSettings.ContractResolver = new MyCustomContractResolver()
                {
                    NamingStrategy = new CamelCaseNamingStrategy()
                };
                options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
            });
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您还包括我们需要安装 NuGet 包 Microsoft.AspNetCore.Mvc.NewtonsoftJson 的事实,那么这个答案将会大大改善,否则这将不起作用。 (11认同)

Lee*_*son 10

我不确定这是否可以解决OP的问题,但是当您在.Net Core 3中使用Swashbuckle 4时,也会发生此错误。在撰写本文时,解决方案是使用Swashbuckle 5的预发行版本。

<PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0-rc4" />
Run Code Online (Sandbox Code Playgroud)

然后,您需要在Startup.cs中对其进行升级。一般来说,涉及前缀不与编译类OpenApi

options.SwaggerDoc("v1" new Info ...

变成

options.SwaggerDoc("v1", OpenApiInfo

OpenApiSecurityScheme变成ApiKeyScheme

另请参阅https://github.com/domaindrivendev/Swashbuckle.AspNetCore中的文档