moin moin & hallöle ...
ich schreib grad an ner asp.net-anwendung für unsre firma ... die unseren kunden erlaubt nen versandschein von nem großen paketdienst auszudrucken ...
die anforderung usw. für den versandschein klappt wunderbar ... nun hab ich aber ein problem ... an dem ich schon ne ganze zeit rumknabber ...
man muss ja davon ausgehen ... das mehrere user zeitgleich den versandschein anfordern ... und da liegt der hase im pfeffer ...
alle bekommen die daten des users aufs auge gedrückt ... der zuerst den vorgang auslöst ...
ich versuchs mit sessions zu lösen ... aber das haut nicht hin ... mein session-timeout liegt bei ner minute ... danach sind die daten des ersten users auch weg ...
ich habs auch mit session.abandom() versucht (nachdem das versandlabel angezeigt wird und die sessiondaten in diesem moment nicht mehr benötigt werden) aber auch das löscht mir die session-daten nicht ... obwohl jeder user seine eigne session bekommt (seh ich an der url) benutzt meine anwendung irgendwie immer die selben daten (bis eben das session-timeout kommt) ...
applikation.lock() und .unlock() bringen mich auch nicht weiter ...
wie kann ich die session-daten denn wirklich per klick löschen ?
vielleicht noch zur info ... ich benutz inproc & uri zum anlegen der sessions ...
ich hab dieses problem beim IIS 5.1 & beim IIS 6 ... (wird am ende auf dem 6er laufen) ...
irgendwie bin ich im moment mehr als planlos 😮( ...
grüßle
frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)
mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb
Hallo seth!
Ich hatte das gleiche Problem, daher denke ich, ich kann Dir helfen.
Also:
Session.Abandon() markiert zunächst die Session zum Löschen, das sollte unbedingt auch in der Initialisierungsphase Deiner Seite sein.
Machst Du dann irgendwo ein Response.Redirect() oder ein Server.Transfer(), dann wird die Markierung wieder aufgehoben und .NET behält die Session. (Warum auch immer??)
Irgendwo habe ich gelesen (ich glaub es war MSDN), dass die Seite erst wieder an den Browser geschickt werden muss, damit das Abandon dann funktioniert. Ein Redirect oder Transfer verhindert das vorzeitig, und deshalb geht das nicht.
wie kann ich die session-daten denn wirklich per klick löschen ?
Also wenn ich das richtig verstehe, dann möchtest Du innerhalb eines Click-Event-Handling die SessionDaten löschen, das ist mit meinem Kenntnisstand nicht möglich (aber vielleicht nicht unmöglich? 🙂
Also Du kannst versuchsweise mal in der Init-Phase der aktuellen Website Session.Abandon() eintragen, und dann die Seite beim Browser anzeigen lassen. Der nächste Zugriff auf die Session wird dann in eine Exception laufen...
Ciao
Norman-Timo
P.S.: Du könntest einen <a href...> anstatt einem Button verwenden, der den User auf eine neue Seite verweist, die Session.Abandon in der Init Phase verwendet...
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
klappt leider noch nicht so wie ichs mir wünsch (hat sich eigendlich nix geändert) ...
wenn ich das abandom() ins page_load schreibe löscht er mir sofort nach dem klick auf meinen senden-button die eingetragnen daten ... schreib ichs in die button_click-funktion bleibt das ergebnis das selbe ...
aber ich geb nicht auf und fummel weiter ;o)
grüßle
frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)
mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb
Hallo seth!
Also ich habe das wie gesagt so gelöst, dass das Ereignis, was mir die Session-Daten löschen sollte den User auf eine neue Seite leitet, die schon in der INIT-PHASE, und nicht erst bei Page_Load die Session.Abandon Anweisung beinhaltet.
Also so:
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
this.Init += new System.EventHandler(this.InitializeDynamicComponent);
}
#region DynamicComponent
private void InitializeDynamicComponent(object sender, EventArgs e)
{
// reset session data
Session.Abandon();
}
#endregion
#endregion
Vielleicht hilft Dir das weiter?
Ansonsten kannst Du rein theoretisch auch mit
Session.Add("meineDaten", null);
Die Daten manuell löschen, dann bekommst Du aber keine neue Session-ID, sondern löschst nur entsprechende Daten...
Ciao
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
ich hab nun versucht die session-daten zu überschreiben ... hab sie auch entfernt mit session.remove("string") ... aber auch das hilft mir nicht ...
obs daran liegt ... das ich die daten in insgesamt 4 externen klassen verarbeite ?
obs was bringt wenn ich aus den klassen separate seiten baue und die daten dorthin weitergebe ?
irgendwie bin ich nun ziemlich verwirrt ... 🤔
grüßle
PS: ich teste immer lokal auf meinem rechner ... dh. ich schließe den browser (da müssten die sessiondaten doch gelöscht werden) oder ich probiers von nem anderen rechner in meinem netzwerk auf die selbe weise ...
frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)
mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb
Irgendwie liegt die Vermutung nah, dass Du das Session Objekt völlig falsch verwendest.
Jeder Browser-Instanz wird eine eigene Session zugeordnet, und deren Inhalte vermischen sich ganz bestimmt nicht auf dem Server.
Wie testest Du das ganze denn? Hast Du evtl. cookieless="true" gesetzt und kopierst laufend den Link in die Adresszeile? Wenn ja, dann teilen sich natürlich alle dieselbe Session, da sie voraussichtlich auch dieselbe IP verwenden.
Grüsse
ich test das wie gesagt lokal auf meinem notebook wo ich die anwendung programmiere und von nem anderen rechner im netzwerk ... rufe jeweils die url aus meinen favoriten auf ...
favorit -->>
http://localhost/TestANW/Default.aspx
dann bringt mich der browser dahin -->>
http://localhost/TestANW/(S(voy1l13u4bwhrmywh3pptofa))/Default.aspx (is natürlich jedes mal anders)
grüßle
frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)
mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb
hat sich erledigt ...
hab alles neu geschrieben ... die klassen "aufgelöst" ;o) ...
irgendwie lags an den klassen ... irgendwie haben die meine variablen nicht freigegeben ... jetzt ... nachdem ich den ganzen kram aus den klassen in den code eingefügt hab ... funzt das mit den session-variablen einwandfrei ...
grüßle
frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)
mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb
Hallo seth!
Auch solch ein Phänomen hatte ich gehabt, da hab ich auch immer ein komplettes Object (aus meiner selbst definierten Klasse) in das Session-Objekt eingefügt.
Um damit komfortabler arbeiten zu können, hab ich dann bei jeder Initialisierung ein lokale Variable eine Referenz auf dieses Objekt in der Session gegeben.
Problem dann: solange diese Referenz besteht, kann auch das Session Objekt nicht zerstört (gelöscht) werden.
Das habe ich dann auch erkannt, und seitdem arbeite ich ohne lokale Referenz, und spreche meine Daten in folgender Form an:
((meineKlasseMitDaten)Session["meineKlasseMitDaten"])...;
Das bedeutet mehr Tipparbeit, aber durch Copy-Paste relativiert sich das Ganze 😉
Ich denke, damit kannst Du ruhig Deine Klassen bestehen lassen, denn es bietet hier deutlich mehr Übersicht, aber wie gesagt, entweder löschst Du vorher jede lokal gehaltene Referenz, oder Du sprichst das Objekt so wie ich gezeigt hab an.
Ciao
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
Das lässt sich doch viel einfacher mit einem Property lösen.
Hallo FZelle,
wie sehen bei Dir da die Properties aus? Ich bekomme aus der Session doch ein Objekt von Typ 'object', und das muss ich doch zwangsläufig casten, oder?
Oder meinst Du innerhalb der ASP.NET Website ein Property, das so aussieht:
public MeineKlasseMitDaten GetSessionData
{
get
{
return (MeineKlasseMitDaten) Session["MeineKlasseMitDaten"];
}
set //...
}
?
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
eure vorschläge werd ich mir merken und demnächst einbauen ...
im moment funktioniert meine anwendung wie sie soll und die muss ich heut meinem chef vorstellen ;o) ... deswegen ist dafür im moment keine zeit mehr ... bin gerade noch auf "fehlerfang" ;o) ... also in der testphase ...
trotzdem danke für eure vielen vorschläge ...wie gesagt ... die werd ich bald umsetzen ;o)
grüßle
frage die um rat ... die mehr wissen als du (kleines altägyptisches sprichwort)
mobile - 1.73er core2 ... 2048 mb
desktop - 3.0er prescott ... 1024 mb