5

我试图通过自己缓存视图结果对象来重新创建 MVC 4 中 OutputCache 操作过滤器的大部分功能。我不想使用 OutputCache 操作过滤器的原因是因为我不能将它与 AppFabric 和部分视图一起使用;部分视图始终存储在 MemoryCache 中,我希望在服务器场中使用缓存的对象。

我遇到的第一个问题是

{"Type 'System.Web.Mvc.TempDataDictionary' cannot be serialized. 
Consider marking it with the DataContractAttribute attribute, and marking all of 
its members you want serialized with the DataMemberAttribute attribute.  
If the type is a collection, consider marking it with the 
CollectionDataContractAttribute.  See the Microsoft .NET Framework documentation for  
other supported types."}

这让我想知道我是否应该缓存其他东西以返回本质上是最后的视图。有没有人知道我应该缓存什么来重新创建视图或在服务器场上缓存部分视图的不同方法?我不想为此使用第三方插件。

谢谢

更新:我开始像这样缓存部分视图的字符串表示:

using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, "ViewName");
            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
            view = sw.GetStringBuilder().ToString();
        }

这使得在缓存中检索字符串并将其作为操作中的内容返回变得很容易。我仍在寻找其他建议或更好的方法来做到这一点。

4

1 回答 1

0

也许有点晚了,但让我和你分享我的经验。

虽然 ASP.NET MVC 构建在 ASP.NET 框架之上,但它有一些非常显着的差异,这使得在 MVC 中重用 ASP.NET 功能相当困难。你说得对:全页面输出缓存和部分页面输出缓存以完全不同的方式实现。Greg Roberts 的另一篇博客文章表明 MVC 中的输出存在许多问题。它在 WebForms 中非常有用!

这就是我转向 MvcDonutCaching ( Nuget ) 的原因。它解决了我们的许多问题。请阅读此处codeplex上的介绍。

对您来说好消息是 MvcDonutCaching 也与 AppFabric Caching 完全兼容;DevTrends几个月前发表了一篇文章。这意味着您可以使用新的输出缓存提供程序(包含在 AppFabric 1.1 中)。

添加这个新提供者非常简单,就像以这种方式添加引用和更改配置一样。

<caching>
  <outputCache defaultProvider="DistributedCache">
    <providers>
      <add name="DistributedCache"
           type="Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider, Microsoft.Web.DistributedCache"
           cacheName="default"
           dataCacheClientName="default" />
    </providers>
  </outputCache>
</caching>

希望这会对您有所帮助,因为它对我们有很大帮助!

于 2013-04-17T11:41:39.443 回答