Мне не повезло с этим вопросом , поэтому я создал простой тестовый пример, чтобы продемонстрировать проблему.
В приведенном ниже коде можно ли обнаружить, что соединение не работает, прежде чем пытаться его использовать?
SqlConnection c = new SqlConnection(myConnString);
c.Open(); // creates pool
setAppRole(c); // OK
c.Close(); // returns connection to pool
c = new SqlConnection(myConnString); // gets connection from pool
c.Open(); // ok... but wait for it...
// ??? How to detect KABOOM before it happens?
setAppRole(c); // KABOOM
KABOOM проявляется как ошибка в журнале событий Windows;
Соединение было разорвано, так как открывший его субъект впоследствии принял новый контекст безопасности, а затем попытался сбросить соединение в рамках своего олицетворенного контекста безопасности. Этот сценарий не поддерживается. См. «Обзор олицетворения» в электронной документации.
... плюс исключение в коде.
setAppRole - это простой метод для установки роли приложения в соединении. Это похоже на это ...
static void setAppRole(SqlConnection conn) {
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "exec sp_setapprole ";
cmd.CommandText += string.Format("@rolename='{0}'",myUser);
cmd.CommandText += string.Format(",@password='{0}'",myPassword);
cmd.ExecuteNonQuery();
}
}
В реальном коде делается попытка использовать sp_unsetapprole до закрытия соединения, но это не всегда может быть гарантировано (унаследованное глючное многопоточное приложение). В любом случае все еще кажется разумным ожидать, что он сможет обнаружить kaboom, прежде чем вызвать его.