'Could not load type 'Microsoft.AspNetCore.Mvc.MvcJsonOptions' from assembly 'Microsoft.AspNetCore.Mvc.Formatters.Json, Version=3.0.0.0

fingers10 picture fingers10 · Oct 13, 2019 · Viewed 23.8k times · Source

I'm using netstandard2.1 library in my netcoreapp3.0 web application. When adding my service in Startup, I'm getting the below error:

'Could not load type 'Microsoft.AspNetCore.Mvc.MvcJsonOptions' from assembly 'Microsoft.AspNetCore.Mvc.Formatters.Json, Version=3.0.0.0

I'm also using some features from Microsoft.AspNetCore.Mvc 2.2.0 package in my class library.

Here is my library .csproj,

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

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

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

</Project>

Here is my ServiceExtensions class from my library,

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

Here is my ConfigureLibraryOptions class,

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

Here is the ConfigureServices from Startup,

services.AddControllersWithViews().AddMyLibrary();

Please help on why I'm getting this error and assist on how to solve this?

Answer

Lee Richardson picture Lee Richardson · Oct 23, 2019

I'm not sure if this solves OP's problem, but this error also occurs when you use Swashbuckle 4 in .Net Core 3. The solution is to use Swashbuckle 5. i.e.

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

Then you'll need to upgrade it in Startup.cs. Generally that involves prefixing classes that don't compile with OpenApi e.g.

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

becomes

options.SwaggerDoc("v1", OpenApiInfo

Also OpenApiSecurityScheme becomes ApiKeyScheme

See also docs at https://github.com/domaindrivendev/Swashbuckle.AspNetCore