【问题标题】:'Could not load type 'Microsoft.AspNetCore.Mvc.MvcJsonOptions' from assembly 'Microsoft.AspNetCore.Mvc.Formatters.Json, Version=3.0.0.0'无法从程序集'Microsoft.AspNetCore.Mvc.Formatters.Json,版本 = 3.0.0.0 加载类型'Microsoft.AspNetCore.Mvc.MvcJsonOptions'
【发布时间】:2020-02-10 06:01:09
【问题描述】:

我在netcoreapp3.0 Web 应用程序中使用netstandard2.1 库。在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());
    }
}

这是来自StartupConfigureServices

services.AddControllersWithViews().AddMyLibrary();

请帮助我了解为什么会出现此错误并帮助解决此问题?

【问题讨论】:

    标签: c# json.net asp.net-core-mvc asp.net-core-3.0 .net-standard-2.1


    【解决方案1】:

    您收到错误的原因是MvcJsonOptions 在 .NET Core 3.0 中被删除;您可以阅读更多有关重大更改的信息here

    【讨论】:

    • 这意味着我不能在netcoreapp3.0 中参考Microsoft.AspNetCore.Mvc 2.2.0 使用netstandard2.1 类库?相反,我应该将 netstandard2.1 更改为 netcoreapp3.0 并将 FrameworkReference 添加到 Microsoft.AspNetCore.App?
    【解决方案2】:

    我不确定这是否解决了 OP 的问题,但是当您在 .Net Core 3 中使用 Swashbuckle 4 时也会出现此错误。解决方案是使用 Swashbuckle 5。 (使用命令install-package Swashbuckle.AspNetCore)在.csproj中拥有

    <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 上的文档

    【讨论】:

    • 对象OpenApiInfo 的属性Version 声明它需要被定义。如果我跳过定义它,一切正常,除了在我的应用程序名称旁边没有打印 2 个特殊标签在由招摇生成的 UI 中(一个包含我们省略的版本,另一个包含 OAS3。这是什么意思? )。为什么需要它,我们用它表示什么?在您链接的文档中,它被定义为v1。它应该保持这种状态,还是仅仅是一个例子——我们宁愿将 我们的 应用程序的版本存储在那里。可以是任何东西,例如0.0.1a-ffg
    • @Support Monica - SpiritBob:它进入 swagger.json 文件的 info 对象。它是必需的,因为它是规范所要求的。我从来不需要从“v1”更改它。您可以在此处的官方文档中阅读更多相关信息:github.com/OAI/OpenAPI-Specification/blob/master/versions/…
    • 谢谢,这在我们的升级过程中帮助了我
    【解决方案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;
                });
    }
    

    【讨论】:

    • 如果您还包括我们需要安装 NuGet 包 Microsoft.AspNetCore.Mvc.NewtonsoftJson 的事实,否则此答案将大大改善,否则这将不起作用。
    【解决方案4】:

    问题很可能与上述 .net core 3.1 的不兼容 nuget 包有关。查看您的软件包并最终升级到 core 3.1 的兼容版本。这应该可以真正解决我在 Automapper 中遇到的问题以及在 Swagger 中遇到的问题。

    如果您使用 AutoMapper,您应该升级到 7.0.0

    https://medium.com/@nicky2983/how-to-using-automapper-on-asp-net-core-3-0-via-dependencyinjection-a5d25bd33e5b

    【讨论】:

      【解决方案5】:

      就我而言,解决方案是添加services.AddControllers(),如https://github.com/RicoSuter/NSwag/issues/1961#issuecomment-515631411 中所述。

      【讨论】:

        【解决方案6】:

        当您配置“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>()
            }
        });
        

        【讨论】:

          猜你喜欢
          • 2021-12-07
          • 2019-12-09
          • 1970-01-01
          • 2013-11-14
          • 2015-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多