1

我正在使用 Glimpse.ADO 使用以下代码分析 Linq to 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 不存在,但有没有办法我可以做类似的事情?

4

2 回答 2

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

于 2013-10-22T20:10:44.573 回答
0

即使您可以这样做,您也应该考虑到是否为特定请求启用或不启用 Glimpse 是在您的请求通过请求处理管道时重新评估的东西。这意味着 Glimpse 可能在请求开始时启用,同时您进行检查,并且在请求结束时 Glimpse 由于某些策略而被禁用。

但是在您的情况下,当在配置中禁用 Glimpse 时,它​​将从一开始就被禁用。一旦为该请求禁用总是禁用,相反的情况并不总是如此。

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

话虽如此,您始终可以采用以下 hacky 方法,但不能保证它会继续使用新版本。

Glimpse 将此当前状态存储在 current 的 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);
        }
    }
}
于 2013-10-17T17:42:05.843 回答