'アセンブリ' Microsoft.AspNetCore.Mvc.Formatters.Json、Version = 3.0.0.0から型 'Microsoft.AspNetCore.Mvc.MvcJsonOptions'を読み込めませんでした


14

Webアプリケーションでnetstandard2.1ライブラリを使用してnetcoreapp3.0います。にサービスを追加すると、Startup次のエラーが発生します。

'アセンブリ' Microsoft.AspNetCore.Mvc.Formatters.Json、Version = 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でが削除されたためです。重大な変更について詳しくは、こちらをご覧ください


これはnetstandard2.1Microsoft.AspNetCore.Mvc2.2.0 を参照してクラスライブラリを使用できないことを意味しnetcoreapp3.0ますか?代わりに私はnetstandard2.1to netcoreapp3.0を変更してto を追加するFrameworkReference必要がありMicrosoft.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つの特別なラベルが印刷されないことを除いて、すべてが機能します(1つは省略したバージョンを含み、もう1つはOAS3どういう意味ですか?)。なぜそれが必要なのか、そしてそれで何を意味するのか?リンクしたドキュメントでは、として定義されていv1ます。それがそのようにとどまるか、または単なる例である場合- アプリケーションのバージョンを代わりにそこに格納する必要があります。それは、次のようなものとすることができる0.0.1a-ffg
SpiritBob

@Support Monica-SpiritBob:swagger.jsonファイルのinfoオブジェクトに入ります。仕様で要求されているため、必須です。「v1」から変更する必要がありませんでした。あなたはここに公式ドキュメントでそれについての詳細を読むことができます:github.com/OAI/OpenAPI-Specification/blob/master/versions/...
リー・リチャードソン

ありがとう、あなたは私の問題を解決しました
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をインストールする必要がある、またはこれが機能しないという事実も含めると、この回答は大幅に改善されます。
フランクトーマス

これを.NET 3.1で動作させることはできません
Morten_564834
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.