我使用Glimpse.ADO剖析LINQ到使用下面的代码SQL命令:
var connection = new SqlConnection(connectionString);
var conn = new GlimpseDbConnection(connection);
context = new ApplicationDatabaseDataContext(conn, mappingSource);
上面的代码工作正常,我可以看到在HUD SQL查询。
我想在生产中禁用窥所以我使用在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不存在,但有一个方法可以让我做同样的事情?
说实话,我不建议检查是否是掠影(在这种情况下)启用。
相反,利用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
}
}
启用时的一瞥将自动与此代码的工作,并自动留出禁用时的方式 - 两全其美的!
即使你能做到这一点,你应该考虑到这一瞥被启用或不针对特定的要求是什么,而你的请求通过请求处理管道旅行是被重新计算在内。 这意味着它可能瞥见在请求开始启用,而你让你检查,由于一些政策在请求掠影年底被禁用。
但设置在配置禁用掠影当你的情况,然后将它从一开始就被禁用。 一旦停用总是该请求被禁用,但反过来却不总是如此。
在另一方面对性能的影响在打开连接并执行查询所需要的时间比较可以忽略不计。
话虽这么说,你总是可以采取以下办法哈克,但没有保证,它将继续与新版本的工作。
管窥存储当前的项目集合这种现状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);
}
}
}