'Không thể tải loại' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'từ cụm' Microsoft.AspNetCore.Mvc.Formatters.Json, Version = 3.0.0.0


14

Tôi đang sử dụng netstandard2.1thư viện trong netcoreapp3.0ứng dụng web của mình . Khi thêm dịch vụ của tôi vào Startup, tôi gặp lỗi dưới đây:

'Không thể tải loại' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'từ cụm' Microsoft.AspNetCore.Mvc.Formatters.Json, Version = 3.0.0.0

Tôi cũng đang sử dụng một số tính năng từ Microsoft.AspNetCore.Mvcgói 2.2.0 trong thư viện lớp của mình.

Đây là thư viện của tôi .csproj,

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

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

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

</Project>

Đây là ServiceExtensionslớp học của tôi từ thư viện của tôi,

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

Đây là ConfigureLibraryOptionslớp học của tôi ,

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

Đây là ConfigureServicestừ Startup,

services.AddControllersWithViews().AddMyLibrary();

Hãy giúp đỡ về lý do tại sao tôi nhận được lỗi này và hỗ trợ về cách giải quyết vấn đề này?

Câu trả lời:


6

Lý do bạn gặp lỗi là vì MvcJsonOptionsđã bị xóa trong .NET Core 3.0; bạn có thể đọc thêm về những thay đổi đột phá ở đây .


Điều này có nghĩa là tôi không thể sử dụng netstandard2.1thư viện lớp có tham chiếu đến Microsoft.AspNetCore.Mvc2.2.0 trong netcoreapp3.0? Thay vào đó tôi nên thay đổi netstandard2.1để netcoreapp3.0và thêm một FrameworkReferenceđến Microsoft.AspNetCore.App?
ngón tay10

50

Tôi không chắc liệu điều này có giải quyết được sự cố của OP hay không, nhưng lỗi này cũng xảy ra khi bạn sử dụng Swashbuckle 4 trong .Net Core 3. Giải pháp là sử dụng Swashbuckle 5. tức là

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

Sau đó, bạn sẽ cần nâng cấp nó trong Startup.cs. Nói chung, liên quan đến các lớp tiền tố không biên dịch với, OpenApivd

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

trở thành

options.SwaggerDoc("v1", OpenApiInfo

Cũng OpenApiSecuritySchemetrở thànhApiKeyScheme

Xem thêm tài liệu tại https://github.com/domaindrivendev/Swashbuckle.AspNetCore


Thuộc tính Versioncho đối tượng OpenApiInfonói rằng nó BẮT BUỘC phải được xác định. Nếu tôi bỏ qua việc xác định nó, mọi thứ đều hoạt động, ngoài việc không có 2 nhãn đặc biệt được in bên cạnh tên ứng dụng của tôi trong giao diện người dùng được tạo bởi vênh vang (Một cái chứa phiên bản chúng tôi đã bỏ qua, cái còn lại OAS3. Ý nghĩa là gì?). Tại sao nó được yêu cầu, và chúng ta biểu thị điều gì với nó? Trong các tài liệu bạn liên kết, nó được định nghĩa là v1. Nó nên ở lại như vậy, hoặc là một ví dụ đơn thuần - chúng ta nên thay vì lưu trữ của chúng tôi phiên bản của ứng dụng đó để thay thế. Nó có thể là bất cứ thứ gì, chẳng hạn như0.0.1a-ffg
SpiritBob

@Support Monica - SpiritBob: nó đi vào đối tượng thông tin của tệp swagger.json. Nó được yêu cầu bởi vì nó được yêu cầu bởi thông số kỹ thuật. Tôi chưa bao giờ có nhu cầu thay đổi nó từ "v1". Bạn có thể đọc thêm về nó trong các tài liệu chính thức tại đây: github.com/OAI/OpenAPI-Specification/blob/master/versions/ trộm
Lee Richardson

bạn đã giải quyết vấn đề của tôi
D__

3

netst Chuẩn2.1 đến netcorzon3.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
Câu trả lời này sẽ được cải thiện rất nhiều NẾU bạn cũng bao gồm thực tế là chúng ta sẽ cần cài đặt gói NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson hoặc điều này sẽ không hoạt động.
Frank Thomas

Tôi không thể làm việc này cho .NET 3.1
Morten_564834
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.