Ecco il mio ambiente: IIS7.5 su Win 7, .NET 4, App Pool integratoIE doppia postback si blocca IIS 7 in modalità pipeline gestite integrato quando la sessione si accede
web.config
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
</configuration>
Test.aspx
<%@ Page Language="C#" %>
<!DOCTYPE html>
<script runat="server">
protected void OnAction(object sender, EventArgs e)
{
int count;
status.Text = (int.TryParse(status.Text, out count) ? count + 1 : 0).ToString();
Session["test"] = count;
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>IIS Session Hang Test</title>
<script>
var mutiPostback = function() {
var e = document.getElementById('LinkButton1');
e.click();
e.click();
};
</script>
</head>
<body>
<form id="Form1" method="post" runat="server">
<asp:ScriptManager runat="server" ID="SM">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="LinkButton1"/>
</Triggers>
<ContentTemplate>
<asp:Label runat="server" ID="status" />
</ContentTemplate>
</asp:UpdatePanel>
<input type="button" id="button1" onclick="mutiPostback();" value="MultiPostback"/>
<div style="display: none">
<asp:Button ID="LinkButton1" runat="server" OnClick="OnAction" Text="Click" />
</div>
</form>
</body>
</html>
Sì, il postback multipla è intenzionale, notiamo questo comportamento causerà molti richiesta bloccato in RequestAcquireState e, in definitiva evitare eventuali nuove richieste accettate dal server. Tuttavia, questo problema è osservabile solo in IE e non su Chrome o FF.
Per testare, facendo continuamente clic sul pulsante più postback. Questo aggiornerà il numero dello stato. Sarai quindi in grado di osservare che il numero smette di aumentare quando si utilizza IE, ad indicare il problema bloccato della richiesta.
sono stato in grado di produrre questo problema con i seguenti IIS e le versioni di IE:
versioni di IIS testati
- 7.5.7600.16385 su Windows Server 2008 R2 con .Net 4.5 installata
- 7.5.7600.16385 su Windows 7 Pro con .Net 4.5 installata
versione di IE testati
- 9.0.8112.16421 su Windows 7 Pro
- 8.0.7600.16385 su Windows Server 2008 R2
- 6.0.3790.3959 su Windows Server 2003 SP2
Un'anomalia ho osservato, è che quando si accede a IIS locale , 8.0.7600.16385 su Windows Server 2008 R2 NON causa questo problema di blocco. Ma se utilizzo il browser per accedere a un IIS remoto, il problema può essere riprodotto. Mentre su IE 9 posso riprodurre il problema indipendentemente se IIS è su remoto o locale.
Ecco uno screenshot di come appare la richiesta impiccata nell'elenco delle richieste per il processo di lavoro.
ora abbiamo trovato un paio di modi per aggirare questo problema, ma nessuno sono accettabili nella nostra situazione:
- Rimuovere/Commenta fuori uso sessione.
- Modifica pool di applicazioni in modalità classica.
NOTA: abbiamo anche scoperto che anche se non utilizziamo direttamente Session come mostrato nell'esempio, il problema si verifica ancora. IE: se aggiungiamo un Global.asax.cs e aggiungiamo un gestore di eventi Session_Start vuoto, la richiesta verrà comunque bloccata in RequestAcquireState.
Qualcuno ha idea del perché questo sta accadendo e come possiamo risolvere questo problema che sembra accadere solo in modalità di pipeline gestita integrata?
Non riesco a ripeterlo su IIS7.5 su Win7 x64. L'apppool è il pool di applicazioni predefinito? Il sito web è il sito web predefinito? – rene
Questo esempio di codice che hai fornito ti consente di riprodurre il problema? Lo chiedo perché ha funzionato bene per me. Infatti, utilizzando il monitoraggio della rete negli strumenti di sviluppo di IE, viene chiaramente mostrata l'interruzione della seconda richiesta, che probabilmente non sta accadendo nel tuo caso, quindi il problema. Inoltre, non dovrebbe essere IIS 7.5 - Non penso che si possa ottenere IIS 7 per Windows 7. –
Quello che osservo nel monitoraggio della rete di strumenti di sviluppo IE, è che la prima richiesta verrà interrotta, la seconda richiesta procederà, ma non tornerà. Il problema potrebbe non apparire al primo tentativo, quindi continua a fare clic sul pulsante per osservare il problema, aggiornerò la domanda originale. – BlueFox