'Tidak dapat memuat jenis' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'dari assembly' Microsoft.AspNetCore.Mvc.Formatters.Json, Versi = 3.0.0.0

14

Saya menggunakan netstandard2.1perpustakaan di netcoreapp3.0aplikasi web saya . Saat menambahkan layanan saya Startup, saya mendapatkan kesalahan di bawah ini:

'Tidak dapat memuat jenis' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'dari assembly' Microsoft.AspNetCore.Mvc.Formatters.Json, Versi = 3.0.0.0

Saya juga menggunakan beberapa fitur dari Microsoft.AspNetCore.Mvcpaket 2.2.0 di perpustakaan kelas saya.

Ini perpustakaan saya .csproj,

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

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

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

</Project>

Ini ServiceExtensionskelas saya dari perpustakaan saya,

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

Ini ConfigureLibraryOptionskelas saya ,

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

Ini ConfigureServicesdari Startup,

services.AddControllersWithViews().AddMyLibrary();

Tolong bantu mengapa saya mendapatkan kesalahan ini dan membantu cara mengatasi ini?

jari10
sumber

Jawaban:

6

Alasan Anda mendapatkan kesalahan adalah karena MvcJsonOptionstelah dihapus di .NET Core 3.0; Anda dapat membaca lebih lanjut tentang perubahan yang melanggar di sini .

ulat sutra
sumber
Ini berarti saya tidak bisa menggunakan netstandard2.1perpustakaan kelas dengan referensi ke Microsoft.AspNetCore.Mvc2.2.0 di netcoreapp3.0? Alih-alih, saya harus mengubah netstandard2.1to netcoreapp3.0dan menambahkan FrameworkReferenceke Microsoft.AspNetCore.App?
fingers10
50

Saya tidak yakin apakah ini memecahkan masalah OP, tetapi kesalahan ini juga terjadi ketika Anda menggunakan Swashbuckle 4 di .Net Core 3. Solusinya adalah menggunakan Swashbuckle 5. yaitu

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

Maka Anda harus memutakhirkannya di Startup.cs. Umumnya yang melibatkan kelas awalan yang tidak dikompilasi dengan OpenApimis

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

menjadi

options.SwaggerDoc("v1", OpenApiInfo

Juga OpenApiSecuritySchememenjadiApiKeyScheme

Lihat juga dokumen di https://github.com/domaindrivendev/Swashbuckle.AspNetCore

Lee Richardson
sumber
Properti Versionuntuk objek OpenApiInfomenyatakan bahwa ia DIBUTUHKAN untuk didefinisikan. Jika saya melewatkan mendefinisikannya, semuanya berfungsi, selain tidak memiliki 2 label khusus yang dicetak di sebelah nama aplikasi saya di UI yang dihasilkan oleh kesombongan (Satu berisi versi yang telah kami hapus, yang lain OAS3. Apa artinya?). Mengapa itu diperlukan, dan apa yang kami tandaskan dengan itu? Di dokumen yang Anda tautkan, itu didefinisikan sebagai v1. Jika tetap seperti itu, atau itu hanya contoh - kita lebih suka menyimpan versi aplikasi kita di sana. Itu bisa apa saja, seperti0.0.1a-ffg
SpiritBob
@Support Monica - SpiritBob: masuk ke objek info dari file swagger.json. Ini diperlukan karena diperlukan oleh spesifikasi. Saya tidak pernah perlu mengubahnya dari "v1". Anda dapat membaca lebih lanjut tentang itu di dokumen resmi di sini: github.com/OAI/OpenAPI-Specification/blob/master/versions/…
Lee Richardson
thansk, Anda memecahkan masalah saya
D__
3

netstandard2.1 ke 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
sumber
1
Jawaban ini akan sangat ditingkatkan JIKA Anda juga menyertakan fakta bahwa kami perlu menginstal paket NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson atau ini tidak akan berfungsi.
Frank Thomas
Saya tidak bisa menjalankan ini untuk .NET 3.1
Morten_564834