How to pull a ViewComponent outside a response cached controller's action in ASP.NET Core
For performance purpose, i need to put the homepage action into the cache and display the name of the logged-in user in the homepage's header.
I used to implement the devtrends/DonutOutputCache on classic ASP.NET project. This system was very useful, because you were able to put a whole action in OutputCache while pulling partial view results outside the cache.
I could have 3 or 4 partials who needed personalization (A survey, an analytic tag, the user name and avatar, a behavior based article list...).
Do you know if I could handle this with ASP.NET CORE's new OutputCacheAttribute or CacheTagHelpers ?
At the moment, I put the whole HomePage datas into classic memory cache.
It would be fantastic to have this kind of TagHelper :
<cache expires-after="TimeSpan.FromMinutes(60)">
@*Cached part*@
<cache-hole>
@*Refreshed on each page refresh. This could work with a ResponseCache attribute too.*@
@await Components.InvokeAsync("UserProfile")
</cache-hole>
</cache>
razor asp.net-core outputcache asp.net-core-viewcomponent responsecache
add a comment |
For performance purpose, i need to put the homepage action into the cache and display the name of the logged-in user in the homepage's header.
I used to implement the devtrends/DonutOutputCache on classic ASP.NET project. This system was very useful, because you were able to put a whole action in OutputCache while pulling partial view results outside the cache.
I could have 3 or 4 partials who needed personalization (A survey, an analytic tag, the user name and avatar, a behavior based article list...).
Do you know if I could handle this with ASP.NET CORE's new OutputCacheAttribute or CacheTagHelpers ?
At the moment, I put the whole HomePage datas into classic memory cache.
It would be fantastic to have this kind of TagHelper :
<cache expires-after="TimeSpan.FromMinutes(60)">
@*Cached part*@
<cache-hole>
@*Refreshed on each page refresh. This could work with a ResponseCache attribute too.*@
@await Components.InvokeAsync("UserProfile")
</cache-hole>
</cache>
razor asp.net-core outputcache asp.net-core-viewcomponent responsecache
See if this helps: docs.microsoft.com/en-us/aspnet/core/performance/caching/…
– Neal
Nov 21 '18 at 13:23
add a comment |
For performance purpose, i need to put the homepage action into the cache and display the name of the logged-in user in the homepage's header.
I used to implement the devtrends/DonutOutputCache on classic ASP.NET project. This system was very useful, because you were able to put a whole action in OutputCache while pulling partial view results outside the cache.
I could have 3 or 4 partials who needed personalization (A survey, an analytic tag, the user name and avatar, a behavior based article list...).
Do you know if I could handle this with ASP.NET CORE's new OutputCacheAttribute or CacheTagHelpers ?
At the moment, I put the whole HomePage datas into classic memory cache.
It would be fantastic to have this kind of TagHelper :
<cache expires-after="TimeSpan.FromMinutes(60)">
@*Cached part*@
<cache-hole>
@*Refreshed on each page refresh. This could work with a ResponseCache attribute too.*@
@await Components.InvokeAsync("UserProfile")
</cache-hole>
</cache>
razor asp.net-core outputcache asp.net-core-viewcomponent responsecache
For performance purpose, i need to put the homepage action into the cache and display the name of the logged-in user in the homepage's header.
I used to implement the devtrends/DonutOutputCache on classic ASP.NET project. This system was very useful, because you were able to put a whole action in OutputCache while pulling partial view results outside the cache.
I could have 3 or 4 partials who needed personalization (A survey, an analytic tag, the user name and avatar, a behavior based article list...).
Do you know if I could handle this with ASP.NET CORE's new OutputCacheAttribute or CacheTagHelpers ?
At the moment, I put the whole HomePage datas into classic memory cache.
It would be fantastic to have this kind of TagHelper :
<cache expires-after="TimeSpan.FromMinutes(60)">
@*Cached part*@
<cache-hole>
@*Refreshed on each page refresh. This could work with a ResponseCache attribute too.*@
@await Components.InvokeAsync("UserProfile")
</cache-hole>
</cache>
razor asp.net-core outputcache asp.net-core-viewcomponent responsecache
razor asp.net-core outputcache asp.net-core-viewcomponent responsecache
asked Nov 21 '18 at 13:16
BidasseBidasse
33
33
See if this helps: docs.microsoft.com/en-us/aspnet/core/performance/caching/…
– Neal
Nov 21 '18 at 13:23
add a comment |
See if this helps: docs.microsoft.com/en-us/aspnet/core/performance/caching/…
– Neal
Nov 21 '18 at 13:23
See if this helps: docs.microsoft.com/en-us/aspnet/core/performance/caching/…
– Neal
Nov 21 '18 at 13:23
See if this helps: docs.microsoft.com/en-us/aspnet/core/performance/caching/…
– Neal
Nov 21 '18 at 13:23
add a comment |
1 Answer
1
active
oldest
votes
I'm not sure about what you were using previously, but I don't think it was actually doing what you think. The whole point of an output cache is bypassing the view rendering process, as such, whatever you cache is just returned as-is, not further processed to determine if something inside needs to be rendered.
If you cache your entire page, then you cannot have any part inside that needs to vary per user. You'll simply need to reduce the scope of what you're caching. Cache the parts of the page that don't vary, and that will at least give the main page a leg up in rendering. This is what the cache
tag helper is for. You can also cache just for a particular user with this tag helper:
<cache vary-by-user="true">
<!-- user-specific stuff -->
</cache>
This will still render multiple times, but only once per user. After it has been cached for a particular user, then the cache will be used.
Thank you, you're probably right, I should split my homepage controller into multiple cachable ViewComponents. The user specific's content would be outside the cache tags.
– Bidasse
Nov 22 '18 at 15:38
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53412902%2fhow-to-pull-a-viewcomponent-outside-a-response-cached-controllers-action-in-asp%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I'm not sure about what you were using previously, but I don't think it was actually doing what you think. The whole point of an output cache is bypassing the view rendering process, as such, whatever you cache is just returned as-is, not further processed to determine if something inside needs to be rendered.
If you cache your entire page, then you cannot have any part inside that needs to vary per user. You'll simply need to reduce the scope of what you're caching. Cache the parts of the page that don't vary, and that will at least give the main page a leg up in rendering. This is what the cache
tag helper is for. You can also cache just for a particular user with this tag helper:
<cache vary-by-user="true">
<!-- user-specific stuff -->
</cache>
This will still render multiple times, but only once per user. After it has been cached for a particular user, then the cache will be used.
Thank you, you're probably right, I should split my homepage controller into multiple cachable ViewComponents. The user specific's content would be outside the cache tags.
– Bidasse
Nov 22 '18 at 15:38
add a comment |
I'm not sure about what you were using previously, but I don't think it was actually doing what you think. The whole point of an output cache is bypassing the view rendering process, as such, whatever you cache is just returned as-is, not further processed to determine if something inside needs to be rendered.
If you cache your entire page, then you cannot have any part inside that needs to vary per user. You'll simply need to reduce the scope of what you're caching. Cache the parts of the page that don't vary, and that will at least give the main page a leg up in rendering. This is what the cache
tag helper is for. You can also cache just for a particular user with this tag helper:
<cache vary-by-user="true">
<!-- user-specific stuff -->
</cache>
This will still render multiple times, but only once per user. After it has been cached for a particular user, then the cache will be used.
Thank you, you're probably right, I should split my homepage controller into multiple cachable ViewComponents. The user specific's content would be outside the cache tags.
– Bidasse
Nov 22 '18 at 15:38
add a comment |
I'm not sure about what you were using previously, but I don't think it was actually doing what you think. The whole point of an output cache is bypassing the view rendering process, as such, whatever you cache is just returned as-is, not further processed to determine if something inside needs to be rendered.
If you cache your entire page, then you cannot have any part inside that needs to vary per user. You'll simply need to reduce the scope of what you're caching. Cache the parts of the page that don't vary, and that will at least give the main page a leg up in rendering. This is what the cache
tag helper is for. You can also cache just for a particular user with this tag helper:
<cache vary-by-user="true">
<!-- user-specific stuff -->
</cache>
This will still render multiple times, but only once per user. After it has been cached for a particular user, then the cache will be used.
I'm not sure about what you were using previously, but I don't think it was actually doing what you think. The whole point of an output cache is bypassing the view rendering process, as such, whatever you cache is just returned as-is, not further processed to determine if something inside needs to be rendered.
If you cache your entire page, then you cannot have any part inside that needs to vary per user. You'll simply need to reduce the scope of what you're caching. Cache the parts of the page that don't vary, and that will at least give the main page a leg up in rendering. This is what the cache
tag helper is for. You can also cache just for a particular user with this tag helper:
<cache vary-by-user="true">
<!-- user-specific stuff -->
</cache>
This will still render multiple times, but only once per user. After it has been cached for a particular user, then the cache will be used.
answered Nov 21 '18 at 14:10
Chris PrattChris Pratt
158k20240307
158k20240307
Thank you, you're probably right, I should split my homepage controller into multiple cachable ViewComponents. The user specific's content would be outside the cache tags.
– Bidasse
Nov 22 '18 at 15:38
add a comment |
Thank you, you're probably right, I should split my homepage controller into multiple cachable ViewComponents. The user specific's content would be outside the cache tags.
– Bidasse
Nov 22 '18 at 15:38
Thank you, you're probably right, I should split my homepage controller into multiple cachable ViewComponents. The user specific's content would be outside the cache tags.
– Bidasse
Nov 22 '18 at 15:38
Thank you, you're probably right, I should split my homepage controller into multiple cachable ViewComponents. The user specific's content would be outside the cache tags.
– Bidasse
Nov 22 '18 at 15:38
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53412902%2fhow-to-pull-a-viewcomponent-outside-a-response-cached-controllers-action-in-asp%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
See if this helps: docs.microsoft.com/en-us/aspnet/core/performance/caching/…
– Neal
Nov 21 '18 at 13:23