'Não foi possível carregar o tipo' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'do assembly' Microsoft.AspNetCore.Mvc.Formatters.Json, Versão = 3.0.0.0

14

Estou usando a netstandard2.1biblioteca no meu netcoreapp3.0aplicativo da web. Ao adicionar meu serviço Startup, estou recebendo o erro abaixo:

'Não foi possível carregar o tipo' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'do assembly' Microsoft.AspNetCore.Mvc.Formatters.Json, Versão = 3.0.0.0

Também estou usando alguns recursos do Microsoft.AspNetCore.Mvcpacote 2.2.0 na minha biblioteca de classes.

Aqui está minha biblioteca .csproj,

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

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

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

</Project>

Aqui está minha ServiceExtensionsturma da minha biblioteca,

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

Aqui está a minha ConfigureLibraryOptionsturma,

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

Aqui está o ConfigureServicesde Startup,

services.AddControllersWithViews().AddMyLibrary();

Por favor, ajude por que estou recebendo esse erro e ajude como resolver isso?

fingers10
fonte

Respostas:

6

O motivo pelo qual você está recebendo o erro é porque MvcJsonOptionsfoi removido no .NET Core 3.0; você pode ler mais sobre as mudanças mais recentes aqui .

silkfire
fonte
Isso significa que não posso usar a netstandard2.1biblioteca de classes com referência à Microsoft.AspNetCore.Mvc2.2.0 no netcoreapp3.0? Em vez disso, devo alterar o netstandard2.1para netcoreapp3.0e adicionar um FrameworkReferencea Microsoft.AspNetCore.App?
fingers10
50

Não tenho certeza se isso resolve o problema do OP, mas esse erro também ocorre quando você usa o Swashbuckle 4 no .Net Core 3. A solução é usar o Swashbuckle 5.

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

Então você precisará atualizá-lo em Startup.cs. Geralmente, isso envolve prefixar classes que não são compiladas com, OpenApipor exemplo,

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

torna-se

options.SwaggerDoc("v1", OpenApiInfo

Também OpenApiSecuritySchemese tornaApiKeyScheme

Consulte também os documentos em https://github.com/domaindrivendev/Swashbuckle.AspNetCore

Lee Richardson
fonte
A propriedade Versionpara o objeto OpenApiInfoafirma que é NECESSÁRIO definir. Se eu pular a definição, tudo funcionará, além de não ter duas etiquetas especiais impressas ao lado do nome do meu aplicativo na interface do usuário gerada pelo swagger (uma contém a versão que omitimos e a outra OAS3. O que isso significa?). Por que é necessário e o que queremos dizer com isso? Nos documentos que você vinculou, é definido como v1. Deveria permanecer assim, ou esse é um mero exemplo - devemos armazenar a versão do nosso aplicativo lá. Pode ser qualquer coisa, como, por exemplo,0.0.1a-ffg
SpiritBob 02/12/19
@Support Monica - SpiritBob: entra no objeto de informações do arquivo swagger.json. É necessário porque é exigido pelas especificações. Eu nunca tive a necessidade de alterá-lo de "v1". Você pode ler mais sobre isso nos docs oficiais aqui: github.com/OAI/OpenAPI-Specification/blob/master/versions/...
Lee Richardson
thansk, você resolveu o meu problema
D__ 10/01
3

netstandard2.1 para 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
fonte
11
Esta resposta seria muito melhorada se você também incluir o fato de que precisaremos instalar o pacote NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson ou isso não funcionará.
Frank Thomas
Não consigo fazer isso funcionar para o .NET 3.1
Morten_564834