我需要澄清一下缓存的工作方式。
我有一个具体的问题:
我在该页面中有一个主页面(索引)我有很多静态元素(标题,文本等等),我在该页面中还有一个下拉列表是在DOM完全加载时进行初始化,让我放大一点,这样你就能抓住我的漂移:
加载我的索引页面,在加载页面后,我在AJAX(带有Jquery)中发送请求,获取"选项"对于DB(SQL Azure)的下拉列表,我这样做是为了首先向用户显示页面然后从数据库中获取数据(因此用户不会等待额外的第二个页面加载)。 / p>
现在当我缓存该页面时,是否还要缓存下拉列表的请求?
你想看一些代码吗?肯定的。
我正在使用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中缓存Action?
底线,我希望将页面长时间(如小时)和下拉列表缓存10秒钟。
我自己做了一些测试(使用Google Chrome浏览器的网页检查器中的网络标签)和索引页面,我看到某些时候&#34; 200 OK&#34;有时&#34; 304未修改&#34;,当我刷新页面时,它的比例为1:1一次200 ok,有时304未修改。
关于下拉列表,我总是从/ Home / GetProfiles获得200 OK,正如我所看到的,这个动作根本不是缓存。
当我查看标题时(在Google Chrome中的网络标签中),我看到了两个请求(localhost - get index page,Home / GetProfiles - POST get profiles)
缓存控制:最大年龄= 0
在回复标题中看到:
本地主机:
Cache-Control:public,max-age = 3427
GetProfiles:
缓存控制:public,max-age = 20
这就是我想要在那里(在请求的标题中并回复)?如果它可以只缓存X秒的页面和使用AJAX的Y秒请求?
感谢。
答案 0 :(得分:0)
您的ajax请求将始终命中服务器,因为您正在使用POST请求。将其更改为GET以查看差异。
[RFC 2616第9.1节(POST)] http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1