一般缓存和 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