我试图通过自己缓存视图结果对象来重新创建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();
}
这使得在缓存中检索字符串变得容易,并将其作为操作中的内容返回。我仍在寻找其他建议或更好的方法来做到这一点。
答案 0 :(得分:0)
也许有点太晚了但是让我与你分享我的经验。
虽然ASP.NET MVC是建立在ASP.NET框架之上的,但它有一些非常显着的差异,这使得在MVC中重用ASP.NET功能相当困难。你是真的:全页面输出缓存和部分页面输出缓存以完全不同的方式实现。来自Greg Roberts的另一个blog post表明MVC中的输出存在许多问题。它在WebForms中非常有用!
这就是为什么我把自己转向MvcDonutCaching(Nuget)。它解决了我们的许多问题。请阅读简介here或codeplex。
对您而言,好消息是MvcDonutCaching与AppFabric缓存完全兼容; DevTrends几个月前发布了article。这意味着您可以使用新的输出缓存提供程序(包含在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>
希望这会对你有所帮助,因为它对我们有很大的帮助!