非会话用户的输出缓存代码隐藏
Output cache code behind for non session users
如果 Session["user"] 是否为空,我可以在我可以在代码隐藏中检测到的页面中进行输出缓存,并且如果尚未缓存该页面,则将其缓存 5 分钟(输出缓存不已过期)和 Session["user"] == null.
我不想使用自定义输出缓存,因为它也会为登录用户缓存。这样只有匿名访问者才能看到缓存的页面,而登录用户将看到非缓存的页面
我这样做是因为当用户登录或未登录时,我的某些页面看起来会有所不同。我希望爬虫和普通访问者看到原始页面,而不是从错误触发缓存的用户那里获取私人数据。
如何在 C# 后面的代码中执行此操作?
您应该能够创建自定义 OutputCacheProvider
。
在你的 global.asax:
public override string GetOutputCacheProviderName(HttpContext context)
{
bool isInSession = true; // Determine here.
if (isInSession)
{
return "CustomProvider";
}
// Or by page:
if (context.Request.Path.EndsWith("MyPage.aspx"))
{
return "SomeOtherProvider";
}
return base.GetOutputCacheProviderName(context);
}
然后创建您的提供商:
public class SessionBasedCacheProvider : OutputCacheProvider
{
public override object Get(string key)
{
return null; // Do not cache.
}
public override object Add(string key, object entry, DateTime utcExpiry)
{
// Basically let it "fall through" since we don't want any caching.
return entry;
}
public override void Set(string key, object entry, DateTime utcExpiry)
{
// Basically let it "fall through" since we don't want any caching.
}
public override void Remove(string key)
{
// Basically let it "fall through" since we don't want any caching.
}
}
通过从 Set 返回 null
,您将不会缓存项目。
The key value that identifies the specified entry in the cache, or
null if the specified entry is not in the cache.
并将您的提供商添加到配置中:
<system.web>
<caching>
<outputCache defaultProvider="AspNetInternalProvider">
<providers>
<clear/>
<add name="CustomProvider" type="YourNamespace.SessionBasedCacheProvider, YourNamespace, Version=1.0.0.0, Culture=neutral"/>
</providers>
</outputCache>
</caching>
</web>
要启用它,您应该可以使用。只需将它设置到 ASPX 页面的顶部。请注意 Location
属性,具体取决于您希望它缓存的位置。
<%@ OutputCache Duration="60" VaryByParam="None" Location="Server" %>
https://msdn.microsoft.com/en-us/library/hdxfb6cy(v=vs.85).aspx
https://msdn.microsoft.com/en-us/magazine/gg650661.aspx
或者,您始终可以使用相同的 CacheProvider,并让它确定是否应缓存该项目。
public class CustomOutputCacheProvider : OutputCacheProvider
{
public override object Add(string key, object entry, DateTime utcExpiry)
{
// Determine if in session.
bool isInSession = true;
if (isInSession)
{
return null;
}
// Do the same custom caching as you did in your
// CustomMemoryCache object
var result = HttpContext.Current.Cache.Get(key);
if (result != null)
{
return result;
}
HttpContext.Current.Cache.Add(key, entry, null, utcExpiry,
System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
return entry;
}
public override object Get(string key)
{
return HttpContext.Current.Cache.Get(key);
}
public override void Remove(string key)
{
HttpContext.Current.Cache.Remove(key);
}
public override void Set(string key, object entry, DateTime utcExpiry)
{
HttpContext.Current.Cache.Add(key, entry, null, utcExpiry,
System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
}
}
代码来自 http://www.haneycodes.net/custom-output-caching-with-mvc3-and-net-4-0-done-right/
注意,我没有用 Session 测试过这个,但理论上它应该可以工作。但我建议您在发布之前真正测试它。缓存总是比人们想象的要难得多...:(
更新:由于 Session 不可用,您应该可以使用 cookie。
protected void Session_Start(object sender, EventArgs e)
{
Response.Cookies.Add(new HttpCookie("SessionCookie", "some_value"));
}
public override string GetOutputCacheProviderName(HttpContext context)
{
bool isInSession = true; // Determine here.
if (context.Request.Cookies["SessionCookie"] != null)
{
// Use your CustomProvider
}
if (isInSession)
{
return "CustomProvider";
}
// Or by page:
if (context.Request.Path.EndsWith("MyPage.aspx"))
{
return "SomeOtherProvider";
}
return base.GetOutputCacheProviderName(context);
}
记得删除cookie,或者以某种方式处理它。
如果 Session["user"] 是否为空,我可以在我可以在代码隐藏中检测到的页面中进行输出缓存,并且如果尚未缓存该页面,则将其缓存 5 分钟(输出缓存不已过期)和 Session["user"] == null.
我不想使用自定义输出缓存,因为它也会为登录用户缓存。这样只有匿名访问者才能看到缓存的页面,而登录用户将看到非缓存的页面
我这样做是因为当用户登录或未登录时,我的某些页面看起来会有所不同。我希望爬虫和普通访问者看到原始页面,而不是从错误触发缓存的用户那里获取私人数据。
如何在 C# 后面的代码中执行此操作?
您应该能够创建自定义 OutputCacheProvider
。
在你的 global.asax:
public override string GetOutputCacheProviderName(HttpContext context)
{
bool isInSession = true; // Determine here.
if (isInSession)
{
return "CustomProvider";
}
// Or by page:
if (context.Request.Path.EndsWith("MyPage.aspx"))
{
return "SomeOtherProvider";
}
return base.GetOutputCacheProviderName(context);
}
然后创建您的提供商:
public class SessionBasedCacheProvider : OutputCacheProvider
{
public override object Get(string key)
{
return null; // Do not cache.
}
public override object Add(string key, object entry, DateTime utcExpiry)
{
// Basically let it "fall through" since we don't want any caching.
return entry;
}
public override void Set(string key, object entry, DateTime utcExpiry)
{
// Basically let it "fall through" since we don't want any caching.
}
public override void Remove(string key)
{
// Basically let it "fall through" since we don't want any caching.
}
}
通过从 Set 返回 null
,您将不会缓存项目。
The key value that identifies the specified entry in the cache, or null if the specified entry is not in the cache.
并将您的提供商添加到配置中:
<system.web>
<caching>
<outputCache defaultProvider="AspNetInternalProvider">
<providers>
<clear/>
<add name="CustomProvider" type="YourNamespace.SessionBasedCacheProvider, YourNamespace, Version=1.0.0.0, Culture=neutral"/>
</providers>
</outputCache>
</caching>
</web>
要启用它,您应该可以使用。只需将它设置到 ASPX 页面的顶部。请注意 Location
属性,具体取决于您希望它缓存的位置。
<%@ OutputCache Duration="60" VaryByParam="None" Location="Server" %>
https://msdn.microsoft.com/en-us/library/hdxfb6cy(v=vs.85).aspx
https://msdn.microsoft.com/en-us/magazine/gg650661.aspx
或者,您始终可以使用相同的 CacheProvider,并让它确定是否应缓存该项目。
public class CustomOutputCacheProvider : OutputCacheProvider
{
public override object Add(string key, object entry, DateTime utcExpiry)
{
// Determine if in session.
bool isInSession = true;
if (isInSession)
{
return null;
}
// Do the same custom caching as you did in your
// CustomMemoryCache object
var result = HttpContext.Current.Cache.Get(key);
if (result != null)
{
return result;
}
HttpContext.Current.Cache.Add(key, entry, null, utcExpiry,
System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
return entry;
}
public override object Get(string key)
{
return HttpContext.Current.Cache.Get(key);
}
public override void Remove(string key)
{
HttpContext.Current.Cache.Remove(key);
}
public override void Set(string key, object entry, DateTime utcExpiry)
{
HttpContext.Current.Cache.Add(key, entry, null, utcExpiry,
System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
}
}
代码来自 http://www.haneycodes.net/custom-output-caching-with-mvc3-and-net-4-0-done-right/
注意,我没有用 Session 测试过这个,但理论上它应该可以工作。但我建议您在发布之前真正测试它。缓存总是比人们想象的要难得多...:(
更新:由于 Session 不可用,您应该可以使用 cookie。
protected void Session_Start(object sender, EventArgs e)
{
Response.Cookies.Add(new HttpCookie("SessionCookie", "some_value"));
}
public override string GetOutputCacheProviderName(HttpContext context)
{
bool isInSession = true; // Determine here.
if (context.Request.Cookies["SessionCookie"] != null)
{
// Use your CustomProvider
}
if (isInSession)
{
return "CustomProvider";
}
// Or by page:
if (context.Request.Path.EndsWith("MyPage.aspx"))
{
return "SomeOtherProvider";
}
return base.GetOutputCacheProviderName(context);
}
记得删除cookie,或者以某种方式处理它。