Quando si apre una connessione a SQL Server 2005 dal nostro web app, che di tanto in tanto vediamo questo errore:SQL Eccezione: "Rappresenta Sessione contesto di protezione" non può essere chiamato in questo gruppo perché un lotto simultanea ha chiamato
"Rappresenta Session Security Context "non può essere chiamato in questo batch perché è stato chiamato da un batch simultaneo.
Utilizziamo MARS e il pool di connessioni.
L'eccezione proviene dalla seguente pezzo di codice:
protected SqlConnection Open()
{
SqlConnection connection = new SqlConnection();
connection.ConnectionString = m_ConnectionString;
if (connection != null)
{
try
{
connection.Open();
if (m_ExecuteAsUserName != null)
{
string sql = Format("EXECUTE AS LOGIN = {0};", m_ExecuteAsUserName);
ExecuteCommand(connection, sql);
}
}
catch (Exception exception)
{
connection.Close();
connection = null;
}
}
return connection;
}
Ho trovato un MS Connect article che suggerisce che l'errore è causato quando un comando precedente non è ancora terminato prima EXECUTE AS LOGIN comando viene inviato. Ma come può essere questo se la connessione è stata appena aperta?
Questo potrebbe essere qualcosa a che fare con il pool di connessioni che interagiscono stranamente con MARS?
AGGIORNAMENTO: Per il breve termine abbiamo implementato una soluzione eliminando il pool di connessioni ogni volta che ciò accade, per sbarazzarsi della connessione errata, in quanto altrimenti viene sempre restituita a vari utenti. (Questo accade ora 5-10 volte al giorno con solo un piccolo numero di utenti simultanei, quindi è abbastanza fastidioso.) Ma se qualcuno ha altre idee, stiamo ancora cercando una soluzione reale ...
Grazie per la risposta. Sono d'accordo che deve avere qualcosa a che fare con MARS, ma sicuramente i set di risultati multipli sono su una base per connessione? E la mia connessione non ha precedenti set di risultati, perché l'ho appena aperta ed è "nuova" (anche se dal pool). Penso che nella tua seconda citazione dov'è scritto "lo scopo della rappresentazione è esteso al server", significa solo per la connessione corrente. – kasey
@kasey: la mia ipotesi è che la singola connessione abbia molte sessioni e che EXECUTE AS sia per sessione. Quando una connessione viene riutilizzata dal pool, suppongo che l'interruttore di contesto sia ancora impostato. hhmm. Forse è solo il pool di connessioni e l'ESEGUI AS ... Interessante domanda che hai qui :-) – gbn