From 0c07e1e725e8bf20b2dc840f7e02945d19913661 Mon Sep 17 00:00:00 2001 From: Javier Calvarro Nelson Date: Mon, 10 Jul 2017 17:54:46 -0700 Subject: [PATCH] [Fixes #6522] Commit cache entries only when the content gets successfully generated --- .../CacheTagHelper.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNetCore.Mvc.TagHelpers/CacheTagHelper.cs b/src/Microsoft.AspNetCore.Mvc.TagHelpers/CacheTagHelper.cs index 7984e1fc19..e42bb67883 100644 --- a/src/Microsoft.AspNetCore.Mvc.TagHelpers/CacheTagHelper.cs +++ b/src/Microsoft.AspNetCore.Mvc.TagHelpers/CacheTagHelper.cs @@ -119,8 +119,8 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers // Use the CreateEntry to ensure a cache scope is created that will copy expiration tokens from // cache entries created from the GetChildContentAsync call to the current entry. IHtmlContent content; - using (var entry = MemoryCache.CreateEntry(cacheKey)) - { + var entry = MemoryCache.CreateEntry(cacheKey); + // The result is processed inside an entry // such that the tokens are inherited. @@ -130,9 +130,12 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers entry.SetOptions(options); entry.Value = result; - } tcs.SetResult(content); + // An entry gets committed to the cache when disposed gets called. We only want to do this when + // the content has been correctly generated (didn't throw an exception). For that reason the entry + // can't be put inside a using block. + entry.Dispose(); return content; } catch (Exception ex)