2017-08-30 144 views
0

我想緩存我的web api的響應直到一個特定的時間,而不是特定的時間。爲此,我想使用某種到期頭。截至目前我用的是「Microsoft.AspNetCore.ResponseCaching」包裝的「ResponseCache中」屬性在我的操作是這樣的:ASP.NET核心Web API響應與過期緩存頭緩存

[ResponseCache(Duration = 50)]

我之所以想用過期是空氣污染指數只提供GET方法,數據是靜態的(每天刷新一次)。有沒有可能實現這樣的事情?:

[ResponseCache(Expires = 00:00AM)] 

回答

0

不幸的是與.net核心的ResponseCache屬性的當前狀態。希望將來它會得到改進。也許你可以提交一個問題在他們的回購,所以有人會知道編碼&提交拉請求?

有一個社區建立的替代方案,爲您提供所需的功能。 https://github.com/KevinDockx/HttpCacheHeadershttps://www.nuget.org/packages/Marvin.Cache.Headers

難道你不能也將持續時間設置爲60 * 60 * 24(#SecondsInADay)嗎?或者您的數據需要在一天中的某個確切時間刷新?

另一種選擇是直接修改響應上下文頭。這通常是在自定義中間件中完成的。

事情是這樣的:

app.Use(async (context, next) => 
{ 
    await next(); 

    context.Response.Headers["headerName"] = "headerValue"; 
}); 

Unforunately,它變得有點棘手。即使尚未將響應主體發送到服務器,也不能在響應主體已經寫入之後修改響應標頭。

大多數中間件通過「填充」/「包裝」響應主體的流來解決這個問題。

public class ShimmedResponseContext 
    { 
    public HttpContext _httpContext { get; } 
    private Stream _originalResponseStream { get; set; } 
    private MemoryStream _shimmedResponseStream { get; set; } 

    public ShimmedResponseContext(HttpContext httpContext) 
    { 
     _httpContext = httpContext; 
    } 

    public void ShimResponseStream() 
    { 
     _originalResponseStream = _httpContext.Response.Body; 
     _shimmedResponseStream = new MemoryStream(); 
     _httpContext.Response.Body = _shimmedResponseStream; 
    } 

    public void UnshimResponseStream() 
    { 
     _shimmedResponseStream.Position = 0; 
     _shimmedResponseStream.CopyTo(_originalResponseStream); 
     _httpContext.Response.Body = _originalResponseStream; 
    } 
    } 

    app.Use(async (context, next) => 
    { 
    var shimmedContext = new ShimmedResponseContext(context); 
    shimmedContext.ShimResponseStream(); 

    await next(); 

    context.Response.Headers[HeaderNames.CacheControl] = "public,expires=[your chosen date/time]"; 

    shimmedContext.UnshimResponseStream(); 
    }); 

此外,請確保您在app.UseMVC()之前註冊此中間件。在你的Startup.cs配置方法中,因爲中間件的運行順序爲&,只有先前註冊的中間件可以在後面的Middelware寫入它之後劫持響應。