"Не удалось загрузить тип Microsoft.AspNetCore.Mvc.MvcJsonOptions" из сборки Microsoft.AspNetCore.Mvc.Formatters.Json, Version=3.0.0.0

Я использую netstandard2.1 библиотека в моем netcoreapp3.0веб приложение. При добавлении моей услуги вStartup, Я получаю следующую ошибку:

"Не удалось загрузить тип Microsoft.AspNetCore.Mvc.MvcJsonOptions" из сборки Microsoft.AspNetCore.Mvc.Formatters.Json, Version=3.0.0.0

Я также использую некоторые функции из 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();

Пожалуйста, помогите, почему я получаю эту ошибку, и помогите, как ее решить?

4 ответа

Решение

Причина ошибки в том, что MvcJsonOptionsудален в.NET Core 3.0; вы можете узнать больше о критических изменениях здесь.

Я не уверен, решает ли это проблему OP, но эта ошибка также возникает, когда вы используете Swashbuckle 4 в.Net Core 3. Решением является использование 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

Netstandard 2.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;
            });
}

Проблема, скорее всего, связана с несовместимыми пакетами nuget для.net core 3.1 выше. Взгляните на свои пакеты и в конечном итоге обновитесь до совместимой версии ядра 3.1. Это действительно должно решить проблему, которая у меня была с Automapper, а у других - со Swagger.

Если вы используете AutoMapper, вам следует перейти на 7.0.0.

См. https://medium.com/@nicky2983/how-to-using-automapper-on-asp-net-core-3-0-via-dependencyinjection-a5d25bd33e5b

Когда вы настраиваете Swashbuckle.AspNetCore, необходимый для настройки ApiKeyScheme, становится OpenApiSecurityScheme, он меняет схему с

 c.AddSecurityDefinition("Bearer", new ApiKeyScheme { In = "header", Description = 
 "Please enter JWT with Bearer into field", Name = "Authorization", Type = "apiKey" 
 });
 c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>> {
 { "Bearer", Enumerable.Empty<string>() }, });

Чтобы

    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
    Description =
        "JWT Authorization header using the Bearer scheme. \r\n\r\n Enter 'Bearer' [space] and then your token in the text input below.\r\n\r\nExample: \"Bearer 12345abcdef\"",
    Name = "Authorization",
    In = ParameterLocation.Header,
    Type = SecuritySchemeType.ApiKey,
    Scheme = "Bearer"
});

c.AddSecurityRequirement(new OpenApiSecurityRequirement()
{
    {
        new OpenApiSecurityScheme
        {
            Reference = new OpenApiReference
            {
                Type = ReferenceType.SecurityScheme,
                Id = "Bearer"
            },
            Scheme = "oauth2",
            Name = "Bearer",
            In = ParameterLocation.Header,

        },
        new List<string>()
    }
});

В моем случае решением было добавить services.AddControllers()как описано в https://github.com/RicoSuter/NSwag/issues/1961#issuecomment-515631411.

Другие вопросы по тегам