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

14

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

«Не удалось загрузить тип« Microsoft.AspNetCore.Mvc.MvcJsonOptions »из сборки« Microsoft.AspNetCore.Mvc.Formatters.Json, версия = 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();

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

fingers10
источник

Ответы:

6

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

silkfire
источник
Это означает, что я не могу использовать netstandard2.1библиотеку классов со ссылкой на Microsoft.AspNetCore.Mvc2.2.0 в netcoreapp3.0? Вместо этого я должен изменить , netstandard2.1чтобы netcoreapp3.0и добавить FrameworkReferenceк Microsoft.AspNetCore.App?
finger10
50

Я не уверен, что это решает проблему 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.

Ли Ричардсон
источник
Свойство Versionдля объекта OpenApiInfoзаявляет, что он ТРЕБУЕТСЯ быть определенным. Если я пропущу его определение, все будет работать, за исключением того, что рядом с именем моего приложения в пользовательском интерфейсе, сгенерированном сваггером, напечатаны 2 специальные метки (одна содержит версию, которую мы пропустили, другая OAS3. Почему это требуется и что мы обозначаем этим? В документах, на которые вы ссылаетесь, это определяется как v1. Должен ли он остаться таким, или это просто пример - мы должны вместо этого хранить версию нашего приложения там. Это может быть что угодно, например0.0.1a-ffg
SpiritBob
@Support Monica - SpiritBob: он входит в информационный объект файла swagger.json. Это требуется, потому что это требуется спецификацией. У меня никогда не было необходимости менять его с "v1". Вы можете прочитать больше об этом в официальных документах здесь: github.com/OAI/OpenAPI-Specification/blob/master/versions/…
Lee Richardson
Спасибо, ты решил мою проблему
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, иначе это не сработает.
Фрэнк Томас
Я не могу заставить это работать для .NET 3.1
Morten_564834