Po otwarciu połączenia z SQL Server 2005 z naszej aplikacji internetowej, od czasu do czasu zobaczyć ten błąd:SQL Wyjątek: „Personifikuj Bezpieczeństwo Session Context” nie można nazwać w tej partii, ponieważ jednoczesne partii nazwał go
„podszywać Kontekst bezpieczeństwa sesji "nie może zostać wywołany w tej partii, ponieważ wywołała go symultaniczna partia.
Używamy MARS i łączenia połączeń.
Wyjątkiem pochodzi z następującego fragmentu kodu:
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;
}
znalazłem MS Connect article co sugeruje, że błąd jest spowodowany gdy poprzednia komenda nie została jeszcze rozwiązana przed poleceniem EXECUTE AS LOGIN zostanie wysłana. Ale jak to może być, jeśli połączenie zostało dopiero co otwarte?
Czy może to mieć coś wspólnego z łączeniem puli, który oddziałuje dziwnie na MARS?
AKTUALIZACJA: Na krótką metę wdrożyliśmy obejście, usuwając pulę połączeń w dowolnym momencie, aby pozbyć się złego połączenia, ponieważ w przeciwnym razie zostanie ono przekazane różnym użytkownikom. (Dzieje się to teraz 5-10 razy dziennie z niewielką liczbą równoczesnych użytkowników, więc jest dość denerwujące.) Ale jeśli ktoś ma jakieś dalsze pomysły, wciąż szukamy prawdziwego rozwiązania ...
Dziękuję za odpowiedź. Zgadzam się, że musi to mieć coś wspólnego z MARS, ale z pewnością wiele zestawów wyników dotyczy pojedynczych połączeń. I moje połączenie nie ma żadnych poprzednich zestawów wyników, ponieważ dopiero co go otworzyłem i jest "nowe" (chociaż z puli). Myślę, że w twoim drugim cytacie, gdzie jest napisane "zakres podszywania się jest dla całego serwera", oznacza to tylko dla bieżącego połączenia. – kasey
@kasey: Domyślam się, że pojedyncze połączenie ma wiele sesji, a EXECUTE AS na sesję. Kiedy połączenie zostanie ponownie użyte z puli, domyślam się, że przełącznik kontekstu jest nadal ustawiony. hmm. Być może jest to po prostu połączenie połączeń i EXECUTE AS ... Interesujące pytanie masz tutaj :-) – gbn