2012-02-16 17 views
11

Với [OutputCacheAttribute] trong ASP.NET MVC 3, bạn có thể xuất bộ nhớ cache với một sự linh hoạt tốt. Sẽ rất hữu ích khi tận dụng thuộc tính 'VaryByHeader' để nhóm bộ nhớ đệm theo tên máy chủ lưu trữ. Ví dụ:VaryByHeader với OutputCacheAttribute trên hành động con

[OutputCache(Duration = 60, VaryByHeader = "host")] 
public ActionResult Foo() 
{ 
    return this.View(); 
} 

Tuy nhiên, đối với hành động con, bạn không thể áp dụng 'VaryByHeader'. Khung ném ngoại lệ sau đây:

OutputCacheAttribute cho những hành động con chỉ hỗ trợ Thời gian, VaryByCustom, và các giá trị VaryByParam. Vui lòng không đặt CacheProfile, Vị trí, NoStore, SqlDependency, VaryByContentEncoding hoặc giá trị VaryByHeader cho hành động con.

Câu hỏi của tôi là, tại sao?

Lý do tại sao chúng tôi không thể VaryByHeader trong một hành động con vì nó sẽ cung cấp một phương sai xung đột, vì hành động gốc có thể đã chỉ định một giá trị VaryByHeader khác?

Nếu tôi muốn lưu các hành động con theo cách khác nhau dựa trên tên máy chủ, điều này có nghĩa là gì và tôi sẽ sử dụng nó như thế nào?

+0

Chỉ cần tò mò, làm những hành động trẻ gây HTTP khác nhận được? Có lẽ các nhà thiết kế của ý nghĩ này rằng vì không có bài viết _second_ trở lại sẽ không cần phải cache bởi các tiêu đề http khác nhau. –

+0

Không, hành động của trẻ chỉ là trừu tượng trong cùng một yêu cầu. –

Trả lời

13

VaryByHeader ảnh hưởng đến tiêu đề HTTP Response thực tế; vì vậy bạn có thể chính xác rằng nhóm MVC đã chặn điều này để ngăn xung đột với hành động gốc.

Để lưu vào bộ nhớ cache dựa trên tên máy chủ, bạn không thể sử dụng VaryByCustom? Một cái gì đó tương tự (từ chối trách nhiệm: đã không cố gắng này ở tất cả):

[OutputCache(Duration = 60, VaryByCustom = "host")] 
public ActionResult Foo() 
{ 
    return View(); 
} 

tiếp theo (trong Global.asax.cs của bạn)

public override string GetVaryByCustomString(HttpContext context, string arg) 
{ 
    if (arg == "host") 
    { 
     return context.Request.Headers["host"]; 
    } 

    // whatever you have already, or just String.Empty 
    return String.Empty; 
} 
+1

Caching dựa trên tên máy chủ đã có thể chỉ bằng cách sử dụng VaryByHeader. Trong một kịch bản 2 tên máy, ví dụ, hành động con sẽ được lưu trữ hai lần, một lần cho máy chủ A, và một lần cho máy chủ B. Bạn sẽ không cần phải sử dụng VaryByCustom. (Mặc dù phương pháp của bạn sẽ thực sự làm việc quá, và có lẽ rất giống với việc thực hiện VaryByHeader). –

+1

Tất nhiên, nhưng vì bạn không thể sử dụng 'VaryByHeader' trong ChildAction của bạn ... :) – bhamlin

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