'ไม่สามารถโหลดประเภท' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'จากชุดประกอบ' Microsoft.AspNetCore.Mvc.Formatters.Json, Version = 3.0.0.0


14

ฉันใช้netstandard2.1ห้องสมุดในnetcoreapp3.0เว็บแอปพลิเคชันของฉัน เมื่อเพิ่มบริการของStartupฉันฉันได้รับข้อผิดพลาดด้านล่าง:

'ไม่สามารถโหลดประเภท' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'จากชุดประกอบ' Microsoft.AspNetCore.Mvc.Formatters.Json, Version = 3.0.0.0

ฉันยังใช้คุณสมบัติบางอย่างจากMicrosoft.AspNetCore.Mvcแพ็คเกจ 2.2.0 ในไลบรารีคลาสของฉัน

นี่คือห้องสมุดของฉัน.csproj,

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

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

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

</Project>

นี่คือServiceExtensionsชั้นเรียนของฉันจากห้องสมุดของฉัน

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

นี่คือConfigureLibraryOptionsชั้นเรียนของฉัน

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

นี่คือConfigureServicesจากStartup,

services.AddControllersWithViews().AddMyLibrary();

โปรดช่วยทำไมฉันได้รับข้อผิดพลาดนี้และช่วยในการแก้ปัญหานี้?

คำตอบ:


6

สาเหตุที่คุณได้รับข้อผิดพลาดนั้นเกิดขึ้นเนื่องจากMvcJsonOptionsถูกลบใน. NET Core 3.0 คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการทำลายการเปลี่ยนแปลงที่นี่


หมายความว่าฉันไม่สามารถใช้netstandard2.1ไลบรารีคลาสที่อ้างอิงถึงMicrosoft.AspNetCore.Mvc2.2.0 netcoreapp3.0ใช่หรือไม่ แต่ฉันควรจะเปลี่ยนnetstandard2.1ไปnetcoreapp3.0และเพิ่มFrameworkReferenceไปMicrosoft.AspNetCore.App?
fingers10

50

ฉันไม่แน่ใจว่านี่จะแก้ปัญหาของ OP ได้หรือไม่ แต่ข้อผิดพลาดนี้เกิดขึ้นเมื่อคุณใช้ Swashbuckle 4 ใน. Net Core 3 วิธีแก้ไขคือใช้ Swashbuckle 5 เช่น

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

จากนั้นคุณจะต้องอัปเกรดเป็น Startup.cs โดยทั่วไปแล้วจะเกี่ยวข้องกับคลาสนำหน้าที่ไม่ได้รวบรวมOpenApiเช่น

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

กลายเป็น

options.SwaggerDoc("v1", OpenApiInfo

ก็OpenApiSecuritySchemeจะกลายเป็นApiKeyScheme

ดูเอกสารเพิ่มเติมได้ที่https://github.com/domaindrivendev/Swashbuckle.AspNetCore


คุณสมบัติVersionสำหรับวัตถุOpenApiInfoระบุว่ามันเป็นสิ่งจำเป็นที่จะกำหนด หากฉันข้ามการกำหนดทุกอย่างใช้งานได้นอกจากจะไม่มีป้ายกำกับพิเศษ 2 ป้ายพิมพ์ถัดจากชื่อแอปพลิเคชันของฉันใน UI ที่สร้างขึ้นโดยการคุยโม้ (หนึ่งมีรุ่นที่เราละเว้นOAS3ไป ทำไมต้องใช้และเรามีความหมายอะไรกับมัน v1ในเอกสารที่คุณเชื่อมโยงก็กำหนดให้เป็น หากเป็นเช่นนั้นหรือเป็นเพียงตัวอย่าง - เราควรเก็บรุ่นแอปพลิเคชันของเราไว้ที่นั่นแทน มันสามารถเป็นอะไรก็ได้เช่น0.0.1a-ffg
SpiritBob

@Support Monica - SpiritBob: มันเข้าไปในวัตถุข้อมูลของไฟล์ swagger.json มันจำเป็นเพราะข้อกำหนดของสเป็ค ฉันไม่เคยต้องการเปลี่ยนจาก "v1" คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในเอกสารอย่างเป็นทางการที่นี่: github.com/OAI/OpenAPI-Specification/blob/master/versions/…
Lee Richardson

ขอบคุณที่คุณแก้ไขปัญหาของฉัน
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;
            });
}

1
คำตอบนี้จะได้รับการปรับปรุงอย่างมากหากคุณรวมถึงความจริงที่ว่าเราจะต้องติดตั้งแพคเกจ NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson มิเช่นนั้นจะไม่ทำงาน
Frank Thomas

ฉันไม่สามารถใช้งานได้กับ. NET 3.1
Morten_564834
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.