2010-09-21 2 views
3

Je crée une classe SqlMembershipProvider personnalisée pour ajouter des fonctionnalités améliorées à la classe de base. Cependant, je me fais prendre par la manipulation de la chaîne de connexion. Comment puis-je lire le nom de la chaîne de connexion de la configuration et la rendre disponible pour le reste des méthodes?Personnalisé ASP.NET SqlMembershipProvider - gestion de la chaîne de connexion

En ce moment, j'ai:

public override void Initialize(string name, NameValueCollection config) 
     { 
      base.Initialize(name, config); 

      _ConnectionStringName = config["connectionStringName"]; 
     } 

Mais dans d'autres méthodes, la variable _ConnectionStringName est nulle:

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[_ConnectionStringName].ConnectionString) 

Quelle est la bonne façon de stocker la connexion Nom chaîne de sorte qu'il est disponible dans le monde dans mon fournisseur d'adhésion personnalisé?

Merci!

Répondre

2

ProviderBaseConfigurationException si une entrée est laissée dans la collection de config au moment où elle l'est, chaque fournisseur supprime ses entrées de configuration avant d'appeler base.Initialize.

Le problème, comme vous l'avez constaté à la suite de this answer, est que vous devez obtenir vos valeurs avant d'appeler base.Initialize. Désolé, j'ai manqué cela au premier coup d'oeil.


Le reste de ce post est historique et tout misses techniquement corriger le problème ici comme saillant énumérés ci-dessus.

Tout d'abord, essayez WebConfigurationManager.ConnectionStrings.

WebConfigurationManager gère la hiérarchie de web.config depuis votre Windows \ microsoft.net \ framework \ 2.0xxxx \ web.config jusqu'à votre application.

Ce comportement n'est pas présent dans ConfigurationManager, qui traite généralement de machine.config à app.config.


Si cela ne résout pas votre problème, vous devez être écrasez la valeur ailleurs dans votre code, si bien _ConnectionStringName est correctement attribué à Initialize.

D'abord, définissez un point d'arrêt et assurez-vous que _ConnectionStringName est défini comme prévu.

Ensuite, localisez toutes les références au champ et assurez-vous que vous n'avez pas de bogue.

Ceci suppose, bien sûr, que _ConnectionStringName est un champ privé. Si ce n'est pas le cas, faites-le ainsi et recherchez votre erreur de compilation.

+0

Je suis conscient de la façon de récupérer la chaîne de connexion de web.config. Ma question spécifique concerne la récupération de l'attribut Connection String Name de Initialize et sa mise à disposition pour le reste de mes méthodes. J'ai mis le point d'arrêt et _ConnectionStringName est réglé correctement, mais il est nul au moment où je l'appelle dans une autre méthode. –

+0

@mike - alors vous faites référence à un membre différent ou le membre est en train d'être remplacé. Avec les informations données, il n'y a pas d'autres explications possibles. –

+0

Je vais vérifier plus en profondeur. J'étais aussi très confus et je pensais qu'il y avait un getcha quelque part que je ne connaissais pas. –

2

Je ne sais pas si cela aide, mais j'avais un problème similaire en ayant besoin de remplacer la chaîne de connexion dans une sous-classe de SqlMembershipProvider.

Cette idée est pas mon propre - je l'ai trouvé dans la section commentaires de ce forum d'affichage: http://forums.asp.net/p/997608/2209437.aspx

public override void Initialize(string name, NameValueCollection config) 
{ 
    base.Initialize(name, config);<br> 
    string connectionString = //...what you want your connection string to be, 
           //so config["connectionStringName"]... 
    // Set private property of Membership provider. 
    System.Reflection.FieldInfo connectionStringField = 
     GetType().BaseType.GetField("_sqlConnectionString", 
     System.Reflection.BindingFlags.Instance 
     | System.Reflection.BindingFlags.NonPublic); 

    connectionStringField.SetValue(this, connectionString); 
} 

Mes excuses - je ne l'ai jamais posté ici avant, donc la mise en forme peut-être sous par!

+0

Merci pour le commentaire. Cependant, je ne pense pas que le code affiché fonctionnera. Il semble que la méthode base.Initialize efface les valeurs de configuration. C'est le problème original que j'avais. –

1

Ceci est probablement 6 mois trop tard pour aider, mais je suis en mesure d'obtenir la chaîne de connexion de cette façon:

using System.Web.Configuration; 

Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 
MembershipSection section = config.SectionGroups["system.web"].Sections["membership"] as MembershipSection; 
string defaultProvider = section.DefaultProvider; 
string connstringName = section.Providers[defaultProvider].ElementInformation.Properties["connectionStringName"].Value.ToString(); 
string val = config.ConnectionStrings.ConnectionStrings[connstringName].ConnectionString; 

Cela fait l'hypothèse que le fournisseur par défaut possède une propriété de chaîne de connexion - mais si vous 're sous-classe SqlMembershipProvider alors devrait toujours avoir un, quelque part dans la chaîne web.config (il est défini dans la machine.config je crois). Pour ajouter une méthode à change the username.

Questions connexes