Ich verwende den Yahoo Uploader, der Teil der Yahoo UI Library ist, auf meiner ASP.Net-Website, um Benutzern das Hochladen von Dateien zu ermöglichen. Für diejenigen, die damit nicht vertraut sind: Der Uploader arbeitet mit einem Flash-Applet, das mir mehr Kontrolle über den FileOpen-Dialog gibt. Ich kann einen Filter für Dateitypen festlegen, die Auswahl mehrerer Dateien zulassen usw. Das ist großartig, aber es hat die folgende dokumentierte Einschränkung:
Aufgrund eines bekannten Flash-Fehlers sendet der Uploader, der in Firefox unter Windows ausgeführt wird, nicht die richtigen Cookies mit dem Upload; statt der Firefox-Cookies werden die Cookies des Internet Explorers für die jeweilige Domäne gesendet. Als Abhilfe empfehlen wir, entweder eine Upload-Methode ohne Cookies zu verwenden oder die Datei document.cookie an die Upload-Anforderung anzuhängen.
Wenn also ein Benutzer Firefox verwendet, kann ich mich nicht auf Cookies verlassen, um seine Sitzung zu erhalten, wenn er eine Datei hochlädt. Ich brauche ihre Sitzung, weil ich wissen muss, wer sie sind! Als Workaround verwende ich das Application-Objekt folgendermaßen:
Guid UploadID = Guid.NewGuid();
Application.Add(Guid.ToString(), User);
Ich erstelle also eine eindeutige ID und verwende sie als Schlüssel zum Speichern der Page.User
Objekt im Anwendungsbereich. Ich füge diese ID als Variable in den POST ein, wenn die Datei hochgeladen wird. Im Handler, der den Datei-Upload akzeptiert, greife ich das User-Objekt folgendermaßen ab:
IPrincipal User = (IPrincipal)Application[Request.Form["uploadid"]];
Das funktioniert tatsächlich, hat aber zwei eklatante Nachteile:
-
Wenn IIS, der App-Pool oder sogar nur die Anwendung zwischen der Zeit der Benutzer besucht die Upload-Seite neu gestartet wird, und tatsächlich eine Datei hochlädt, wird ihre "uploadid" aus Anwendungsbereich gelöscht und der Upload schlägt fehl, weil ich sie nicht authentifizieren kann.
-
Wenn ich jemals zu einer Web-Farm (möglicherweise sogar ein Web-Garten) Szenario skalieren, wird dies vollständig brechen. Ich könnte nicht besorgt sein, außer ich auf Skalierung dieser App in der Zukunft planen.
Hat jemand eine bessere Idee? Gibt es eine Möglichkeit für mich, die tatsächliche ASP.Net-Sitzungs-ID in einer POST-Variable zu übergeben und dann diese ID am anderen Ende zu verwenden, um die Sitzung abzurufen?
Ich weiß, dass ich die Sitzungs-ID über Session.SessionID
und ich weiß, wie man YUI benutzt, um es auf der nächsten Seite zu veröffentlichen. Was ich nicht weiß, ist, wie man das benutzt SessionID
um die Sitzung vom Statusserver zu übernehmen.
Ja, ich verwende einen Statusserver, um die Sitzungen zu speichern, so dass sie Anwendung/IIS-Neustarts überdauern und in einem Webfarm-Szenario funktionieren werden.