Удалить 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);
        }
    }
}
Другие вопросы по тегам