"Не удалось загрузить тип Microsoft.AspNetCore.Mvc.MvcJsonOptions" из сборки Microsoft.AspNetCore.Mvc.Formatters.Json, Version=3.0.0.0
Я использую netstandard2.1
библиотека в моем netcoreapp3.0
веб приложение. При добавлении моей услуги вStartup
, Я получаю следующую ошибку:
"Не удалось загрузить тип Microsoft.AspNetCore.Mvc.MvcJsonOptions" из сборки Microsoft.AspNetCore.Mvc.Formatters.Json, Version=3.0.0.0
Я также использую некоторые функции из 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();
Пожалуйста, помогите, почему я получаю эту ошибку, и помогите, как ее решить?
4 ответа
Причина ошибки в том, что MvcJsonOptions
удален в.NET Core 3.0; вы можете узнать больше о критических изменениях здесь.
Я не уверен, решает ли это проблему OP, но эта ошибка также возникает, когда вы используете Swashbuckle 4 в.Net Core 3. Решением является использование 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
Netstandard 2.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;
});
}
Проблема, скорее всего, связана с несовместимыми пакетами nuget для.net core 3.1 выше. Взгляните на свои пакеты и в конечном итоге обновитесь до совместимой версии ядра 3.1. Это действительно должно решить проблему, которая у меня была с Automapper, а у других - со Swagger.
Если вы используете AutoMapper, вам следует перейти на 7.0.0.
Когда вы настраиваете Swashbuckle.AspNetCore, необходимый для настройки ApiKeyScheme, становится OpenApiSecurityScheme, он меняет схему с
c.AddSecurityDefinition("Bearer", new ApiKeyScheme { In = "header", Description =
"Please enter JWT with Bearer into field", Name = "Authorization", Type = "apiKey"
});
c.AddSecurityRequirement(new Dictionary<string, IEnumerable<string>> {
{ "Bearer", Enumerable.Empty<string>() }, });
Чтобы
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description =
"JWT Authorization header using the Bearer scheme. \r\n\r\n Enter 'Bearer' [space] and then your token in the text input below.\r\n\r\nExample: \"Bearer 12345abcdef\"",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
Scheme = "Bearer"
});
c.AddSecurityRequirement(new OpenApiSecurityRequirement()
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
},
Scheme = "oauth2",
Name = "Bearer",
In = ParameterLocation.Header,
},
new List<string>()
}
});
В моем случае решением было добавить
services.AddControllers()
как описано в https://github.com/RicoSuter/NSwag/issues/1961#issuecomment-515631411.