我正在使用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不存在,但有没有办法可以做类似的事情呢?
答案 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);
}
}
}