ASP.NET Developer Center > ASP.NET Foren > ASP.NET > Gibt es in .NET keine Sessions mehr?

Vorgeschlagene Antwort Gibt es in .NET keine Sessions mehr?

  • Dienstag, 24. April 2012 13:35
     
     

    Hallo an Alle,

    ich bin bei meinem (erst dritten) BV.NET-Projekt auf ein vollkommen unverständliches Problem gestoßen:

    Hier eine kurze Einleitung:
    Ich habe für unseren Verein einen Terminplaner geschrieben. Der ist seit einem halben Jahr ungefähr im Netz und läuft auch ganz zufriedenstellend. Gestern erklärte mir einer unserer Läute, dass er gerade einen (neuen) Termin eingegeben hat, und nach dem Speichern als ein anderer angemeldet war!?!?! Deshalb konnte er seine Eintragungen nicht mehr vornehmen und hat sich darauf hin neu angemeldet, und gesehen, dass der andere inzwischen seine Eintragungen aktualisiert hat.
    Ich habe das gleich noch mal ausprobiert und siehe da:
    Wenn zwei Leute gleichzeitig (nacheinander) den Terminplaner aufrufen, ist der, der zuerst da war, als der zweite angemeldet.
    Noch ein Bisschen Hintergrund:
    Mann muss sich mit Name / Passwort anmelden. Alle Mitglieder sind in einer Datenbank / Tabelle erfasst. Bei der Anmeldung bekommt man seine ID. Und an Hand dieser ID sieht man das, was man sehen will / soll. Diese ID wird bei Links mit angehängt bzw. in den Objekten (Button …) mitgenommen. Nun ist es aber offenbar so, dass nur die letzte gewählte ID für alle aktuellen Nutzer gültig ist.
    Früher (klassisches .asp) hat das Session-Objekt die einzelnen Nutzer voneinander „getrennt“. Gibt es das gar nicht mehr, und wie kann (muss) ich verhindern, dass der Eine die Termine vom Anderen sieht?

    Wegen der (nun nicht mehr gewährleisteten Sicherheit) und des mir völlig unverständlichen Fehlers benötige ich dringend Hilfe, und hoffe, dass mir jemand (recht bald) einen guten Tipp geben kann.

    Danke und bis bald

                Uwe

Alle Antworten

  • Dienstag, 24. April 2012 15:54
    Moderator
     
     

    Hallo Uwe,

    ich gehe mal davon aus, dass es um ASP.NET geht. Richtig? Falls ja, dürftest Du in eine "kleine" Falle (mit ziemlich großen Auswirkungen) getappt sein.

    Verwendest Du Module bzw. Shared Properties? Falls ja, auch für Datenbankverbindungen, ...? Falls auch hier ja: Das geht nicht und muss zwingend geändert werden. Du brauchst für jeden Request neue Instanzen deiner Objekte. Man kann problemlos bestimmte Sachen als statische Eigenschaften, ... ablegen aber dann muss man auch wissen, was für Auswirkungen das hat. Connection, Command, ... gehören aber definitiv nicht in Module und/oder Shared Properties.

    ---

    Wo wird denn die von dir gemeinte ID gespeichert? In der Session ist das nicht, denn die ist pro User/Sitzung getrennt. Wenn Du die in eine Shared Property steckst, hast Du den o.g. Effekt, das musst Du dann ändern.

    Wenn Du ein wenig relevanten Code zeigst, kann man sicher besser helfen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


  • Mittwoch, 25. April 2012 07:35
     
      Enthält Code

    Hallo Stefan,

    danke für die schnelle Antwort.
    1) Ja, es geht um ASP.NET (hatte ich vergessen hin zu schreiben)
    2) Ich verwende keine Module und keine Shared Properties.

    So sind die DB-Verbindungen deklariert:

    Imports ...

    Partial Public Class _Default Inherits System.Web.UI.Page Private iMa As Integer = 0 Public sCon As String Dim oConn As OdbcConnection ' Connection-Object ... Dim cmdWer As New OdbcCommand() Dim rdWer As OdbcDataReader

    So werden sie benutzt (in „Page“):

      sCon = "H:\Projekte\Server\Tepla.mdb"
      oConn = New OdbcConnection("Driver={Microsoft Access Driver (*.mdb)};Dbq=" & sCon & ";")
      oConn.Open()																												 '  ... anlegen
      cmdWer.Connection = oConn
      Start()
      cmdWer.Dispose()
    

    Da ich bei einem „PostBack“ die ID nicht mit übergeben kann (oder doch?), wird sie in einer Funktion (mittels „Static-Variable“) gespeichert:

      Shared Function Mitarbeiter(ByVal iMa As Integer) As Integer
        Static Ma As Integer = 0
        If iMa > 0 Then Ma = iMa
        Return Ma
      End Function

    In „Start()“ wird sie abhängig von „IsPostBack“ (beim ersten Mal) in „Anmeldung()“ ermittelt und gespeichert bzw. (bei allen anderen Malen) wieder ausgelesen:

        If Not IsPostBack Then
          Anmeldung()
          Mitarbeiter(iMa)
        Else
          iMa = Mitarbeiter(0)
        End If

    Ich sehe gerade, dass die Funktion „Mitarbeiter()" „Shared" ist (sonst funktioniert aber die „Static-Variable" nicht und die Funktion gibt „0" zurück). Ich denke das ist die Fehlerursache.

    Wo (oder wie) kann ich die ID denn „richtig“ unterbringen?
    Die Session-Variablen - Session(„iMa“) – aus dem .ASP gibt es ja nicht mehr?

    Beste Grüße

                Uwe

  • Mittwoch, 25. April 2012 08:39
     
     Vorgeschlagene Antwort

    Hallo,

    ich antworte mir jetzt nicht selbst...

    Ich habe aber gerade die Funktion "Mitarbeiter()" durch ein statisches (also zur Entwurfszeit definiertes) Label "lblMa" (visible=false) ersetzt. Damit ist die Sache erst Mal wieder sicher (so geht es, die Benutzer und Ihre ID's sind von einander getrennt). Das ist ja nicht gerade elegent, deshalb würde mich gern interressieren, wie man es "richtig" macht.

    Grüße

         Uwe