我有一個ASP.NET MVC應用程式,我在其中實作了自定義快取過濾器,代碼如下:
我有一個ASP.NET MVC應用程式。
public class NonAuthenticatedOnlyCacheAttribute 。OutputCacheAttribute 。
{
public NonAuthenticatedOnlyCacheAttribute()
{
Duration = 600; /*default cache time*/
}
private bool _partialView;
public bool PartialView
{
get { return _partialView; }
set _partialView; }
{
_partialView = value;
if (_partialView)
{
VaryByCustom = "user";
}
}
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
if (PartialView) OnCachePartialEnabled(filterContext)。
else OnCacheEnabled(filterContext)。
base.OnResultExecuting(filterContext)。
}
private OutputCacheLocation? originalLocation;
private int? _prevDuration。
protected void OnCachePartialEnabled(ResultExecutingContext filterContext)
{
var httpContext = filterContext.HttpContext。
if (!_prevDuration.HasValue) _prevDuration = Duration;
Duration = httpContext.User.Identity.IsAuthenticated ? 1 : _prevDuration.Value;
}
protected void OnCacheEnabled(ResultExecutingContext filterContext)
{
var httpContext = filterContext.HttpContext。
if (httpContext.User.Identity.IsAuthenticated)
{
//關鍵是不要快取認證的內容。
originalLocation = originalLocation ? Location。
Location = OutputCacheLocation.None;
}
else
{
Location = originalLocation ? Location;
}
// this smells a little but it works[/span>
httpContext.Response.Cache.AddValidationCallback(IgnoreAuthenticated, null)。
}
//這個方法在每次快取頁面要被時被呼叫。
//服務時呼叫該方法,以確保認證用戶忽略快取。
private void IgnoreAuthenticated(HttpContext context, object data, ref HttpValidationStatus validationStatus)
{
validationStatus = context.User.Identity.IsAuthenticated
? HttpValidationStatus.IgnoreThisRequest
: HttpValidationStatus.Validation。
}
我面臨的問題是,盡管我沒有為認證用戶快取頁面,但有時我會看到其他認證用戶的快取頁面。這種情況很少發生,而且是隨機的。
如果我通過這個除錯,它可以完全正常作業,但當它發生在LIVE網站上時就不一樣了。 我還看到,在瀏覽器中也創建了一個認證用戶的 cookie(".AspNet.ApplicationCookie")。(這是否意味著輸出快取也在快取回應的cookie?) 如果我洗掉這個cookie,那么用戶就會被注銷,這很明顯。
在Global.asax中,我有以下代碼:
public override string GetVaryByCustomString(HttpContext context, string value)
{
if (value.Equals("culture"/span>) || value.Equals("user"/span>)
{
var customString = Thread.CurrentThread.CurrentUICulture.Name。
if (context.User.Identity.IsAuthenticated)
{
customString = $"{context.User.Identity.Name}-{customString}"/span>。
}
return customString。
}
return base.GetVaryByCustomString(context, value) 。
}
而在控制器上,下面的屬性被快取了
[
uj5u.com熱心網友回復:
我想問題可能是你沒有告訴ASP.NET你的意思是什么。
VaryByCustom = "user"。
也許你做到了,但代碼沒有包含在你的帖子中。 在你的Global.asax.cs中,你會有這樣的東西:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg.Equals("User", StringComparison.InvariantCultureIgnoreCase)
{
var user = context.User.Identity.Name; // TODO 這里你必須從當前用戶身份中挑選一個獨特的識別符號。
return string.Format("{0}@{1}", userIdentifier.Name, userIdentifier.Container) 。
}
return base.GetVaryByCustomString(context, arg)。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/320379.html
標籤:
上一篇:在mvc中添加視圖選項不可用?
下一篇:從C代碼到RISC-V匯編代碼
