web-dev-qa-db-fra.com

InvalidOperationException: impossible de trouver «UserSecretsIdAttribute» sur l'assembly

Après avoir déployé l'application ASP.NET Core sur Azure et ouvert le site, j'obtiens l'erreur suivante:

InvalidOperationException: impossible de trouver "UserSecretsIdAttribute" sur l'assembly "******, version = 1.0.0.0, Culture = neutre, PublicKeyToken = null".

Les détails d'exception incluent également que l'erreur se produit sur Startup.cs sur cette ligne de code:

builder.AddUserSecrets ();

Je vous remercie

25
Techy

Il y a eu récemment une mise à jour du module des secrets d'utilisateurs. La version 1.0.1 et les versions ultérieures nécessitent désormais que vous spécifiez un attribut au niveau de l'assembly pour l'ID des secrets utilisateur, ou en tant que solution de remplacement, comme c'était le cas auparavant dans project.json.

Voici l'annonce sur GitHub: https://github.com/aspnet/Announcements/issues/209

Vous pouvez définir l'identifiant des secrets dans le .csproj comme ceci:

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

Cela génère l'attribut de niveau assembly suivant. Alternativement, au lieu de l'ajouter dans le fichier .csproj, vous pouvez bien sûr l'ajouter vous-même, par exemple à Startup.cs:

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

Vous devez également utiliser:

builder.AddUserSecrets<Startup>();

Il recherchera cet attribut dans l'assembly du type donné, dans ce cas j'ai utilisé la classe Startup.

Remarque: ce sera obsolète dans 2.0: (1.0.2 et 1.1.1 l'ont marqué obsolète)

builder.AddUserSecrets();

J'ai vérifié le code source pour la configuration des secrets d'utilisateur, et appeler AddUserSecrets() sans le type fait ceci:

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);

Il essaie de trouver l'attribut UserSecretsId sur votre assembly, et à défaut, vérifie s'il peut le trouver dans project.json. Puis (comme commenté) renvoie une erreur sur l'attribut manquant car ils ne voudraient plus se plaindre de project.json car il est obsolète.

37
juunas

Je veux ajouter à cela réponse , pour ceux dans ma situation.

J'écris une application console .NET Core, j'essaie d'utiliser le gestionnaire de secrets (je ne suis pas sûr qu'il soit destiné aux applications console). La seule façon dont je pouvais me débarrasser de l'erreur était d'utiliser l'attribut de niveau Assembly sur l'assembly où j'utilisais le gestionnaire de secrets.

Comme je l'ai dit, je ne sais pas si le gestionnaire de secrets est destiné aux applications de console. Il existe donc peut-être un problème avec les fichiers .xproj par rapport aux fichiers .csproj.

2
cskwrd