Не удалось найти ‘UserSecretsIdAttribute’ в сборке, но он существует и добавлен правильный пакет

#asp.net-core #secretsmanager

#asp.net-core #secretsmanager

Вопрос:

Я следую этому руководству: https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-3.1amp;tabs=windows#access-a-secret

В проект .NET Core 3.1 я добавил Microsoft.Extensions.Configuration.UserSecrets пакет, я нажал на проект, чтобы управлять секретами, файл был создан в AppData каталоге, и UserSecretsId он был автоматически добавлен в .csproj файл. Поскольку Host.CreateDefaultBuilder секреты не загружались, я решил добавить их вручную

  if (hostContext.HostingEnvironment.IsDevelopment())
        {
            builder.AddUserSecrets(Assembly.GetExecutingAssembly());
        }
    })
  .Build();
  

Но затем я получаю

 System.InvalidOperationException
  HResult=0x80131509
  Message=Could not find 'UserSecretsIdAttribute' on assembly 'XXX'.
Check that the project for 'XXX' has set the 'UserSecretsId' build property.
If the 'UserSecretsId' property is already set then add a reference to the Microsoft.Extensions.Configuration.UserSecrets package.
  Source=Microsoft.Extensions.Configuration.UserSecrets
  

Я проверил предложение в описании expecion, и оба затруднения выполнены.

Ответ №1:

Здесь та же проблема. после проверки исходного кода в GitHub https://github.com/aspnet/Configuration/blob/f64994e0655659faefccead7ccb5c1edbfd4d4ba/src/Config .UserSecrets/ UserSecretsConfigurationExtensions.cs #L94

Проверьте, есть ли у вас <GenerateAssemblyInfo>true</GenerateAssemblyInfo> в вашем файле .csproj.

Комментарии:

1. Я использовал общую сборку, поэтому мне нужно добавить этот параметр вручную в код (время выполнения) и на уровне проекта (время компиляции для VS).

2. атрибут var = сборка. GetCustomAttribute<UserSecretsIdAttribute>(); не сможет получить UserSecretsId в .csproj, если для GenerateAssemblyInfo установлено значение false. попробуйте отладить этот код

3. @Mike. Вы можете добавить его в startup class или SharedAssemblyInfo.cs [assembly: UserSecretsId("XXXguidXXX")]

4. @Yoda Добавление его в SharedAssemblyInfo.cs сделало свое дело, еще раз спасибо!

5. @Yoda — У меня была такая же проблема, и я исправил ее таким же образом. Мне потребовалось несколько часов, чтобы найти этот ответ. Большое спасибо за решение!

Ответ №2:

Столкнулся с той же ошибкой во время выполнения. Я отключил автоматическое создание AssemblyInfo сборки for в csproj , потому что мой системный CI автоматически обновляет этот файл версией сборки

Мое исправление заключается в добавлении

 [assembly: UserSecretsId ("<Project guid>")] 
  

в AssemblyInfo .

Комментарии:

1. У меня была такая же проблема. В начале AssemblyInfo был сгенерирован автоматически, поэтому все работало нормально. Затем внезапно мне нужно установить для <GenerateAssemblyInfo> значение false, и все рухнуло по частям. Мне потребовалось несколько часов, чтобы выяснить это. Кто знает, что изменение информации о сборке может нарушить секреты. json да?

2. Это решение также работало для меня в проекте .NET Framework 4.8

Ответ №3:

У вас должен быть UserSecretsId, указанный в вашем файле .csproj. Если вы щелкните правой кнопкой мыши на уровне API и управляйте пользовательскими секретами, подтвердите, что идентификатор GUID совпадает в каталоге AppData с тем, что есть в проекте.

 <PropertyGroup>
<UserSecretsId>Your GUID</UserSecretsId>
  

Ваш класс Program.cs должен использовать CreateDefaultBuilder, вы должны увидеть, что есть раздел для включения секретов при разработке среды. Убедитесь, что ваш ASP "ASPNETCORE_ENVIRONMENT": "Development" настроен на разработку. Наконец, я предполагаю, что ваша исполняемая сборка имеет группу свойств для пользовательских секретов, упомянутых выше.

  public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
  

Комментарии:

1. Все, что вы предоставили, уже сделано. Однако у меня есть файл SharedAssemblyInfo.cs в свойствах проекта, и если я добавлю туда идентификатор, он будет загружен во время выполнения, однако VS также нуждается в нем в csproj, чтобы знать о файле secrets. Это странно.

Ответ №4:

Просто используйте контекстное меню в своем проекте и выберите «Управление пользовательскими секретами …» и сохраните пустой файл конфигурации пользовательских секретов. Visual Studio должна автоматически создавать необходимые записи файла проекта.

Комментарии:

1. Я собирался сделать именно это, но по какой-то причине Visual Studio не удалось включить эту опцию в контекстное меню. Он также был скрыт из меню проекта. В этот момент я начал искать в интернете и оказался здесь.

Ответ №5:

Система.Исключение InvalidOperationException: «Не удалось найти ‘UserSecretsIdAttribute’ в сборке «. Убедитесь, что в проекте для » установлено свойство сборки ‘UserSecretsId’. Если свойство ‘UserSecretsId’ уже установлено, добавьте ссылку на Microsoft.Расширения.Конфигурация.UserSecrets package.’

Добавление этого пакета решило проблему. Майкрософт.Расширения.Конфигурация.UserSecrets