'No se pudo cargar el tipo' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'del ensamblado' Microsoft.AspNetCore.Mvc.Formatters.Json, Version = 3.0.0.0

14

Estoy usando la netstandard2.1biblioteca en mi netcoreapp3.0aplicación web. Al agregar mi servicio Startup, recibo el siguiente error:

'No se pudo cargar el tipo' Microsoft.AspNetCore.Mvc.MvcJsonOptions 'del ensamblado' Microsoft.AspNetCore.Mvc.Formatters.Json, Version = 3.0.0.0

También estoy usando algunas funciones de Microsoft.AspNetCore.Mvc paquete 2.2.0 en mi biblioteca de clases.

Aquí está mi 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>

Aquí está mi ServiceExtensionsclase de mi 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;
    }
}

Aquí está mi ConfigureLibraryOptionsclase

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

Aquí es el ConfigureServicesde Startup,

services.AddControllersWithViews().AddMyLibrary();

Por favor, ayuda sobre por qué recibo este error y cómo solucionarlo.

dedos10
fuente

Respuestas:

6

La razón por la que obtiene el error es porque MvcJsonOptionsse ha eliminado en .NET Core 3.0; Puedes leer más sobre los cambios de última hora aquí .

fuego de seda
fuente
Esto significa que no puedo usar netstandard2.1la biblioteca de clases con referencia a Microsoft.AspNetCore.Mvc2.2.0 in netcoreapp3.0? En cambio, ¿debería cambiar el netstandard2.1to netcoreapp3.0y agregar un FrameworkReferenceto Microsoft.AspNetCore.App?
dedos10
50

No estoy seguro de si esto resuelve el problema de OP, pero este error también ocurre cuando usa Swashbuckle 4 en .Net Core 3. La solución es usar Swashbuckle 5. es decir

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

Luego deberá actualizarlo en Startup.cs. En general, eso implica prefijar clases que no se compilan con, OpenApipor ejemplo,

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

se convierte

options.SwaggerDoc("v1", OpenApiInfo

También se OpenApiSecuritySchemeconvierteApiKeyScheme

Consulte también los documentos en https://github.com/domaindrivendev/Swashbuckle.AspNetCore

Lee Richardson
fuente
La propiedad Versiondel objeto OpenApiInfoindica que se REQUIERE que se defina. Si omito definirlo, todo funciona, aparte de no tener 2 etiquetas especiales impresas junto al nombre de mi aplicación en la interfaz de usuario generada por el swagger (una contiene la versión que hemos omitido, la otra OAS3. ¿Qué significa?). ¿Por qué es obligatorio y qué significamos con él? En los documentos que vinculó, se define como v1. Si se mantiene así, o es solo un ejemplo, deberíamos almacenar la versión de nuestra aplicación allí. Puede ser cualquier cosa, como0.0.1a-ffg
SpiritBob
@Support Monica - SpiritBob: entra en el objeto de información del archivo swagger.json. Se requiere porque es requerido por la especificación. Nunca he tenido la necesidad de cambiarlo de "v1". Puede leer más sobre esto en los documentos oficiales aquí: github.com/OAI/OpenAPI-Specification/blob/master/versions/…
Lee Richardson
thansk, resolviste mi problema
D__
3

netstandard2.1 a 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
fuente
1
Esta respuesta se mejoraría enormemente si también incluye el hecho de que tendremos que instalar el paquete NuGet Microsoft.AspNetCore.Mvc.NewtonsoftJson o esto no funcionará.
Frank Thomas
No puedo hacer que esto funcione para .NET 3.1
Morten_564834