2010-09-13 8 views
10

ASP.NET non consente richieste simultanee per la stessa sessione; il che significa che un utente può effettuare solo 1 richiesta alla volta.È possibile forzare la richiesta simultanea quando si utilizzano le sessioni ASP.NET?

Per esempio, dire che abbiamo 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"])); 
    } 
    } 

... e 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"); 
    } 
    } 

quando visitiamo Test1.aspx?timeout=10000, e poi subito dopo la visita Page2.aspx, il 2 ° richiesta dovrà attendere 10 secondi fino al termine della prima richiesta.

Ho appena saputo questo oggi, e ho usato ASP.NET per 5 anni! Non ci credevo fino a quando non l'ho letto in fondo a una pagina MSDN (ASP.NET Session State Overview).

Quindi, c'è un modo per forzare la concorrenza? Cioè, oltre a rendere le pagine più veloci, o lo spostamento di codice in esecuzione lungo a un thread in background. Sono consapevole che puoi rendere la sessione di sola lettura, ma non sono del tutto sicuro che questa sia un'opzione pratica.

+0

wow, ho usato da quando 1.0 e, inoltre, non sapeva che :(E 'stato un problema in nessuna delle app con cui ho lavorato, ma mi chiedo cosa farebbe in un'app che utilizza la sessione per qualcosa e poi procede a inviare un file di download di grandi dimensioni al browser. flashback della sessione di disabilitazione di me in un gestore di file, poiché stavamo progettando di spostare la sessione fuori processo in futuro, mi chiedo quanto sarebbe stato grande il mal di testa per scoprire perché il download bloccava l'app ... – eglasius

+0

Upvote da questo la domanda è stata per un po 'troppo nella mia mente.Molto strettamente correlato: questa restrizione di concorrenza si applica anche alle chiamate al servizio web ASMX dove [WebMethod (EnableSession = true)]? – mikemanne

+0

Nei miei test finora è ancora peggio di quanto descritto da nbolton; anche se Test2 non ha accesso/modifica Session, continuerà a bloccarsi fino al termine di Test1. L'unico modo per aggirare questo problema è impostare in modo esplicito EnableSessionState = "False" come direttiva Page su Test2. – Chris

risposta

3

Anche se ho appena imparato questo dalla domanda, assicurarmi di controllare la sezione Locking Session-Store Data in Implementing a Session-State Store Provider, per ulteriori informazioni sul perché è stata fatta.

Sulla base di quanto sopra, non sembra davvero una buona idea cercare di aggirare quel meccanismo.

Come accennato, mantenere le richieste brevi e spostare il codice di esecuzione lungo fuori dal thread di richiesta. Inoltre:

  • disabilitare la sessione se non è necessario. La cosa più importante è farlo se invii qualcosa di grande in quella richiesta.
  • evitare l'uso non necessario della sessione.

Tutti questi sono qualcosa che dovresti già fare comunque.

+0

Se si desidera provare a implementare un provider Session-State personalizzato per risolvere il problema, ho trovato questo articolo MSDN [Session State Provider] (http://msdn.microsoft.com/en-us /library/aa478952.aspx) utile, in particolare il suo chiarimento su quando vengono chiamati GetItem e GetItemExclusive. – Chris

1

Per quanto ne so, questo non è possibile senza creare il proprio provider di sessione stato.

(Se si utilizza SQL Server come file di sessione allora potrebbe essere possibile hackerare le stored procedure per permettere letture simultanee, ma sicuramente non consigliato.)

1

Per le pagine ASP.NET è possibile provare a modificare il valore EnableSessionState nella direttiva @ Page ReadOnly.

.NET Framework 4.5 ha aggiunto un nuovo metodo HttpContext.SetSessionStateBehavior che può essere utilizzato per impostare il comportamento di sessione per l'intera applicazione

Problemi correlati