如何在vNext项目中的方法上应用OutputCache属性?

时间:2014-12-04 21:14:29

标签: asp.net asp.net-mvc asp.net-core

在异步方法的vNext应用程序中使用以下内容的正确方法是什么:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]

我看到它是System.Web.Caching的一部分,但我唯一能添加的地方就是aspnet50 - >我的project.json文件的frameworkAssemblies部分,这是不正确的。

2 个答案:

答案 0 :(得分:25)

ASP.NET Core 1.1 / 2.0回答

像这样添加响应缓存中间件:

public void Configure(IApplicationBuilder application)
{
    application
        .UseResponseCaching()
        .UseMvc();
}

此中间件根据您在响应中设置的缓存HTTP标头缓存内容。您可以查看答案的其余部分,了解如何使用ResponseCache

ASP.NET Core 1.0答案

请改用新的ResponseCache属性。 ResponseCache不是OutputCache的直接替代,因为它仅使用Cache-Control HTTP标头控制客户端和代理缓存。

如果您想使用服务器端缓存,请参阅this StackOverflow问题,讨论如何使用IMemoryCacheIDistributedCache

// Add this to your controller action.
[ResponseCache(Duration = 3600)]

以下是使用新缓存配置文件的示例:

// Add this to your controller action.
[ResponseCache(CacheProfile="Cache1Hour")]

// Add this in Startup.cs
services.AddMvc(options =>
{
    options.CacheProfiles.Add(
        new CacheProfile() 
        {
             Name = "Cache1Hour",
             Duration = 3600,
             VaryByHeader = "Accept"
        });
});

陷阱

响应缓存中间件在各种情况下停止工作,您可以在docs中了解更多信息。您可能遇到的两个常见问题是,如果它看到AuthorizationSet-Cookie HTTP标头,它就会停止工作。

奖金评论

在ASP.NET 4.6中,我们可以在web.config中表示缓存配置文件,并在不重新编译代码的情况下更改设置。有关如何将缓存配置文件移动到新appsettings.json的详细信息,而不是在Startup.cs中对其进行硬编码,请参阅this问题。

答案 1 :(得分:7)

<强>更新
正如AndersNS所指出的那样,它最有可能出现在RC1中:https://github.com/aspnet/Mvc/issues/536

简单来说,目前OutputCache中没有ASP.NET 5或等效内容。

但请注意,OutputCache只是一个与缓存提供程序通信的逻辑最少的属性。您可以使用attribute轻松实现自己的Memory Cache。或者您可以使用第三方解决方案。

我相信,当ASP.NET 5出货时,市场上会有很多解决方案。而且我很确定我们也会有一个正式的OutputCache等同物。

以下是基本的MemoryCache用法,以防有人发现它有用

MemoryCache cache = MemoryCache.Default;
string cacheName = "MyCache";

if (cache.Contains(cacheName) == false || cache[cacheName] == null)
{
    var data = ... get data

    cache.Set(cacheName, data, new CacheItemPolicy() { SlidingExpiration = DateTime.Now.AddDays(1).TimeOfDay });
}

return cache[cacheName];