一般缓存和 MVC 中的缓存
Caching in General and in MVC in Particular
我需要一些关于缓存工作方式的说明。
我有一个具体问题:
我在该页面中有一个主页(索引)我有很多静态元素(标题、文本等),我在该页面中还有一个下拉列表,当DOM 已满载,让我放大一点,以便您了解我的意思:
我的索引页面已加载,页面加载后我在 AJAX 中发送请求(使用 Jquery)从数据库中获取下拉列表的 "Options"( SQL Azure),我这样做是为了先向用户显示页面,然后从数据库中获取数据(这样用户就不会等待额外的一秒加载页面)。
现在当我缓存那个页面时,我是否也缓存下拉列表的请求?
您想查看一些代码吗?当然。
我正在使用 MVC 架构设计,所以我的代码如下所示:
家庭控制器:
// The Action that display the Index page
public class HomeController : Controller
{
[OutputCache(Duration=60*60)]
public ActionResult Index()
{
return View();
}
// The Action that get the data from the DB.
[OutputCache(Duration=15)]
public JsonResult GetProfiles()
{
Dictionary<string, string> ProfileDictionary = DataQueries.GetUserProfiles();
return Json(ProfileDictionary);
}
部分索引页:
<div class="gap-bottom" >
<h2><span class="font-Droid">Step 2: </span><span class="font-Crete">Select Profile</span></h2>
<p>Pick a profile....</p>
@Html.DropDownList("filterSelect", new MultiSelectList(new[] { "Choose Profile" }), new { @style = "width: 50%", @class = "form-control" })
</div>
索引页脚本
$.ajax({
type: 'POST',
url: '/Home/GetProfiles',
success: function (data) {
$.each(data, function (key, value) {
$('#filterSelect').append($("<option></option>").attr("value", value).text(key));
});
},
error: function (ts) {
if (ts.readyState == 0 || ts.status == 0) return;
alert(ts.responseText)
}
});
所以我的问题是:
如果我缓存页面,下拉列表是否也被缓存?或者我需要像我一样在 spsfic 中缓存动作?
底线,我想把页面缓存很长时间(比如一个小时),下拉列表缓存10秒。
我自己做了一些测试(使用 Google chrome 页面检查器中的网络选项卡),对于索引页面,我有时看到“200 OK”,有时看到“304 未修改” ,它的比率 1:1 一次 200 ok 有时 304 在我刷新页面时未修改。
关于下拉列表,我总是从 /Home/GetProfiles 得到 200 OK,在我看来,这个动作根本不是缓存。
当我查看 header(在 Google chrome 的网络选项卡中)时,我看到了两个请求(localhost - 获取索引页,Home/GetProfiles - POST 获取配置文件)
Cache-Control:max-age=0
并在响应中 header 看到:
本地主机:
Cache-Control:public, max-age=3427
获取配置文件:
Cache-Control:public, max-age=20
这就是我想要的(在 header 请求和响应中)?并且如果可以仅缓存 X 秒的页面和 Y 秒的 AJAX 请求?
谢谢。
您的 ajax 请求将始终到达服务器,因为您使用的是 POST 请求。将其更改为 GET 以查看差异。
[第 9.1 节中的 RFC 2616 (POST)] http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1
我需要一些关于缓存工作方式的说明。
我有一个具体问题:
我在该页面中有一个主页(索引)我有很多静态元素(标题、文本等),我在该页面中还有一个下拉列表,当DOM 已满载,让我放大一点,以便您了解我的意思:
我的索引页面已加载,页面加载后我在 AJAX 中发送请求(使用 Jquery)从数据库中获取下拉列表的 "Options"( SQL Azure),我这样做是为了先向用户显示页面,然后从数据库中获取数据(这样用户就不会等待额外的一秒加载页面)。
现在当我缓存那个页面时,我是否也缓存下拉列表的请求?
您想查看一些代码吗?当然。
我正在使用 MVC 架构设计,所以我的代码如下所示:
家庭控制器:
// The Action that display the Index page
public class HomeController : Controller
{
[OutputCache(Duration=60*60)]
public ActionResult Index()
{
return View();
}
// The Action that get the data from the DB.
[OutputCache(Duration=15)]
public JsonResult GetProfiles()
{
Dictionary<string, string> ProfileDictionary = DataQueries.GetUserProfiles();
return Json(ProfileDictionary);
}
部分索引页:
<div class="gap-bottom" >
<h2><span class="font-Droid">Step 2: </span><span class="font-Crete">Select Profile</span></h2>
<p>Pick a profile....</p>
@Html.DropDownList("filterSelect", new MultiSelectList(new[] { "Choose Profile" }), new { @style = "width: 50%", @class = "form-control" })
</div>
索引页脚本
$.ajax({
type: 'POST',
url: '/Home/GetProfiles',
success: function (data) {
$.each(data, function (key, value) {
$('#filterSelect').append($("<option></option>").attr("value", value).text(key));
});
},
error: function (ts) {
if (ts.readyState == 0 || ts.status == 0) return;
alert(ts.responseText)
}
});
所以我的问题是:
如果我缓存页面,下拉列表是否也被缓存?或者我需要像我一样在 spsfic 中缓存动作?
底线,我想把页面缓存很长时间(比如一个小时),下拉列表缓存10秒。
我自己做了一些测试(使用 Google chrome 页面检查器中的网络选项卡),对于索引页面,我有时看到“200 OK”,有时看到“304 未修改” ,它的比率 1:1 一次 200 ok 有时 304 在我刷新页面时未修改。
关于下拉列表,我总是从 /Home/GetProfiles 得到 200 OK,在我看来,这个动作根本不是缓存。
当我查看 header(在 Google chrome 的网络选项卡中)时,我看到了两个请求(localhost - 获取索引页,Home/GetProfiles - POST 获取配置文件)
Cache-Control:max-age=0
并在响应中 header 看到:
本地主机:
Cache-Control:public, max-age=3427
获取配置文件:
Cache-Control:public, max-age=20
这就是我想要的(在 header 请求和响应中)?并且如果可以仅缓存 X 秒的页面和 Y 秒的 AJAX 请求?
谢谢。
您的 ajax 请求将始终到达服务器,因为您使用的是 POST 请求。将其更改为 GET 以查看差异。
[第 9.1 节中的 RFC 2616 (POST)] http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1