2011-01-25 27 views
7

tôi có một cái nhìn cục bộ đơn giản mà tôi đang vẽ trong giao diện chính của tôi với:Asp.Net MVC 3 phần trang Output Caching Không Tôn vinh Config Cài đặt

@Html.Action("All", "Template") 

On điều khiển của tôi, tôi có điều này:

[OutputCache(CacheProfile = "Templates")] 
    public ActionResult All() 
    { 
     return Content("This stinks."); 
    } 

Và trong cấu hình của tôi này:

<caching> 
    <outputCacheSettings> 
    <outputCacheProfiles> 
     <clear/> 
     <add name="Templates" duration="3600" varyByParam="none"/>  
    </outputCacheProfiles> 
    </outputCacheSettings> 
    <outputCache enableOutputCache="false" enableFragmentCache="false" /> 
</caching> 

này sẽ thất bại khi chạy với ngoại lệ:

Lỗi thực thi yêu cầu đứa trẻ cho trình xử lý 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper

Và ngoại lệ bên trong:

Thời gian phải là một số dương

Bây giờ rõ ràng là nó không chọn cài đặt web.config của tôi, bởi vì nếu tôi thay đổi nó thành:

[OutputCache(Duration = 3600)] 

Nó sẽ làm việc, nhưng cũng thông báo trong web.config của tôi, tôi tắt enableOutputCacheenableFragmentCache, nhưng đó không tuân thủ các thiết lập này.

Thật kỳ lạ, trong chế độ xem bình thường, các cài đặt này hoạt động tốt, vì vậy điều gì về lượt xem một phần là vi phạm điều này? Tui bỏ lỡ điều gì vậy? The Gu says this should work just fine... Tóm lại, nó có phải là để tôn trọng cài đặt bộ nhớ đệm trong web.config và nếu không, tại sao không?

+0

Bản sao: http://stackoverflow.com/questions/4728958/chaching-childactions-using-cache-profiles-wont-work – frennky

+0

Chúng giống nhau, nhưng tôi nói về vấn đề lớn hơn của tôi là nó không không tôn trọng bất kỳ cài đặt nào giống như thực tế là bộ nhớ cache đầu ra bị tắt. –

Trả lời

5

Vì vậy, tôi đã dành một phút và xem nguồn MVC 3. Điều đầu tiên đến với tôi là tính năng này có vẻ hơi khó hiểu. Chủ yếu là vì họ đang sử dụng lại thuộc tính hoạt động trong một tình huống tôn trọng tất cả các thuộc tính và cài đặt cấu hình, sau đó trong kịch bản tác vụ con chỉ bỏ qua tất cả các cài đặt đó và chỉ cho phép VaryByParamThời lượng.

Làm thế nào người ta sẽ tìm hiểu về những gì được hỗ trợ vượt ra ngoài tôi. Bởi vì ngoại trừ họ muốn ném nói rằng không được hỗ trợ Cài đặt đã được sẽ không bao giờ bị ném trừ khi bạn cung cấp một thời gian và một VaryByParam giá trị

Đây là mảnh chính của mã mà mùi:

if (Duration <= 0) { 
    throw new InvalidOperationException(MvcResources.OutputCacheAttribute_InvalidDuration); 
} 

if (String.IsNullOrWhiteSpace(VaryByParam)) { 
    throw new InvalidOperationException(MvcResources.OutputCacheAttribute_InvalidVaryByParam); 
} 

if (!String.IsNullOrWhiteSpace(CacheProfile) || 
    !String.IsNullOrWhiteSpace(SqlDependency) || 
    !String.IsNullOrWhiteSpace(VaryByContentEncoding) || 
    !String.IsNullOrWhiteSpace(VaryByHeader) || 
    _locationWasSet || _noStoreWasSet) { 
    throw new InvalidOperationException(MvcResources.OutputCacheAttribute_ChildAction_UnsupportedSetting); 
} 

tôi 'không chắc chắn tại sao điều này không được gọi ra trong documentation, nhưng ngay cả khi nó là api nên làm cho nó rõ ràng, hoặc ít nhất là ném ngoại lệ đúng.

Trong ngắn, bộ đệm đầu ra một phần hoạt động, NHƯNG không giống như bạn cũng muốn nó. Tôi sẽ làm việc để sửa mã và tôn vinh một số cài đặt như đã bật.

Cập nhật: Tôi đã sửa lỗi hiện tại thành ít nhất là làm việc cho trường hợp của tôi về việc bật cờ và cho phép cấu hình bộ nhớ cache từ web.config. Detailed in my blog post.

+0

thats rất nhiều công việc! cảm ơn, có thể là một chút overkill cho những gì tôi cần. tìm kiếm thứ gì đó cơ bản –

0

Dưới đây là một cách tiếp cận đơn giản hơn nếu:

  • mục tiêu cơ bản của bạn là để có thể vô hiệu hóa bộ nhớ cache trong gỡ lỗikích hoạt nó trong việc triển khai
  • Bạn không có chính sách bộ nhớ đệm phức tạp
  • Bạn không có hệ thống triển khai phức tạp dựa trên cú pháp lưu trong bộ nhớ cache của Web.config
  • Lý tưởng nếu bạn đang sử dụng XDT web transformations đã

Tất cả những gì tôi đã tạo được tạo thuộc tính mới 'DonutCache'.

[DonutCache] 
public ActionResult HomePageBody(string viewName) 
{ 
    var model = new FG2HomeModel(); 

    return View(viewName, model); 
} 

Thật không may bạn chỉ có thể khởi tạo [Attribute] với hằng số, vì vậy bạn cần khởi tạo thuộc tính trong hàm tạo. Lưu ý: Điều này không ngăn bạn đặt 'varyByParam' trong khai báo [DonutCache].

class DonutCacheAttribute : OutputCacheAttribute 
{ 
    public DonutCacheAttribute() 
    { 
     Duration = Config.DonutCachingDuration; 
    } 
} 

Ở đây tôi chỉ khởi tạo các thuộc tính từ web.config của tôi bằng phương tiện của một thuộc tính tĩnh:

<appSettings> 
    <add key="DonutCachingDuration" value="5"/> 
</appSettings> 


public static class Config { 
    public static int DonutCachingDuration 
    { 
     get 
     { 
      return int.Parse(ConfigurationManager.AppSettings["DonutCachingDuration"]); 
     } 
    } 
} 

Sau đó, tất nhiên bạn có thể sử dụng web chuyển đổi XDT của bạn đã sử dụng để thay đổi giá trị này

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