'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.