2017-02-27 1 views
1

Hintergrund

ich auf einer RESTful API in C# /. NET geschrieben arbeite und muß zwischen der Produktionsdatenbank und Entwickler-Datenbank zum Testen neue API-Aufrufe wechseln. Die API des vorherigen Hauptentwicklers hat keinen Sinn ergeben, deshalb ersetzen wir die wichtigsten Teile davon, bevor wir die Anwendung von Grund auf neu erstellen.SqlMembershipProvider.CreateUser nicht mit invalidAnswer obwohl requiresQuestionAndAnswer = false

Das Tor

ich zum SqlMembershipProvider für den dev-Datenbank-Server schnell umschalten muß CRUD-Operationen auf Benutzerkonten zu testen.

Das Problem

Die MSDN „Dokumentation“, sagt, dass die Membership.CreateUser method calls SqlMembershipProvider.CreateUser, aber diese zugrunde liegende Methode aufrufen direkt zurück null und setzt die status Ausgabe invalidAnswer.

Konfiguration

Ich habe die Verbindungszeichenfolge und Provider-Definition konfiguriert in Web.config:

<connectionStrings> 
    <add name="ConnString" connectionString="server=prodblahblah"> 
    <add name="DevConnString" connectionString="server=devblahblah"> 

...

<membership defaultProvider="SQLDBMembershipProvider"> 
    <providers> 
     <add name="SQLDBMembershipProvider" connectionStringName="ConnString" requiresQuestionAndAnswer="false" ...> 
     <add name="DevSQLDBMembershipProvider" connectionStringName="DevConnString" requiresQuestionAndAnswer="false" ...> 

-Code

Basierend auf den Bits der Beratung I verstreut über das Internet kam ich und versuchte es die folgenden:

SqlMembershipProvider p = (SqlMembershipProvider)Membership.Providers["DevSQLDBMembershipProvider"]; 
MembershipCreateStatus status; 
string question = ""; 
string answer = ""; 
MembershipUser mu = p.CreateUser(username, password, email, question, answer, true, Guid.NewGuid(), out status); 

Ergebnis

Der Aufruf liefert null und setzt den Ausgang status Variable invalidAnswer. Das verwirrt mich, weil requiresQuestionAndAnswer in der Konfiguration auf false festgelegt ist und Membership.CreateUser 0 Werte in der aspnet_Membership-Tabelle aufruft.

Merkwürdigerweise habe ich das gleiche Ergebnis, wenn Membership.Providers["SQLDBMembershipProvider"] statt ["DevSQLDBMembershipProvider"] verwenden, so muss es ein Unterschied zwischen der Art und Weise, dass Membership.CreateUser und SqlMembershipProvider.CreateUser Griff Passwort Fragen/Antworten.

Kleiner Rant über MSDN „Dokumentation“

Das Codebeispiel für SqlMembershipProvider.CreateUser in der MSDN-Dokumentation gegeben noch nicht einmal wirklich zeigen, wie SqlMembershipProvider.CreateUser verwenden - es Membership.CreateUser stattdessen ruft und erwähnt nicht, wie die nicht zugreifen Standardanbieter, die in der Datei Web.config konfiguriert sind. Das Codebeispiel in der Dokumentation für eine Methode zeigt speziell nicht, wie diese Methode verwendet wird. Ich denke, es ist fair zu sagen, dass MSDN die erschreckend wenig hilfreiche Dokumentation hat, die ich je gesehen habe.

Frage

Warum Membership.CreateUser Arbeit mit leeren Passwort Frage/Antwort-Werte während SqlMembershipProvider.CreateUser nicht der Fall ist? Wie arbeite ich das an?

Antwort

0

Ich fand die Antwort beim Schreiben dieser Frage.Da es schwierig ist, irgendwo eine Dokumentation für dieses Material zu finden, habe ich beschlossen, die Frage zu stellen und sie mit meinen Ergebnissen zu beantworten.

Die Antwort

Es stellt sich heraus, dass "" nicht akzeptiert wird, während null ist. Eine leere Zeichenfolge ist ungültig, während eine null akzeptabel ist. Das macht natürlich für jeden Sinn. Es ist von Natur aus intuitiv, dass eine leere Zeichenfolge nicht akzeptabel ist, während eine leere Zeichenfolge akzeptabel ist. Offensichtlich.

Es ist definitiv eine gute Sache, dass Microsoft in ihrer unendlichen Weisheit entschieden hat, keine Beispiele zu zeigen, wie sie ihren Code in ihren Codebeispielen verwenden können. Sie sind schließlich Profis, und genau so funktioniert die Dokumentation.

Verwandte Themen