2013-03-07 10 views
7

Jestem nowy na członkostwo w asp.net & Potrzebuję pomocy, aby programowo zmienić jego ciąg połączenia.Zmiana ciągu połączenia z członkostwem

Co próbowałem do tej pory jest

muszę utworzyć nazwę projektu klasa próbki jako nazw ** i rozciąga kod System.Web.Security.SqlMembershipProvider

jako

namespace Sample 
{ 
    public class Connectionstring : SqlMembershipProvider 
    { 
     public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) 
     { 
      string connectionString = "server=xx.xx.xx;database=db;user id=un;password=pwd";  

      // Set private property of Membership provider. 
      FieldInfo connectionStringField = GetType().BaseType 
        .GetField("_sqlConnectionString", BindingFlags.Instance | 
                 BindingFlags.NonPublic); 
      connectionStringField.SetValue(this, connectionString); 
     } 
    } 
} 

i zmienionym internetowej w pliku konfiguracyjnym znacznik członkostwa jako

<membership defaultProvider="SQLMembershipProvider"> 
    <providers> 
    <add name="SQLMembershipProvider" type="sample.Connectionstring,sample" connectionStringName="SQLMembershipConnString" applicationName="@@@@@@@" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" /> 
    </providers> 
</membership> 

i podczas gdy r unning projekt aplikacji sieciowej ciąg połączenia, który zmieniam, nie zostanie zmieniony?

czeka za cenne odpowiedzi i komentarze

+1

Z ciekawości, dlaczego musisz to zrobić? – Alyce

+0

@Alyce Moim zadaniem jest tworzenie użytkowników dla tej tabeli i uruchamianie polecenia na podstawie użytkownika wprowadzającego do bazy danych – GowthamanSS

+1

Witam spróbuj tego linku, może to być pomoc do http://forums.asp.net/t/997608.aspx/1/10 – Niventh

Odpowiedz

1

co mam również znaleźć w sieci na temat problemu jest to here:

prostszy, choć nieco rozwiązanie brwi świadomości jest tylko modyfikując ciąg połączenia w dostawców wystarczająco wcześnie wniosek za cyklu :

 private void SetProviderConnectionString(string connectionString) 
    { 
     var connectionStringField = 
     Membership.Provider.GetType().GetField("_sqlConnectionString", 
        BindingFlags.Instance | BindingFlags.NonPublic); 

     if (connectionStringField != null) 
      connectionStringField.SetValue(Membership.Provider, connectionString); 
    } 

Wywołanie tej metody z Global.asax.cs wewnątrz Application_PreRequestHandlerExecute spełnia swoje zadanie. Nie przetestowałem go zbyt wiele, ale nawet jeśli coś nie działa, oznacza to, że musi on zostać wcześniej zrobiony. Nie ma gwarancji, że to zadziała w przypadku przyszłych wersji ram, chociaż najprawdopodobniej tak będzie.

Tak więc, metoda "SetProviderConnectionString" może być wywołana ręcznie (po zakończeniu metody Initialize), zamiast oczekiwać, że framework wywoła nadpisaną metodę Initialize, gdy właściwość Membership.Provider zostanie przywołana po raz pierwszy.

1

Wygląda na to, że nie dzwonisz pod numer base.Initialize z nadpisania . Jestem zaskoczony, że wszystko działa w tym przypadku.

W .NET 4 (nie wiem o wcześniejszych wersjach), powinieneś móc dodać ciąg połączenia do kolekcji konfiguracji przed wywołaniem base.Initialize następująco:

public override void Initialize(string name, NameValueCollection config) 
{ 
    config["connectionString"] = ... whatever ...; 
    base.Initialize(name, config); 
} 

to uniknąć konieczności korzystania z refleksji uzyskać dostęp do prywatnego pola.

+0

który działa! dzięki – thepirat000

Powiązane problemy