ASP .NET MVC OutputCache 位置错误
ASP .NET MVC OutputCache wrong location
我对缓存视图没有什么问题。位置 header 是不正确的,当我丢失我的票并注销,并试图直接进入 url 之前。
示例:我在 /Admin/Categories 里面,然后由于 afk 太久而退出,所以我被重定向到 /Admin/Login。登录后,我试图转到 /Admin/Categories,缓存将我发送到 /Admin/Login 而不是 /Admin/Categories。
我的代码:
LOGIN CONTROLLER
[OutputCache(CacheProfile = "OneDayCache", VaryByParam = "None", VaryByCustom = "url")]
public ActionResult Index()
{
return View();
}
CATEGORIES CONTROLLER
[OutputCache(CacheProfile = "OneDayCache", VaryByParam = "None", VaryByCustom = "url")]
public ActionResult Index()
{
if (validations.ValidateTicket())
{
return View();
}
else
{
return RedirectToAction("Index", "Login");
}
}
validations.ValidateTicket() 返回 true 或 false,它运行良好 - 这不是问题所在。
GLOBAL.ASAX.CS
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "url")
{
return context.Request.RawUrl;
}
return base.GetVaryByCustomString(context, arg);
}
Web.config 里面的部分 :
<caching>
<outputCache enableOutputCache="true" omitVaryStar="true"></outputCache>
<outputCacheSettings>
<outputCacheProfiles>
<add name="OneDayCache" duration="86400" location="Client" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
缓存 - 登录(/Admin/Login)
HTTP/1.1 200 OK
Cache-Control: private, max-age=86400
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Fri, 10 Feb 2017 20:35:45 GMT
Last-Modified: Thu, 09 Feb 2017 20:35:45 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-Frame-Options: SAMEORIGIN
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?TTpcUHJvamVrdHlcQU1CSVQtQ01TLU1WQ1xBTUJJVCBDTVMgTVZDXEFkbWluXExvZ2lu?=
X-Powered-By: ASP.NET
Date: Thu, 09 Feb 2017 20:35:45 GMT
Content-Length: 1113
缓存 - 类别 (/Admin/Categories) - 查看错误的位置 header...
HTTP/1.1 302 Found
Cache-Control: private, max-age=86400
Content-Type: text/html; charset=utf-8
Expires: Fri, 10 Feb 2017 20:35:39 GMT
Last-Modified: Thu, 09 Feb 2017 20:35:39 GMT
Location: /Admin/Login
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?TTpcUHJvamVrdHlcQU1CSVQtQ01TLU1WQ1xBTUJJVCBDTVMgTVZDXEFkbWluXENhdGVnb3JpZXM=?=
X-Powered-By: ASP.NET
Date: Thu, 09 Feb 2017 20:35:39 GMT
Content-Length: 439
好的,所以问题是使用 VaryByCustom 作为参数的 OutputCache 位置也需要设置为服务器或任何其他使用服务器的位置。
例如:
在控制器中的用法:
[OutputCache(CacheProfile = "ControllerIndexCache")]
Web.config:
<caching>
<outputCache enableOutputCache="true" omitVaryStar="true"></outputCache>
<outputCacheSettings>
<outputCacheProfiles>
<add name="ControllerIndexCache" duration="10" location="Server" varyByCustom="Url" varyByParam="None" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
Global.asax.cs:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "Url")
{
return context.Request.Url.AbsoluteUri;
}
return base.GetVaryByCustomString(context, arg);
}
这个解决方案工作得很好。
我对缓存视图没有什么问题。位置 header 是不正确的,当我丢失我的票并注销,并试图直接进入 url 之前。
示例:我在 /Admin/Categories 里面,然后由于 afk 太久而退出,所以我被重定向到 /Admin/Login。登录后,我试图转到 /Admin/Categories,缓存将我发送到 /Admin/Login 而不是 /Admin/Categories。
我的代码:
LOGIN CONTROLLER
[OutputCache(CacheProfile = "OneDayCache", VaryByParam = "None", VaryByCustom = "url")]
public ActionResult Index()
{
return View();
}
CATEGORIES CONTROLLER
[OutputCache(CacheProfile = "OneDayCache", VaryByParam = "None", VaryByCustom = "url")]
public ActionResult Index()
{
if (validations.ValidateTicket())
{
return View();
}
else
{
return RedirectToAction("Index", "Login");
}
}
validations.ValidateTicket() 返回 true 或 false,它运行良好 - 这不是问题所在。
GLOBAL.ASAX.CS
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "url")
{
return context.Request.RawUrl;
}
return base.GetVaryByCustomString(context, arg);
}
Web.config 里面的部分 :
<caching>
<outputCache enableOutputCache="true" omitVaryStar="true"></outputCache>
<outputCacheSettings>
<outputCacheProfiles>
<add name="OneDayCache" duration="86400" location="Client" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
缓存 - 登录(/Admin/Login)
HTTP/1.1 200 OK
Cache-Control: private, max-age=86400
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Fri, 10 Feb 2017 20:35:45 GMT
Last-Modified: Thu, 09 Feb 2017 20:35:45 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-Frame-Options: SAMEORIGIN
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?TTpcUHJvamVrdHlcQU1CSVQtQ01TLU1WQ1xBTUJJVCBDTVMgTVZDXEFkbWluXExvZ2lu?=
X-Powered-By: ASP.NET
Date: Thu, 09 Feb 2017 20:35:45 GMT
Content-Length: 1113
缓存 - 类别 (/Admin/Categories) - 查看错误的位置 header...
HTTP/1.1 302 Found
Cache-Control: private, max-age=86400
Content-Type: text/html; charset=utf-8
Expires: Fri, 10 Feb 2017 20:35:39 GMT
Last-Modified: Thu, 09 Feb 2017 20:35:39 GMT
Location: /Admin/Login
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?TTpcUHJvamVrdHlcQU1CSVQtQ01TLU1WQ1xBTUJJVCBDTVMgTVZDXEFkbWluXENhdGVnb3JpZXM=?=
X-Powered-By: ASP.NET
Date: Thu, 09 Feb 2017 20:35:39 GMT
Content-Length: 439
好的,所以问题是使用 VaryByCustom 作为参数的 OutputCache 位置也需要设置为服务器或任何其他使用服务器的位置。
例如:
在控制器中的用法:
[OutputCache(CacheProfile = "ControllerIndexCache")]
Web.config:
<caching>
<outputCache enableOutputCache="true" omitVaryStar="true"></outputCache>
<outputCacheSettings>
<outputCacheProfiles>
<add name="ControllerIndexCache" duration="10" location="Server" varyByCustom="Url" varyByParam="None" />
</outputCacheProfiles>
</outputCacheSettings>
</caching>
Global.asax.cs:
public override string GetVaryByCustomString(HttpContext context, string arg)
{
if (arg == "Url")
{
return context.Request.Url.AbsoluteUri;
}
return base.GetVaryByCustomString(context, arg);
}
这个解决方案工作得很好。