'어셈블리'Microsoft.AspNetCore.Mvc.Formatters.Json, 버전 = 3.0.0.0에서 'Microsoft.AspNetCore.Mvc.MvcJsonOptions'유형을로드 할 수 없습니다.


14

웹 응용 프로그램 netstandard2.1에서 라이브러리를 사용하고 있습니다 netcoreapp3.0. 에 서비스를 추가 Startup하면 아래 오류가 발생합니다.

'어셈블리'Microsoft.AspNetCore.Mvc.Formatters.Json, 버전 = 3.0.0.0에서 'Microsoft.AspNetCore.Mvc.MvcJsonOptions'유형을로드 할 수 없습니다.

또한 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에서 제거 되었기 때문입니다 . 주요 변경 사항에 대한 자세한 내용은 여기를 참조하십시오 .


이것은 2.2.0 netstandard2.1을 참조 하는 클래스 라이브러리를 사용할 수 없다는 것을 의미 합니까? 대신에를 변경하고 에 추가 해야 합니까? Microsoft.AspNetCore.Mvcnetcoreapp3.0netstandard2.1netcoreapp3.0FrameworkReferenceMicrosoft.AspNetCore.App
fingers10

50

이것이 OP의 문제를 해결하는지 확실하지 않지만 .Net Core 3에서 Swashbuckle 4를 사용할 때도이 오류가 발생합니다. 해결책은 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정의해야 함을 나타냅니다. 정의를 건너 뛰면 swagger에 의해 생성 된 UI에서 내 응용 프로그램 이름 옆에 2 개의 특수 레이블이 인쇄되지 않은 것 이외의 모든 것이 작동합니다 (하나는 생략 한 버전이 포함되어 있습니다 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.