2011-08-17 39 views
19

Tôi đã tạo ứng dụng MVC3, ứng dụng có rất nhiều trang, vì vấn đề bảo mật tôi cần thêm thiết lập không có bộ nhớ cache trong tiêu đề http, bất kỳ cách nào dễ dàng hơn để làm điều đó? nếu chúng ta có thể sửa đổi một nơi thì nó sẽ làm việc cho toàn bộ ứng dụng, nó sẽ hoàn hảo.Làm cách nào để thêm tiêu đề không có bộ nhớ cache trên trang web vào ứng dụng MVC 3

Các bạn có thể giúp tôi không?

+0

Tôi đã chỉnh sửa câu trả lời của tôi để gõ 'Response.Cache.SetCacheability()' phương pháp thay vì cài đặt tiêu đề bằng tay. Thử nghiệm trong Fiddler và làm việc như mong đợi. – Marko

Trả lời

29

Làm thế nào về cách thiết lập các Headers bên trong sự kiện Application_PreSendRequestHeaders trong Global.asax?

EDIT Bạn có thể sử dụng Response.Cache.SetCacheability hơn là thiết lập các tiêu đề trực tiếp. *

void Application_PreSendRequestHeaders(Object sender, EventArgs e) 
{ 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
} 

Tested trong Fiddler.


cách Alternative bằng cách thiết lập Headers bằng tay.

void Application_PreSendRequestHeaders(Object sender, EventArgs e) { 
    Response.Headers.Set("Cache-Control", "no-cache"); 
} 
+11

Đó là CÁCH quá nhiều không có bộ nhớ đệm! Nếu bạn làm điều đó bạn sẽ không có bộ nhớ cache tất cả javascript, css, biểu tượng, vv và làm khá một số về băng thông của bạn và đáp ứng. –

+0

@ScottStafford đọc yêu cầu OP "nếu chúng ta có thể sửa đổi một địa điểm thì nó sẽ hoạt động cho toàn bộ ứng dụng, nó sẽ hoàn hảo." Rõ ràng, một số tệp có thể được lọc nhưng đó không phải là những gì được yêu cầu. – Marko

+3

Tôi biết anh ấy đã nói. Tôi đã không -1 hoặc bất cứ điều gì, nhưng tôi muốn chắc chắn rằng anh ta (và bất kỳ độc giả khác) biết những gì các nhánh là một cách tiếp cận nặng tay như vậy. Ném trong một thử nghiệm cho "đây là một tập tin aspx" và nó được áp dụng rộng rãi hơn nhiều. –

1

tôi sẽ làm điều đó trong IIS tự (giả sử bạn đang sử dụng đó), hoặc web.config:

<configuration> 
    <system.webServer> 
     <staticContent> 
     <clientCache cacheControlMode="DisableCache" /> 
     </staticContent> 
    </system.webServer> 
</configuration> 

Ít mã là mã tốt hơn.

Thiết lập hơi khác nhau dựa trên phiên bản IIS.

Xem here để biết thêm thông tin.

+0

Cấu hình đó chỉ áp dụng cho nội dung tĩnh (img, js, css, v.v.) hay là tên chỉ gây hiểu nhầm một chút? Nó không hoàn toàn rõ ràng từ trang web IIS. –

+0

@Troy - i * nghĩ * đó là tất cả. Khá dễ dàng để kiểm tra, chỉ cần kiểm tra các tiêu đề phản hồi trong fiddler/firebug/etc – RPM1984

+2

Kiểm soát bộ nhớ cache từ ứng dụng có vẻ phù hợp hơn với tôi, bởi vì tôi mong đợi hầu hết mọi người sẽ muốn lưu vào bộ nhớ đệm của nội dung tĩnh. Ngoài ra, tôi sẽ không nói rằng giải pháp của bạn đòi hỏi ít mã :-). – theDmi

1

Tôi khuyên bạn nên thực hiện các cuộc gọi này đến các yêu cầu không được GET, để tránh mất lợi ích của bộ nhớ cache trên GET. Sau đây đảm bảo rằng ngay cả các trình duyệt bộ nhớ đệm tích cực như iOS 6 Safari sẽ không lưu trữ bất cứ thứ gì không phải là yêu cầu GET.

Tôi sử dụng lớp cơ sở Bộ điều khiển mà tất cả các bộ điều khiển của tôi kế thừa từ một số lý do, và điều này được phục vụ tốt trong đó Ghi đè khởi tạo của tôi có thể xử lý cài đặt tiêu đề bộ nhớ đệm của tôi theo điều kiện.

public class SmartController : Controller 
{ 
    ... 
    public HttpContextBase Context { get; set; } 

    protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     Context = requestContext.HttpContext; 

     if (Context.Request.RequestType != "GET") 
     { 
      Context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     } 

     base.Initialize(requestContext); 
     ... 
    } 
... 
} 
+0

Đặt chính sách bộ nhớ cache dựa trên động từ HTTP sẽ không đủ cho nhiều ứng dụng khác nhau. Giả sử bạn có trang nơi bạn sử dụng GET và chuỗi truy vấn để tải dữ liệu bệnh nhân của bệnh viện? Bạn không muốn trang đó được lưu trong bộ nhớ cache. –

+0

Larry, trong trường hợp đó bạn chắc chắn sẽ không muốn thực hiện logic điều khiển cơ sở như tôi đã đề xuất ở đây. :) –

13

Alternative cho những người muốn phương pháp/hành động hoặc lớp/điều khiển rộng no-cache

[OutputCache(Location = OutputCacheLocation.None)] 
public class HomeController : Controller 
{ 
... 
} 

Như đã giải thích ở đây:

OutputCacheLocation Enumeration

None: Các output cache bị vô hiệu hóa cho trang được yêu cầu. Giá trị này tương ứng với giá trị liệt kê HttpCacheability.NoCache.

HttpCacheability Enumeration

nocache - Thiết lập Cache-Control: no-cache ....

+0

Bộ nhớ cache đầu ra ASP.NET không giống như tiêu đề HTTP không có bộ nhớ cache, mà OP đang hỏi về. –

+0

@MikeMarynowski có nhưng bạn có chắc chắn không? Tôi tin rằng Không có nghĩa là không phải máy chủ cũng như máy khách và tạo tiêu đề "Cache-Control: no-cache" cho máy khách – KCD

+0

["None: \t Bộ nhớ cache đầu ra bị vô hiệu hóa cho trang được yêu cầu. Giá trị này tương ứng với giá trị liệt kê HttpCacheability.NoCache . "] (http://msdn.microsoft.com/en-us/library/system.web.ui.outputcachelocation (v = vs.100) .aspx) ... [" NoCache - Đặt Cache-Control: tiêu đề no-cache .... "] (http://msdn.microsoft.com/en-us/library/system.web.httpcacheability (v = vs.100) .aspx) – KCD

2

Thiết lập bộ lọc chung.

public class MvcApplication : System.Web.HttpApplication 
{ 

    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new NoCacheGlobalActionFilter()); 
    }  
} 

public class NoCacheGlobalActionFilter : ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache; 
     cache.SetCacheability(HttpCacheability.NoCache); 

     base.OnResultExecuted(filterContext); 
    } 
} 

http://dotnet.dzone.com/articles/output-caching-aspnet-mvc

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