'Impossible de charger le type' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'de l'assembly' Microsoft.AspNetCore.Mvc.Formatters.Json, Version = 3.0.0.0

14

J'utilise la netstandard2.1bibliothèque dans mon netcoreapp3.0application Web. Lors de l'ajout de mon service Startup, j'obtiens l'erreur ci-dessous:

'Impossible de charger le type' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'de l'assembly' Microsoft.AspNetCore.Mvc.Formatters.Json, Version = 3.0.0.0

J'utilise également certaines fonctionnalités du Microsoft.AspNetCore.Mvcpackage 2.2.0 dans ma bibliothèque de classes.

Voici ma bibliothèque .csproj,

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

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

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

</Project>

Voici ma ServiceExtensionsclasse de ma bibliothèque,

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

Voici ma ConfigureLibraryOptionsclasse,

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

Voici le ConfigureServicesde Startup,

services.AddControllersWithViews().AddMyLibrary();

Veuillez expliquer pourquoi je reçois cette erreur et vous aider à résoudre ce problème.

doigts10
la source

Réponses:

6

La raison pour laquelle vous obtenez l'erreur est parce qu'elle MvcJsonOptionsa été supprimée dans .NET Core 3.0; vous pouvez en savoir plus sur les changements de rupture ici .

feu de soie
la source
Cela signifie que je ne peux pas utiliser netstandard2.1la bibliothèque de classes en référence à Microsoft.AspNetCore.Mvc2.2.0 dans netcoreapp3.0? Au lieu de cela , je devrais changer netstandard2.1pour netcoreapp3.0et ajouter un FrameworkReferenceà Microsoft.AspNetCore.App?
doigts10
50

Je ne sais pas si cela résout le problème de l'OP, mais cette erreur se produit également lorsque vous utilisez Swashbuckle 4 dans .Net Core 3. La solution consiste à utiliser Swashbuckle 5. ie

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

Ensuite, vous devrez le mettre à niveau dans Startup.cs. En général, cela implique le préfixage des classes qui ne compilent pas avecOpenApi par exemple

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

devient

options.SwaggerDoc("v1", OpenApiInfo

aussi OpenApiSecuritySchemedevientApiKeyScheme

Voir également les documents sur https://github.com/domaindrivendev/Swashbuckle.AspNetCore

Lee Richardson
la source
La propriété Versionde l'objet OpenApiInfoindique qu'il est OBLIGATOIRE d'être défini. Si je saute la définition, tout fonctionne, à part le fait de ne pas avoir 2 étiquettes spéciales imprimées à côté du nom de mon application dans l'interface utilisateur générée par le swagger (l'une contient la version que nous avons omise, l'autre OAS3. Qu'est-ce que cela signifie?). Pourquoi est-elle requise et que signifions-nous avec elle? Dans les documents que vous avez liés, il est défini comme v1. Si cela devait rester comme ça, ou n'est-ce qu'un simple exemple - nous devrions plutôt y stocker la version de notre application. Cela peut être n'importe quoi, comme0.0.1a-ffg
SpiritBob
@Support Monica - SpiritBob: il va dans l'objet info du fichier swagger.json. Il est obligatoire car il est requis par la spécification. Je n'ai jamais eu besoin de le changer de "v1". Vous pouvez en savoir plus à ce sujet dans les documents officiels ici: github.com/OAI/OpenAPI-Specification/blob/master/versions/…
Lee Richardson
merci, vous avez résolu mon problème
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;
            });
}
Yasser Bazrforoosh
la source
1
Cette réponse serait grandement améliorée SI vous incluez également le fait que nous devrons installer le package NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson ou cela ne fonctionnera pas.
Frank Thomas
Je n'arrive pas à faire fonctionner cela pour .NET 3.1
Morten_564834