2010-09-13 5 views
10

ASP.NET lässt gleichzeitige Anfragen für dieselbe Sitzung nicht zu; Dies bedeutet, dass ein Benutzer nur eine Anfrage gleichzeitig stellen kann.Kann die gleichzeitige Verwendung von Anträgen erzwungen werden, wenn ASP.NET-Sitzungen verwendet werden?

Zum Beispiel, sagen wir haben Test1.aspx:

public partial class Test1 : System.Web.UI.Page 
    { 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Session["test"] = 1; 
     System.Threading.Thread.Sleep(int.Parse(Request.QueryString["timeout"])); 
    } 
    } 

... und Test2.aspx:

public partial class Test2 : System.Web.UI.Page 
    { 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Session["test"] = 1; 
     Label1.Text = DateTime.Now.ToString("dd/MM/yy HH:mm:ss"); 
    } 
    } 

Wenn wir Test1.aspx?timeout=10000 besuchen, und dann unmittelbar nach dem Besuch Page2.aspx, wird die zweite Anforderung müssen Warten Sie 10 Sekunden bis die erste Anfrage beendet ist.

Ich habe das gerade heute gelernt, und ich verwende ASP.NET seit 5 Jahren! Ich glaube es nicht wirklich, bis ich es am Ende einer MSDN-Seite (ASP.NET Session State Overview) gelesen habe.

Gibt es also eine Möglichkeit, die Nebenläufigkeit zu erzwingen? Dies bedeutet, dass Seiten nicht schneller erstellt werden oder lang laufender Code in einen Hintergrundthread verschoben wird. Ich bin mir bewusst, dass Sie die Sitzung nur lesen können, aber ich bin mir nicht ganz sicher, ob dies eine praktische Option ist.

+0

wow, ich habe es seit 1.0 verwendet und auch nicht wusste, dass :(Es war Ein Problem, das in keiner der Apps auftaucht, mit denen ich gearbeitet habe, aber ich frage mich, was das in einer App bewirken würde, die die Sitzung für etwas verwendet und dann eine große Download-Datei an den Browser sendet Flashback von mir Deaktivierung der Sitzung in einem Dateihandler, wie wir die Sitzung aus Prozess in der Zukunft verschieben wollten, ich frage mich, wie groß die Kopfschmerzen gewesen wäre, herauszufinden, warum der Download die App blockiert ... – eglasius

+0

Upvote seit diesem Frage war auch eine Weile im Hinterkopf.Sehr eng verwandt: Gilt diese Nebenläufigkeitsbeschränkung auch für ASMX-Webservice-Aufrufe, bei denen [WebMethod (EnableSession = true)]? – mikemanne

+0

In meinen bisherigen Tests ist es noch schlimmer als nbolton beschreibt; Selbst wenn Test2 nicht auf Session zugreifen/sie ändern würde, würde es immer noch blockieren, bis Test1 beendet wurde. Die einzige Möglichkeit, die ich umgehen kann, ist, EnableSessionState = "False" explizit als eine Page-Direktive für Test2 festzulegen. – Chris

Antwort

3

Obwohl ich gerade gelernt, diese Frage, ich würde sicherstellen, dass die Sperrung Session-Store-Daten Abschnitt in Implementing a Session-State Store Provider, für weitere Informationen über die Gründe, warum es getan.

Basierend auf den oben genannten, scheint es wirklich keine gute Idee zu sein, um diesen Mechanismus zu umgehen.

Wie Sie bereits erwähnt haben, halten Sie die Anfragen kurz und verschieben Sie lang laufenden Code aus dem Anfrage-Thread. Zusätzlich:

  • Deaktivieren Sie die Sitzung, wenn Sie es nicht benötigen. Am wichtigsten ist es, wenn Sie etwas Großes in dieser Anfrage senden.
  • vermeiden Sie unnötige Nutzung der Sitzung.

All diese Dinge sollten Sie sowieso schon machen.

+0

Wenn Sie versuchen möchten, einen benutzerdefinierten Sitzungsstatusanbieter zu implementieren, um dies zu umgehen, fand ich diesen MSDN-Artikel [Session State Providers] (http://msdn.microsoft.com/en-us) /library/aa478952.aspx) hilfreich, insbesondere die Erläuterung, wann GetItem und GetItemExclusive aufgerufen werden. – Chris

1

Soweit mir bekannt ist, ist dies nicht möglich, ohne einen eigenen Session-State-Provider zu erstellen.

(Wenn Sie SQL Server als Session-Speicher verwenden es dann könnte möglich sein, die gespeicherten Prozeduren zu hacken, damit gleichzeitig liest, aber auf jeden Fall nicht zu empfehlen.) Von der

1

Bei ASP.NET-Seiten können Sie versuchen, den EnableSessionState-Wert in der @ Page-Direktive ReadOnly zu ändern.

.NET Framework 4.5 hat ein neues HttpContext.SetSessionStateBehavior Verfahren, das verwendet werden kann, die Session Verhalten auf die gesamte Anwendung zu setzen

Verwandte Themen