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


14

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>

这是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;
    }
}

这是我的ConfigureLibraryOptions课,

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

这是ConfigureServices来自Startup

services.AddControllersWithViews().AddMyLibrary();

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

Answers:


6

出现此错误的原因是因为MvcJsonOptions.NET Core 3.0中已将其删除;因此,请参阅。您可以在此处详细了解重大更改。


这意味着我不能使用netstandard2.1参考Microsoft.AspNetCore.Mvc2.2.0的类库netcoreapp3.0?相反,我应该将更netstandard2.1改为netcoreapp3.0并添加FrameworkReferenceMicrosoft.AspNetCore.App
finger10

50

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

<PackageReference Include="Swashbuckle.AspNetCore" Version="5.0.0" />

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

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

变成

options.SwaggerDoc("v1", OpenApiInfo

OpenApiSecurityScheme变成ApiKeyScheme

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


Version对象的属性OpenApiInfo指出需要定义它。如果我跳过对它的定义,那么一切都会正常工作,除了在swagger生成的UI中没有在我的应用程序名称旁边打印两个特殊标签(一个包含我们省略的版本,另一个包含OAS3它的含义是什么?)。为什么需要它,我们用它表示什么?在您链接的文档中,其定义为v1。它是应该保持这样的状态,还是仅是一个示例?我们应该将应用程序的版本存储那里。可以是任何东西,例如0.0.1a-ffg
SpiritBob

@Support Monica-SpiritBob:它进入swagger.json文件的信息对象。这是必需的,因为它是规范所必需的。我从不需要将其从“ v1”更改。:你可以在这里阅读更多关于它的官方文档github.com/OAI/OpenAPI-Specification/blob/master/versions/...
李·理查森

thansk,您解决了我的问题
D__

3

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;
            });
}

1
如果您还包括以下事实,我们将需要安装NuGet包Microsoft.AspNetCore.Mvc.NewtonsoftJson,否则将大大改善此答案。
弗兰克·托马斯

我无法
使它
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.