【问题标题】:How do I apply the OutputCache attribute on a method in a vNext project?如何在 vNext 项目中的方法上应用 OutputCache 属性?
【发布时间】:2015-02-02 22:24:39
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    更新
    正如 AndersNS 善意指出的那样,它很可能会在 RC1 中提供:https://github.com/aspnet/Mvc/issues/536

    简单地说,目前ASP.NET 5 中没有OutputCache 或等效项。

    但是,请注意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];
    

    【讨论】:

    【解决方案2】:

    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 标头控制客户端和代理缓存。

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

    // 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 问题。

    【讨论】:

    • 你确定这和OutputCache一样吗? ResponseCache 似乎会影响 HTTP 标头,但它实际上并没有在服务器端缓存任何内容
    • 如果您使用 UseResponseCaching() 中间件,它会这样做。也就是说,目前有一些限制。一个是它在看到Authorization HTTP 标头时停止缓存。 ASP.NET 文档中的更多信息。
    猜你喜欢
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    相关资源
    最近更新 更多