Удалить GlimpseDbConnection, когда Glimpse отключен
Я использую Glimpse.ADO для профилирования команд Linq to SQL, используя следующий код:
var connection = new SqlConnection(connectionString);
var conn = new GlimpseDbConnection(connection);
context = new ApplicationDatabaseDataContext(conn, mappingSource);
Приведенный выше код работает нормально, и я вижу запросы SQL в HUD.
Я хотел бы отключить Glimpse в производственной среде, поэтому я использую следующий код в файле web.config
<glimpse defaultRuntimePolicy="Off">
Однако я хотел бы удалить GlimpseDbConnection, чтобы предотвратить любое ненужное влияние на производительность при мониторинге каждого запроса. В идеале я мог бы сделать что-то вроде:
if (Glimpse.Enabled)
{
var connection = new SqlConnection(connectionString);
var conn = new GlimpseDbConnection(connection);
context = new ApplicationDatabaseDataContext(conn, mappingSource);
}
else
{
context = new ApplicationDatabaseDataContext(connectionString, mappingSource);
}
Очевидно, Glimpse.Enabled не существует, но есть ли способ сделать что-то подобное?
2 ответа
Честно говоря, я бы не советовал проверять, включен ли Glimpse (в этой ситуации).
Вместо этого используйте ADO.NET DbProviderFactories
, который мельком может зацепить прозрачно.
Вот пример:
var connectionString = ConfigurationManager.ConnectionStrings["YourConnectionString"];
var factory = DbProviderFactories.GetFactory(connectionString.ProviderName);
using (DbCommand cmd = factory.CreateCommand())
{
// work with cmd
using (DbConnection con = factory.CreateConnection())
{
// work with con
}
}
Glimpse будет автоматически работать с этим кодом, когда он включен, и автоматически отключаться при отключении - лучшее из обоих миров!
Даже если вы могли бы сделать это, вы должны принять во внимание, что Glimpse, включенный или не включенный для определенного запроса, является чем-то, что переоценивается, пока ваш запрос проходит через конвейер обработки запросов. Это означает, что возможно, что Glimpse включен в начале запроса, пока вы выполняете свои проверки, и что в конце запроса Glimpse отключается из-за какой-то политики.
Но в вашем случае, когда настройка Glimpse отключена в конфиге, то она будет отключена с самого начала. После отключения всегда отключается для этого запроса, обратное не всегда верно.
С другой стороны, влияние на производительность незначительно по сравнению со временем, необходимым для открытия соединения и выполнения запроса.
При этом вы всегда можете воспользоваться следующим хакерским подходом, но нет никаких гарантий, что он продолжит работу с новым выпуском.
Glimpse сохраняет это текущее состояние в коллекции Items текущего HttpContext
так что, если вы можете ухватиться за текущий HttpContext
Затем вы можете использовать следующий код для проверки вашего условия.
public static class CurrentGlimpseStatus
{
private const string GlimpseCurrentRuntimePolicyKey = "__GlimpseRequestRuntimePermissions";
public static bool IsEnabled
{
get
{
RuntimePolicy currentRuntimePolicy = RuntimePolicy.Off;
if (System.Web.HttpContext.Current.Items.Contains(GlimpseCurrentRuntimePolicyKey))
{
currentRuntimePolicy = (RuntimePolicy)System.Web.HttpContext.Current.Items[GlimpseCurrentRuntimePolicyKey];
}
return !currentRuntimePolicy.HasFlag(RuntimePolicy.Off);
}
}
}