2011-09-29 24 views
11

Tôi đang sử dụng trình thu nhỏ MVC Mini để kiểm tra tốc độ của các phần cụ thể trong ứng dụng của mình và muốn giữ nó ở đó trong trường hợp có vấn đề xảy ra sau đó và tôi có thể cần kiểm tra "có gì sai". Nó không phải là một bộ đăng nhập đầy đủ, nhưng nó rất tiện dụng để biết điều gì làm cho một trang mất nhiều thời gian.Làm thế nào để ẩn miniprofiler?

Vì vậy, mục tiêu của tôi là ẩn nó và chỉ có tiểu sử khi yêu cầu đi kèm với thông số cụ thể. Tuy nhiên, không có nỗ lực nào của tôi đã hoạt động theo cách mà tôi mong đợi.

này đã làm các trick của không hiển thị nó trên màn hình (mã trong một cái nhìn):

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

Đây là nỗ lực mà đã gần hơn. Ẩn các thông tin nhỏ gọn một cách chính xác, nhưng tại thời điểm tôi hiển thị nó, nó lược tả mọi thứ kể từ khi tôi ngừng hiển thị nó. Vì vậy, chúng ta hãy nói rằng tôi hồ sơ trang của tôi và phải mất 3 giây. Tôi xóa thông số truy vấn và tải trang thêm ba lần nữa. Tôi thêm tham số của mình một lần nữa và tôi thấy 4 bộ thông tin tiểu sử. Điều đó ngụ ý rằng nó theo dõi tất cả mọi thứ và tôi tự hỏi nó nếu có thể cung cấp cho các vấn đề bộ nhớ.

nỗ lực để làm cho điều đó không xảy ra nữa:

Cố gắng 1:

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

Cố gắng 2:

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

Nỗ lực 3:

protected void Application_EndRequest() 
{ 
    MiniProfiler.Stop(true); 
} 

Không có cách nào trong số này hoạt động. Ý tưởng nào?

+0

cố gắng 1 kết hợp với mẫu của bạn ở trên trong chế độ xem, sẽ chỉ hoạt động tốt. –

Trả lời

12

Các home page (xem phần "Từ bỏ một phần Profiler Session) của các hồ sơ đã mô hình sử dụng đang tìm kiếm:

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

của bạn việc thực hiện CurrentUserIsAllowedToSeeProfiler sẽ kiểm tra xem chuỗi truy vấn có chứa khóa kích hoạt trình lược tả hay không.


EDIT:

Bạn cũng có thể nhìn vào Example Project của họ để xem cách họ thực hiện việc vô hiệu hóa nó trong tình huống nhất định. Kiểm tra của họ là để xem nếu bạn đang truy cập nó thông qua localhost, nhưng bạn có thể tất nhiên thay đổi đó để kiểm tra chuỗi truy vấn để thay thế.

Dựa trên điều đó, có vẻ như "Cố gắng # 1" phải là mẹo.Lưu ý rằng sự khác biệt giữa "gần đúng" và "lần thử # 1" trước đây là tìm kiếm chuỗi truy vấn profiling, trong khi Cố gắng số 1 của bạn đang kiểm tra showProfiler. Có thể nó chỉ là một chuỗi kết hợp truy vấn đơn giản?

+0

Xin cảm ơn! Trong thực tế, lỗi chính tả trên tham số là vấn đề của tôi khi tạo bài đăng, nhưng các chuỗi giống nhau trong dự án. Câu trả lời của bạn đã chỉ cho tôi các thiết lập (mà tôi chưa kiểm tra trước đó) và dự án mẫu đó ... Tôi sẽ thử một số trong số đó và lấy lại cho bạn. – Alpha

+0

Cài đặt không có gì để làm, chính xác như bạn đã nói, mẫu sử dụng là mẫu bạn đã trình bày. Tuy nhiên, không cần thực hiện 'Application_AuthenticateRequest'. Tôi đã sử dụng một phần của cùng phương thức 'Application_BeginRequest', bắt đầu miniprofiler và dừng (và loại bỏ kết quả) nếu tôi không muốn cấu hình một phiên. Cảm ơn! – Alpha

+0

@Alpha Tôi đồng ý, không có lý do gì để sử dụng AuthenticateRequest đối với yêu cầu bắt đầu - Tôi vừa sao chép nguyên văn từ nguồn từ khi tôi trích dẫn nó làm tài liệu tham khảo. – vcsjones

0

Chỉ cần bắt đầu trình hồ sơ như bình thường trong sự kiện yêu cầu bắt đầu của bạn. Sau đó, trong bộ điều khiển hoặc chế độ xem của bạn, hãy kiểm tra chuỗi truy vấn và gọi MiniProfiler.Stop(true) để hủy dữ liệu đã định cấu hình nếu không hoặc được đặt thành false.

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

Sau đó, theo quan điểm của bạn:

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

Điều này có thể trở nên khá xấu nếu bạn đặt mã đó trong mọi hành động của mọi bộ điều khiển mà bạn có. Trong trường hợp này, có lẽ một cách tiếp cận chung thông qua một ActionFilter toàn cầu hoặc thông qua Global.asax sẽ thích hợp hơn? –

+0

Nếu bạn muốn tránh lặp lại kiểm tra, bạn có thể đặt nó trong sự kiện 'BeginRequest', hoặc ghi đè lên' OnActionExecuting' trong bộ điều khiển của bạn. –

+0

Bên cạnh sự rõ ràng ... sự khác biệt sẽ được gọi là MiniProfiler.Stop() trên màn hình chứ không phải phương thức 'Application_EndRequest'? Nếu không, tôi đã không nhận được sự khác biệt giữa những gì tôi đã thử và những gì bạn đề nghị, xin lỗi. – Alpha

Các vấn đề liên quan