„Nie można załadować typu” Microsoft.AspNetCore.Mvc.MvcJsonOptions ”z zestawu„ Microsoft.AspNetCore.Mvc.Formatters.Json, Wersja = 3.0.0.0

14

Korzystam z netstandard2.1biblioteki w mojej netcoreapp3.0aplikacji internetowej. Podczas dodawania mojej usługi Startuppojawia się następujący błąd:

„Nie można załadować typu” Microsoft.AspNetCore.Mvc.MvcJsonOptions ”z zestawu„ Microsoft.AspNetCore.Mvc.Formatters.Json, Wersja = 3.0.0.0

Używam również niektórych funkcji z Microsoft.AspNetCore.Mvcpakietu 2.2.0 w mojej bibliotece klas.

Oto moja biblioteka .csproj,

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

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

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

</Project>

Oto moja ServiceExtensionsklasa z mojej biblioteki,

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

Oto moja ConfigureLibraryOptionsklasa

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

Oto ConfigureServicesz Startup,

services.AddControllersWithViews().AddMyLibrary();

Proszę o pomoc, dlaczego otrzymuję ten błąd i pomoc w rozwiązaniu tego problemu?

palce 10
źródło

Odpowiedzi:

6

Przyczyną tego błędu jest to, że MvcJsonOptionszostał usunięty w .NET Core 3.0; więcej o przełomowych zmianach możesz przeczytać tutaj .

jedwabny ogień
źródło
Oznacza to, że nie mogę używać netstandard2.1biblioteki klas w odniesieniu do Microsoft.AspNetCore.Mvc2.2.0 w netcoreapp3.0? Zamiast tego powinien zmienić netstandard2.1się netcoreapp3.0i dodać FrameworkReferencedo Microsoft.AspNetCore.App?
palce10
50

Nie jestem pewien, czy to rozwiązuje problem OP, ale ten błąd występuje również, gdy używasz Swashbuckle 4 w .Net Core 3. Rozwiązaniem jest użycie Swashbuckle 5. tj.

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

Następnie musisz go uaktualnić w Startup.cs. Ogólnie rzecz biorąc, obejmuje to prefiksowanie klas, które nie kompilują się OpenApinp

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

staje się

options.SwaggerDoc("v1", OpenApiInfo

OpenApiSecuritySchemeStaje się równieżApiKeyScheme

Zobacz także dokumenty na https://github.com/domaindrivendev/Swashbuckle.AspNetCore

Lee Richardson
źródło
Właściwość Versionobiektu OpenApiInfostwierdza, że ​​należy go zdefiniować WYMAGANE. Jeśli pominę to definiowanie, wszystko działa, poza tym, że nie ma wydrukowanych 2 specjalnych etykiet obok nazwy mojej aplikacji w interfejsie użytkownika wygenerowanym przez swagger (jeden zawiera wersję, którą pominęliśmy, drugi OAS3. Co to znaczy?). Dlaczego jest to wymagane i co z tym rozumiemy? W połączonych dokumentach jest to zdefiniowane jako v1. Jeśli tak powinno pozostać, czy to tylko przykład - powinniśmy raczej przechowywać tam wersję naszej aplikacji. Może to być wszystko, na przykład0.0.1a-ffg
SpiritBob
@ Wsparcie Monica - SpiritBob: przechodzi do obiektu informacyjnego pliku swagger.json. Jest to wymagane, ponieważ jest wymagane przez specyfikację. Nigdy nie musiałem zmieniać go z „v1”. Możesz przeczytać więcej na ten temat w oficjalnych dokumentach tutaj: github.com/OAI/OpenAPI-Specification/blob/master/versions/…
Lee Richardson
Thansk, rozwiązałeś mój problem
D__
3

netstandard2.1 do 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;
            });
}
Yasser Bazrforoosh
źródło
1
Ta odpowiedź zostałaby znacznie ulepszona, JEŚLI uwzględnisz także fakt, że będziemy musieli zainstalować pakiet NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson lub to nie zadziała.
Frank Thomas
Nie mogę tego
włączyć