2011-09-29 19 views
11

Uygulamamın belirli bölümlerinin hızını kontrol etmek için MVC Mini profiler kullanıyorum ve daha sonra bir şey olması durumunda orada kalmasını istiyorum ve "neyin yanlış gittiğini" kontrol etmem gerekebilir. Tam bir günlük kümesi değil, ancak bir sayfanın ne kadar uzun sürdüğünü öğrenmek oldukça kullanışlı.Miniprofiler nasıl saklanır?

Bu nedenle, amacım gizlemek ve yalnızca isteğin belirli bir parametreyle gelmesi durumunda bu profile sahip olmaktır. Ancak, benim girişimlerimin hiçbiri beklediğim şekilde işe yaramadı.

Bu ekranda (bir görünümde kodu) o görünmeyen hile yapmış:

@if (Request.QueryString.AllKeys.Contains("showProfiler")) 
{ 
    @MvcMiniProfiler.MiniProfiler.RenderIncludes() 
} 

Bu yakınlaştı girişimdir. Mini profiler bilgisini doğru olarak gizler, ancak gösterdiğim anda, göstermeyi bıraktığımdan beri her şeyi profiller. Yani, sayfamı görüntülediğimi ve 3 saniye sürdüğünü varsayalım. Sorgu parametresini kaldırırım ve sayfayı üç kez daha yüklerim. Parametreyi tekrar ekledim ve 4 set profil bilgisi görüyorum. Bu, her şeyin kaydını tuttuğunu ve bellek sorunları verebilirse merak ettiğimi ima eder.

girişimleri artık olmayacak emin olmak için:

Denemesi 1:

protected void Application_BeginRequest() 
{ 
    if (Request.QueryString.AllKeys.Contains("showProfiler")) 
    { 
     MiniProfiler.Start(); 
    } 
} 

Denemesi 2:

protected void Application_EndRequest() 
{ 
    MiniProfiler.Stop(!Request.QueryString.AllKeys.Contains("showProfiler")); 
} 

Denemesi 3:

Bunların hiçbiri işe yaramadı. Herhangi bir fikir?

+0

girişimi 1, gayet iyi çalışmalıdır. –

cevap

12

home page Profilcinin ("a Profiler Oturum bölüm Abandoning bakınız) kullanım deseni arıyoruz etti:

protected void Application_BeginRequest() 
{ 
    MvcMiniProfiler.MiniProfiler.Start(); 
} 
protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
{ 
    if(!CurrentUserIsAllowedToSeeProfiler()) 
    { 
     MvcMiniProfiler.MiniProfiler.Stop(discardResults: true); 
    } 
} 

Sizin CurrentUserIsAllowedToSeeProfiler'un uygulanması, sorgu dizgisinin anahtarın tetikleyiciyi içerdiğini kontrol edecektir.


DÜZENLEME:

Ayrıca belli bir durumda devre dışı bırakmayı nasıl uyguladıklarını görmek için kendi Example Project bakabilirsiniz. Onların kontrolü, localhost yoluyla erişip erişmediğinizi görmek içindir, ancak bunun yerine sorgu dizesini kontrol etmek için bunu değiştirebilirsiniz.

Buna dayanarak, "# 1 girişimi" hile olmalıdır.Bir "yakın" ve "girişim # 1" arasındaki farkın, ilk olarak profiling sorgu dizgisini aradığını ve Girişim 1'inin showProfiler için denetlediğini unutmayın. Basit bir sorgu dizisi karışımı olabilir mi? Görünümde yukarıdaki örnekle birleştirilmiş

+0

Teşekkürler! Aslında, yazıyı oluştururken parametrede yazım hatası benim sorunumdu, ancak dizeler projede aynı. Cevabınız beni (daha önce kontrol etmemiş olduğum) ayarlara ve bu örnek projeye işaret etti. Bazılarını deneyeceğim ve size geri döneceğim. – Alpha

+0

Ayarlar, tam olarak söylediğiniz gibi yapacak bir şey yapmadı. Bununla birlikte, 'Application_AuthenticateRequest' uygulamasını gerçekten uygulamanıza gerek yoktur. Bir seansı izlemek istemediğim takdirde, miniprofiler ile başlayan ve durduran (ve sonuçları atamayan) aynı Application_BeginRequest yönteminin bir kısmını kullandım. Teşekkürler! – Alpha

+0

@Alpha Katılıyorum isteği üzerine AuthenticateRequest'i kullanmanın bir nedeni yok - kaynak olarak verttim çünkü kaynak olarak alıntı yapıyorum. – vcsjones

0

Başlama isteği etkinliğinizde profiler gibi normal şekilde başlamanız yeterlidir. Ardından, denetleyiciniz veya görünümünüzde, sorgu dizesini kontrol edin ve MiniProfiler.Stop(true) numaralı telefonu arayarak profilli veriyi yanlış veya yanlış olarak ayarlanmışsa atın. senin görünümünde Sonra

protected void Application_BeginRequest() 
{ 
    MiniProfiler.Start(); 
} 

:

@if(!Request.QueryString.AllKeys.Contains("profiling")) 
{ 
    MiniProfiler.Stop(true); 
} 
+0

Bu kodu, sahip olduğunuz her denetleyicinin her eylemine koyarsanız oldukça çirkin olabilir. Bu durumda, genel bir ActionFilter veya Global.asax üzerinden genel bir yaklaşım tercih edilebilir mi? –

+0

Kontrolü tekrarlamaktan kaçınmak istiyorsanız, bunu 'BeginRequest' etkinliğine ekleyebilir veya kontrol cihazınızdaki 'OnActionExecuting' komutunu geçersiz kılabilirsiniz. –

+0

Açıkça görülüyor ki ... ApplicationProfiler.Stop() görünümünde 'Application_EndRequest' yöntemini ne kadar farklı arıyordu? Eğer yoksa, ne denediğimi ve ne önerdiğin arasındaki farkı alamadım üzgünüm. – Alpha