'Typ' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'konnte nicht aus Assembly' Microsoft.AspNetCore.Mvc.Formatters.Json, Version = 3.0.0.0 geladen werden

14

Ich verwende die netstandard2.1Bibliothek in meiner netcoreapp3.0Webanwendung. Beim Hinzufügen meines Dienstes wird Startupfolgende Fehlermeldung angezeigt:

'Typ' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'konnte nicht aus Assembly' Microsoft.AspNetCore.Mvc.Formatters.Json, Version = 3.0.0.0 geladen werden

Ich verwende auch einige Funktionen aus dem Microsoft.AspNetCore.Mvc2.2.0-Paket in meiner Klassenbibliothek.

Hier ist meine Bibliothek .csproj,

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

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

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

</Project>

Hier ist meine ServiceExtensionsKlasse aus meiner Bibliothek,

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

Hier ist meine ConfigureLibraryOptionsKlasse,

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

Hier ist das ConfigureServicesvon Startup,

services.AddControllersWithViews().AddMyLibrary();

Bitte helfen Sie, warum ich diesen Fehler erhalte, und helfen Sie bei der Lösung dieses Fehlers.

Finger10
quelle

Antworten:

6

Der Grund, warum Sie den Fehler erhalten, ist, dass MvcJsonOptionser in .NET Core 3.0 entfernt wurde. Weitere Informationen zu den wichtigsten Änderungen finden Sie hier .

Seidenfeuer
quelle
Dies bedeutet, dass ich keine netstandard2.1Klassenbibliothek mit Bezug auf Microsoft.AspNetCore.Mvc2.2.0 in verwenden kann netcoreapp3.0. Stattdessen sollte ich das netstandard2.1to ändern netcoreapp3.0und ein FrameworkReferenceto hinzufügen Microsoft.AspNetCore.App?
Finger10
50

Ich bin nicht sicher, ob dies das Problem von OP löst, aber dieser Fehler tritt auch auf, wenn Sie Swashbuckle 4 in .Net Core 3 verwenden. Die Lösung besteht darin, Swashbuckle 5 zu verwenden

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

Dann müssen Sie es in Startup.cs aktualisieren. Im Allgemeinen umfasst dies das Präfixieren von Klassen, die nicht mit OpenApiz

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

wird

options.SwaggerDoc("v1", OpenApiInfo

auch OpenApiSecuritySchemewirdApiKeyScheme

Siehe auch Dokumente unter https://github.com/domaindrivendev/Swashbuckle.AspNetCore

Lee Richardson
quelle
Die Eigenschaft Versionfür das Objekt OpenApiInfogibt an, dass es definiert werden muss. Wenn ich die Definition überspringe, funktioniert alles, außer dass nicht zwei spezielle Etiketten neben dem Namen meiner Anwendung in der von der Prahlerei generierten Benutzeroberfläche gedruckt werden (eine enthält die Version, die wir weggelassen haben, die andere OAS3. Was bedeutet das?). Warum ist es erforderlich und was bedeuten wir damit? In den von Ihnen verknüpften Dokumenten ist es definiert als v1. Sollte es so bleiben oder ist das nur ein Beispiel - wir sollten stattdessen lieber die Version unserer Anwendung dort speichern . Es kann alles sein, wie0.0.1a-ffg
SpiritBob
@ Support Monica - SpiritBob: Es geht in das Info-Objekt der Datei swagger.json. Es ist erforderlich, weil es von der Spezifikation verlangt wird. Ich musste es nie von "v1" ändern. Sie können mehr darüber in den offiziellen Dokumenten hier lesen: github.com/OAI/OpenAPI-Specification/blob/master/versions/…
Lee Richardson
Danke, du hast mein Problem gelöst
D__
3

netstandard2.1 bis 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
quelle
1
Diese Antwort würde sich erheblich verbessern, wenn Sie auch die Tatsache berücksichtigen, dass wir das NuGet-Paket Microsoft.AspNetCore.Mvc.NewtonsoftJson installieren müssen, da dies sonst nicht funktioniert.
Frank Thomas
Ich kann dies nicht für .NET 3.1
Morten_564834