'Impossibile caricare il tipo' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'dall'assembly' Microsoft.AspNetCore.Mvc.Formatters.Json, Versione = 3.0.0.0


14

Sto usando la netstandard2.1libreria nella mia netcoreapp3.0applicazione web. Quando aggiungo il mio servizio Startup, visualizzo l'errore seguente:

'Impossibile caricare il tipo' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'dall'assembly' Microsoft.AspNetCore.Mvc.Formatters.Json, Versione = 3.0.0.0

Sto anche usando alcune funzionalità del Microsoft.AspNetCore.Mvcpacchetto 2.2.0 nella mia libreria di classi.

Ecco la mia biblioteca .csproj,

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

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

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

</Project>

Ecco la mia ServiceExtensionslezione dalla mia biblioteca,

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

Ecco la mia ConfigureLibraryOptionsclasse,

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

Ecco il ConfigureServicesda Startup,

services.AddControllersWithViews().AddMyLibrary();

Aiutatemi sul motivo per cui ricevo questo errore e assistete su come risolverlo?

Risposte:


6

Il motivo per cui ricevi l'errore è perché MvcJsonOptionsè stato rimosso in .NET Core 3.0; puoi leggere di più sulle ultime modifiche qui .


Questo significa che non posso usare la netstandard2.1libreria di classi con riferimento alla Microsoft.AspNetCore.Mvc2.2.0 in netcoreapp3.0? Invece dovrei cambiare il netstandard2.1to netcoreapp3.0e aggiungere un FrameworkReferenceal Microsoft.AspNetCore.App?
— finger10

50

Non sono sicuro che questo risolva il problema di OP, ma questo errore si verifica anche quando si utilizza Swashbuckle 4 in .Net Core 3. La soluzione è utilizzare Swashbuckle 5. ie

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

Quindi dovrai aggiornarlo in Startup.cs. Generalmente ciò implica il prefisso di classi che non vengono compilate con OpenApies

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

diventa

options.SwaggerDoc("v1", OpenApiInfo

OpenApiSecuritySchemeDiventa ancheApiKeyScheme

Vedi anche i documenti su https://github.com/domaindrivendev/Swashbuckle.AspNetCore


La proprietà Versionper l'oggetto OpenApiInfoafferma che è NECESSARIO essere definito. Se salto la definizione, tutto funziona, oltre a non avere 2 etichette speciali stampate accanto al nome della mia applicazione nell'interfaccia utente generata dallo swagger (Uno contiene la versione che abbiamo omesso, l'altro OAS3. Cosa significa?). Perché è richiesto e cosa intendiamo con esso? Nei documenti che hai collegato, è definito come v1. Dovrebbe rimanere così, o è un semplice esempio - dovremmo piuttosto memorizzare lì la versione della nostra applicazione. Può essere qualsiasi cosa, come ad esempio0.0.1a-ffg
— SpiritBob,

@Support Monica - SpiritBob: va nell'oggetto info del file swagger.json. È richiesto perché richiesto dalle specifiche. Non ho mai avuto bisogno di cambiarlo da "v1". Puoi leggere di più al riguardo nei documenti ufficiali qui: github.com/OAI/OpenAPI-Specification/blob/master/versions/…
— Lee Richardson,

grazie, hai risolto il mio problema
— D__

3

netstandard2.1 a 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
Questa risposta sarebbe notevolmente migliorata SE includessi anche il fatto che avremo bisogno di installare il pacchetto NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson o questo non funzionerà.
— Frank Thomas

Non riesco a farlo funzionare per .NET 3.1
— Morten_564834
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.