I've got a problem using outputcache together with urlrewriting. We've got an application that rewrites url (IE http://localhost/about/ ) to "~/page.aspx". Based on the URL (/about/) we figure out which content to show.
Now we're trying to add outputcache to that page:
< %@ outputcache duration="600" location="Server" varybyparam="Custom" varybycustom="RawURL" %>
And in the Global.asax we override GetVaryByCustomString like below:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom == "RawUrl")
{
return context.Request.RawUrl;
}
else
{
return string.Empty;
}
}
However, when we publish the page i'd like to invalidate the cache so that the editors see the change directly. But no matter what I try, I cannot seem to invalidate the cache. If I'd like to invalidate "/about/" I would like to do this:
HttpResponse.RemoveOutputCacheItem("/about/");
That doesn't work unfortunately. The only thing that seems to work is:
HttpResponse.RemoveOutputCacheItem("/page.aspx");
This clears the cache for all my pages, not just "/about/".
Is there any way to invalidate the cache based on the url? Or should we provide a cache key or something per page to be able to invalidate the cache programmatically?
Thanks in advance!
I've solved with using following link. http://www.superstarcoders.com/blogs/posts/making-asp-net-output-cache-work-with-post-back.aspx
Basically on my usercontrol;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
if (Request.QueryString["url"] == null)
return;
string url = "www." + Request.QueryString["url"].ToString().Replace("http://", "").Replace("https://", "").Replace("www.", "").ToLower();
Response.AddCacheItemDependency(url);
}
You don't need to invalidate the cache. You can tell the server to not use the cache for certain requests.
To do this in your page load add this
Response.Cache.AddValidationCallback((ValidateCache), Session);
Then add this method to tell app whether use what is in the output cache for the current request
public static void ValidateCache(HttpContext context, Object data, ref HttpValidationStatus status)
{
bool isEditor = /*assignment here*/;
if (!isEditor)
{
status = HttpValidationStatus.Valid;
}
else
{
status = HttpValidationStatus.IgnoreThisRequest;
}
}
If you do not want a certain request to be cached for other users to see use the following
Response.Cache.SetCacheability(HttpCacheability.NoCache);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.