2013-10-17 46 views
1

我使用Glimpse.ADO剖析LINQ到SQL命令,使用下面的代碼:刪除GlimpseDbConnection管窺時禁用

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不存在,但有一個方法可以讓我做同樣的事情?

回答

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

掠影會自動加上此代碼工作,並會自動閃開時禁用 - 兩全其美的!

+0

謝謝,這似乎是完美的工作。 –

+5

使用這種方法,我發現即使使用,調試過程中'con'的類型仍然是Glimpse.Ado.AlternateType.GlimpseDbConnection。在這種情況下,它不應該是所需的提供者(例如System.Data.SqlClient.SqlConnection)嗎? – maartendekker

0

即使您可以這樣做,您應該考慮到對於特定請求啓用或未啓用Glimpse是在請求通過請求處理管道傳輸時得到重新評估的內容。這意味着您可能在請求開始時啓用Glimpse,而您進行檢查,並且在請求結束時Glimpse因某些策略而被禁用。

但在你的情況下,當在配置中禁用Glimpse時,它將從一開始就被禁用。一旦禁用總是禁用該請求,反過來並不總是如此。

另一方面,與打開連接和執行查詢所需的時間相比,性能影響可以忽略不計。這就是說,你總是可以採取以下hacky方法,但是不能保證它會繼續使用新版本。

Glimpse將當前狀態存儲在當前的HttpContext的Items集合中,所以如果您可以獲得當前的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); 
     } 
    } 
}