'Не вдалося завантажити тип' 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();

Будь ласка, допоможіть, чому я отримую цю помилку, і допоможіть, як вирішити цю проблему?

Відповіді:


6

Причина, за якою ви отримуєте помилку, полягає в тому, що MvcJsonOptionsвона була видалена в .NET Core 3.0; ви можете ознайомитись із новими змінами тут .


Це означає, що я не можу використовувати netstandard2.1бібліотеку класів із посиланням на Microsoft.AspNetCore.Mvc2.2.0 в netcoreapp3.0? Натомість я повинен змінити netstandard2.1на netcoreapp3.0та додати FrameworkReferenceдо Microsoft.AspNetCore.App?
пальці10

50

Я не впевнений, чи вирішує це проблема ОП, але ця помилка виникає також при використанні 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вказує на те, що ВИНАХОДЖЕНО визначити. Якщо я пропускаю його визначення, все працює, за винятком того, що біля імені мого додатка в інтерфейсі, створеному за допомогою swagger, надруковано дві спеціальні мітки (одна містить версію, яку ми опустили, інша 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, або це не буде працювати.
Френк Томас

Я не можу змусити це працювати для .NET 3.1
Morten_564834
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.