2010-02-25 21 views
9

Ich bin ein wenig verwirrt über statische Methoden innerhalb asp.net-Seiten. Z.B. Was ist, wenn ich eine statische Datenbank-Methode erstelle, um Benutzerdaten aus der Datenbank zu holen (so etwas wie UserDBHandler.getUser()) - ist es sicher, diese Methode innerhalb von Webseiten aufzurufen? Wird für jeden Seitenaufruf ein neuer Thread erstellt? Und liefert HttpContext.Current immer den aktuellen Benutzerkontext zurück, also ist es sicher, dass von statischen Methoden aufgerufen wird, um die aktuelle Benutzersitzung abzurufen?Statische Methoden in ASP.NET

dank

Antwort

0

Im Rahmen einer einzigen Sitzung Ich glaube, dass Sie auf einem einzigen Thread ausgeführt werden sollen, so sollte dies kein Problem sein.

8

ist es sicher

Nur diese Methode von in Web-Seiten aufrufen, wenn diese Methode reentrant ist. Beispiel mit SQL:

public static User GetUser(string username) 
{ 
    using (var connection = new SqlConnection(ConnectionString)) 
    using (var command = connection.CreateCommand()) 
    { 
     connection.Open(); 
     command.CommandText = "select name, username from users where username = @username"; 
     command.Parameters.AddWithValue("@username", username); 
     using (var reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       return new User 
       { 
        Username = username, 
        Name = reader.GetString(0), 
       } 
      } 
     } 
     return null; 
    } 
} 

Und nennen Sie in Ihrer ASPX-Seite:

var user = SomeClass.GetUser(Session["username"]); 

Und hat HttpContext.Current immer den aktuellen Benutzer Kontext zurückkehren, so ist es sicher, dass anrufen aus statische Methoden, um die aktuellen Benutzer Sitzung zu bekommen?

Ja, HttpContext.Current kann sicher verwendet werden, um den aktuellen HTTP-Kontext abzurufen. Aber ich würde vorschlagen, dass Sie HttpContext.Current in Ihrer DB-Zugriffsmethode nicht aufrufen. Übergeben Sie einfach das, was als Argument benötigt wird, damit Ihre ASPX-Seite beim Aufrufen der Methode die Sitzung sicher lesen und die erforderlichen Parameter übergeben kann.

Anmerkung und persönliche Beratung: nicht verwenden statische Methoden für den Datenzugriff. Das Aufrufen von Code mit statischen Methoden ist nahezu unmöglich.

+0

Danke für Ihre Antwort! Also ist Ihre GetUser-Methode Thread-sicher? Noch eine Frage: Die Verbindung ist geschlossen, auch wenn innerhalb des using-Blocks eine Rückgabe erfolgt? –

+0

Nein, die Verbindung ist nicht geschlossen. Es wird zur Wiederverwendung an den ADO.NET-Verbindungspool zurückgegeben. –

0

Es hängt davon ab, wie die Methode geschrieben wird. Wenn die Methode threadsicher geschrieben ist, sollten Sie keine Probleme haben.

2

ist es sicher, dass die Methode von in Web-Seiten aufrufen, hängt

Das ist wirklich auf das, was man in dem Verfahren zu tun. Diese Methode sollte wahrscheinlich eine Funktion ohne Nebenwirkungen sein.

Isnt ein neuer Thread für jede erstellte Seite-call

Ja.

does HttpContext.Current always return the current-users context, so is it safe to call that from static methods to get the current-users session?? 

Ja.

Wenn Sie jedoch ein Purist sein wollen, ist es nicht ratsam, sich auf statische Methoden zu verlassen, da sie Ihren Code schwer isolieren lassen. Wenn Klasse A eine statische Methode für Klasse B aufruft, können Sie die Klasse A niemals testen, ohne auch B zu testen/aufzurufen.