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

11 asp.net asp.net-mvc asp.net-core

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

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
Run Code Online (Sandbox Code Playgroud)

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

Muh*_*eed 27

ASP.NET Core 1.1/2.0答案

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

public void Configure(IApplicationBuilder application)
{
    application
        .UseResponseCaching()
        .UseMvc();
}
Run Code Online (Sandbox Code Playgroud)

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

ASP.NET Core 1.0答案

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

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

// Add this to your controller action.
[ResponseCache(Duration = 3600)]
Run Code Online (Sandbox Code Playgroud)

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

// 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"
        });
});
Run Code Online (Sandbox Code Playgroud)

陷阱

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

奖金评论

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


Mih*_*scu 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];
Run Code Online (Sandbox Code Playgroud)

  • 正如我们所说,它正在设计和工作:D (3认同)
  • https://github.com/aspnet/Mvc/issues/536另见本期讨论,应该是针对mvc6的RC1 (2认同)
  • 谢谢你的信息!我会在RC1中留意它. (2认同)