【问题标题】:InvalidOperationException: Could not find 'UserSecretsIdAttribute' on assemblyInvalidOperationException:在程序集上找不到“UserSecretsIdAttribute”
【发布时间】:2017-04-03 22:31:24
【问题描述】:

将 ASP.NET Core 应用部署到 azure 并打开站点后,出现以下错误:

InvalidOperationException:找不到“UserSecretsIdAttribute” 程序集'******,版本=1.0.0.0,文化=中性, PublicKeyToken=null'。

异常详细信息还包括错误发生在 Startup.cs 这行代码:

builder.AddUserSecrets();

谢谢

【问题讨论】:

    标签: asp.net azure asp.net-core


    【解决方案1】:

    我的.NET Core 3.1Worker Service 需要额外的设置(不仅仅是一个Web 项目)。

    Program.csCreateHostBuilder 方法中我需要这个:

    .ConfigureAppConfiguration((ctx, builder) =>
                    {
                        // enable secrets in development
                        if (ctx.HostingEnvironment.IsDevelopment())
                        {
                            builder.AddUserSecrets<Worker>();
                        }
                    })
    

    但是(与我的 Web 项目不同)我明确需要添加此 nuget package

    install-package Microsoft.Extensions.Configuration.UserSecrets
    

    之后我就可以访问秘密了。

    【讨论】:

    • 谢谢@aage - 这正是我也遇到的问题。我正在使用Host.CreateDefaultBuilder(args),只需要添加Microsoft.Extensions.Configuration.UserSecrets 包,虽然它已经隐含可用......令人困惑。
    • 显然,这是由 Microsoft.Extensions.Hosting 的旧版本引起的——我有 3.1.8 版本,它在使用 dotnet new 生成项目时自动包含在内。升级到 5.0.0 版后,无需显式添加 Microsoft.Extensions.Configuration.UserSecrets 包即可正常工作。
    【解决方案2】:

    最近对用户机密模块进行了更新。 1.0.1 及更高版本现在要求您为用户机密的 id 指定程序集级属性,或者作为后备,它以前在 project.json 中的方式。

    这里是 GitHub 上的公告:https://github.com/aspnet/Announcements/issues/209

    您可以像这样在 .csproj 中定义秘密 ID:

    <PropertyGroup>
      <UserSecretsId>aspnet-TestApp-ce345b64-19cf-4972-b34f-d16f2e7976ed</UserSecretsId>
    </PropertyGroup>
    

    这会生成以下程序集级属性。或者,您当然可以自己添加,而不是将其添加到 .csproj 文件中,例如到 Startup.cs:

    [assembly: UserSecretsId("aspnet-TestApp-ce345b64-19cf-4972-b34f-d16f2e7976ed")]
    

    另外,你应该使用:

    builder.AddUserSecrets<Startup>();
    

    它将在给定类型的程序集中搜索该属性,在这种情况下,我使用了 Startup 类。

    注意:这将在 2.0 中被弃用:(1.0.2 和 1.1.1 已将其标记为过时)

    builder.AddUserSecrets();
    

    我检查了source code 的用户机密配置,并在没有类型的情况下调用AddUserSecrets() 这样做:

    var attribute = entryAssembly.GetCustomAttribute<UserSecretsIdAttribute>();
    if (attribute != null)
    {
         return AddUserSecrets(configuration, attribute.UserSecretsId);
    }
    
    // try fallback to project.json for legacy support
    try
    {
         var fileProvider = configuration.GetFileProvider();
         return AddSecretsFile(configuration, PathHelper.GetSecretsPath(fileProvider));
    }
    catch
    { }
    
    // Show the error about missing UserSecretIdAttribute instead an error about missing
    // project.json as PJ is going away.
    throw MissingAttributeException(entryAssembly);
    

    它试图在你的程序集中找到 UserSecretsId 属性,但失败了,检查它是否可以在 project.json 中找到它。然后(如评论)返回有关缺少属性的错误,因为他们不想再抱怨 project.json 已被弃用。

    【讨论】:

    • 另外,如果您在具有UserSecretsId 属性的项目中没有Microsoft.Extensions.Configuration.UserSecrets 依赖项,则不会创建该属性。
    • 如果你没有那种依赖,我认为你根本不能使用用户机密。
    • 我暂时依赖于(通过“基础”项目,我在解决方案中的许多项目之间共享样板文件)。临时使用的时候,缺少assembly属性,但是直接添加依赖,错误就消失了。
    • 这很有趣。我假设如果您手动添加该属性,它会起作用吗?
    • 是的,如果我手动添加属性,它工作正常。我猜这个依赖在构建过程中添加了一些东西,从项目文件生成属性?
    【解决方案3】:

    我想添加到这个answer,为那些我的情况。

    我正在编写一个 .NET Core 控制台应用程序,尝试使用机密管理器(不确定它是否适用于控制台应用程序)。我能够摆脱错误的唯一方法是在我使用机密管理器的程序集中使用程序集级别属性。

    正如我所说,我不确定机密管理器是否适用于控制台应用程序。因此,.xproj 文件与 .csproj 文件可能存在问题。

    【讨论】:

    • 您是否尝试将userSecretsId 添加到project.json
    • @Alex78191 我已经在 project.json 中有它,这个错误发生在我尝试迁移到多个项目之后。我正在使用 VS 代码
    • 此链接继续详细介绍如何执行此操作,它帮助我弄清楚了这一点。 twilio.com/blog/2018/05/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2010-10-19
    • 1970-01-01
    • 2012-10-13
    • 2011-09-23
    • 2019-06-06
    相关资源
    最近更新 更多