禁用Glimpse时删除GlimpseDbConnection

时间:2013-10-17 13:33:17

标签: glimpse

我正在使用Glimpse.ADO使用以下代码将Linq配置为SQL命令:

var connection = new SqlConnection(connectionString);
var conn = new GlimpseDbConnection(connection);
context = new ApplicationDatabaseDataContext(conn, mappingSource);

上面的代码工作正常,我可以在HUD中看到SQL查询。

我想在生产中禁用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 个答案:

答案 0 :(得分:4)

老实说,我不建议检查Glimpse是否已启用(在这种情况下)。

相反,利用ADO.NET的DbProviderFactories,Glimpse可以透明地挂钩。

以下是一个例子:

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会在启用时自动使用此代码,并在禁用时自动停止使用 - 两全其美!

答案 1 :(得分:0)

即使您可以这样做,您也应该考虑到,当您的请求通过请求处理管道传输时,是否会针对特定请求启用Glimpse进行重新评估。这意味着在您进行检查时,可能会在请求开始时启用Glimpse,并且在请求结束时Glimpse会因某些策略而被禁用。

但是在配置中禁用Glimpse的情况下,它将从一开始就被禁用。一旦禁用该请求总是禁用,反之并非总是如此。

另一方面,与打开连接和执行查询所需的时间相比,性能影响可以忽略不计。

话虽如此,你总是可以采取以下hacky方法,但无法保证它将继续使用新版本。

Glimpse将当前状态存储在当前HttpContext的Items集合中,因此如果您可以暂停当前HttpContext,则可以使用以下代码进行条件检查。< / p>

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);
        }
    }
}