Ich habe einen WCF-Dienst mit einer Sicherheitsklasse zum Abrufen einiger Attribute des aufrufenden Benutzers. Allerdings bin ich ziemlich schlecht in Sachen Fadensicherheit - bis zu diesem Punkt musste ich nicht viel damit anfangen und habe nur ein rudimentäres theoretisches Verständnis der Probleme des Multithreading.Ist dieser Code threadsicher? Wie kann ich es threadsicher machen?
die folgende Funktion gegeben:
public class SecurityService
{
public static Guid GetCurrentUserID()
{
if (Thread.CurrentPrincipal is MyCustomPrincipal)
{
MyCustomIdentity identity = null;
MyCustomPrincipal principal = (MyCustomPrincipal)Thread.CurrentPrincipal;
if (principal != null)
{
identity = (MyCustomIdentity)principal.Identity;
}
if (identity != null)
{
return identity.UUID;
}
}
return Guid.Empty;
}
}
Gibt es eine Chance, dass etwas da drin schief gehen könnte, wenn das Verfahren zur gleichen Zeit von zwei verschiedenen Threads aufgerufen wird? In meinen Albträumen sehe ich schreckliche Konsequenzen, wenn diese Methoden schiefgehen, wie jemand, der versehentlich Daten von jemand anderem bekommt oder plötzlich ein Systemadministrator wird. Ein Kollege (der auch kein Experte war, aber er ist besser als ich) dachte, es wäre wahrscheinlich in Ordnung, weil dort nicht wirklich geteilte Ressourcen verfügbar sind.
Oder diese, die auf die Datenbank zugreifen - könnte das schief gehen?
public static User GetCurrentUser()
{
var uuid = GetCurrentUserID();
if (uuid != null)
{
var rUser = new UserRepository();
return rUser.GetByID(uuid);
}
return null;
}
Es gibt viele Diskussionen über die Prinzipien des threading, aber ich neige fallen und verwirren, wenn es darum geht, tatsächlich es die Anwendung, und zu wissen, wann es anzuwenden. Jede Hilfe wird geschätzt.
Ich kann mehr über den Kontext/Zweck dieser Funktionen erklären, wenn es nicht klar ist.
EDIT: Die rUser.GetByID() - Funktion ruft grundsätzlich zu einem Repository auf, das die Datenbank mit NHibernate nachschlägt. Also ich denke, die Datenbank hier ist eine "geteilte Ressource", aber nicht wirklich eine, die für diese Operation gesperrt oder geändert wird ... in diesem Fall denke ich, dass es in Ordnung ist ...?
Danke, Erics. Ich fühle mich jetzt wohler. – Gavin