2010-01-17 25 views
5

Có cách nào dễ dàng để lưu toàn bộ trang ASP.NET cho người dùng nặc danh (dạng xác thực được sử dụng) không?Trang bộ nhớ cache ASP.NET cho người dùng nặc danh chỉ

Bối cảnh: Tôi đang tạo trang web nơi các trang được hiển thị cho người dùng ẩn danh hầu như hoàn toàn tĩnh, nhưng các trang tương tự được hiển thị cho người dùng đã đăng nhập thì không.

Tất nhiên tôi có thể làm điều này bằng tay thông qua mã phía sau, nhưng tôi nghĩ rằng có thể có một cách tốt hơn/dễ dàng hơn/nhanh hơn.

+0

Bạn đã bao giờ nhận được giải pháp cho vấn đề này chưa? Chúng tôi có một nhu cầu tương tự mà thay đổiByCustom không phải là câu trả lời cho. –

+0

Hiện tại tôi đang sử dụng giải pháp mã-đằng sau, nơi tôi có thể dễ dàng quyết định xem tôi có muốn cache trang hay không. Nếu người dùng không đăng nhập, tôi nhớ cache. Nếu người dùng đăng nhập, bộ nhớ cache bị vô hiệu hóa cho toàn bộ trang (và chỉ lưu vào bộ nhớ cache "tĩnh"). Sau khi tôi nhận được câu trả lời dưới đây, tôi đã tìm kiếm một giải pháp không có mã sau nhưng không tìm thấy gì hữu ích. Sau khi tất cả, một giải pháp code-behind cũng rất rõ ràng và không có nhược điểm lớn hơn một ASP.NET thuần túy. –

+0

Bạn có thể chia sẻ giải pháp codebehind của mình không? Bạn kiểm soát bộ nhớ cache như thế nào? –

Trả lời

1

Bạn có thể sử dụng VaryByCustom và sử dụng khóa như username.

+0

Vấn đề với điều này là nó sẽ cache các trang được hiển thị cho người dùng đã đăng nhập. Trong trường hợp của tôi, các trang đó đã được lưu trữ một phần, trong khi một số phần không thể được lưu trữ ở tất cả (ngay cả đối với cùng một người dùng). Tất nhiên, tôi có thể đặt khóa VaryByCustom thành giá trị ngẫu nhiên nếu người dùng đăng nhập nhưng sẽ có vấn đề về hiệu suất rất lớn. –

3

Tôi đang sử dụng asp.net MVC, vì vậy tôi đã làm điều này trong điều khiển của tôi

if (User.Identity.IsAuthenticated) { 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1)); 
    Response.Cache.SetNoStore(); 
    Response.Cache.SetNoServerCaching(); 
} 
else { 
    Response.Cache.VaryByParams["id"] = true; // this is a details page 
    Response.Cache.SetVaryByCustom("username"); // see global.asax.cs GetVaryByCustomString() 
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(60)); 
    Response.Cache.SetCacheability(HttpCacheability.Server); 
    Response.Cache.SetValidUntilExpires(true); 
} 

Lý do tôi đã làm nó theo cách này (thay vì khai báo) là tôi cũng cần khả năng bật tính năng này và tắt thông qua cấu hình (không hiển thị ở đây, nhưng có một kiểm tra thêm trong nếu cho biến cấu hình của tôi).

Bạn vẫn cần thay đổi theo tên người dùng, nếu không bạn sẽ không thực thi mã này khi người dùng đăng nhập xuất hiện. Hàm GetVaryByCustomString của tôi trả về "ẩn danh" khi không được xác thực hoặc tên người dùng khi có sẵn.

+0

Cảm ơn bạn, điều này làm việc kỳ diệu đối với tôi. – Dusda

1

Có gì ngăn cản bạn từ việc mở rộng thuộc tính hiện có với các hành vi mong muốn là,

ví dụ:

public class AnonymousOutputCacheAttribute : OutputCacheAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(filterContext.HttpContext.User.Identity.IsAuthenticated) 
      return; 

     base.OnActionExecuting(filterContext); 
    } 
} 

đã không được thử nghiệm này, nhưng tôi không thấy lý do tại sao shouldn này' t làm việc.

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