InvalidOperationException:无法在程序集中找到“UserSecretsIdAttribute”

时间:2016-11-20 13:47:40

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

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

  

InvalidOperationException:找不到'UserSecretsIdAttribute'   汇编'******,版本= 1.0.0.0,文化=中立,   公钥=空”。

异常细节还包括在此行代码的Startup.cs上发生错误:

  

builder.AddUserSecrets();

谢谢

3 个答案:

答案 0 :(得分:36)

最近有一个用户机密模块的更新。版本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,因为它已被弃用。

答案 1 :(得分:2)

我希望在我的情况下为这些answer添加。

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

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

答案 2 :(得分:0)

我的.NET Core 3.* 工作者服务需要在 Web 项目上进行其他设置。

Program.cs方法的CreateHostBuilder中,我需要这样做:

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

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

install-package Microsoft.Extensions.Configuration.UserSecrets

之后,我可以访问这些机密了。