3

ブラウザのキャッシュを修正notmodifiedして JSON に応答する方法は? 応答時にjQuery.ajax({ifModified:true,cache:true})JSON 要求が中断されます。data

初めてのブラウザ リクエストhttp://localhost/apiは、ステータス200 OKと次を返します304 Not Modified

$.ajax({
    type:"GET",
    url:'http://localhost/api', // {"content"="Hello!"}
    dataType:'json',
    cache:true,
    ifModified:true,            // Lets respond `304:notmodified`
    success:function(data,textStatus,jqXHR){
        console.debug(jqXHR.status+':'+textStatus);
        console.debug(data);    // Why on repeated request returns `undefined`?
    }
});

XHR の初回は OK を返します:

200:success
Object {content="Hello!"}

しかし、次回はdata undefinedを返します:

304:notmodified
undefined

それを解決する方法は?jQuery 1.5.1 のバグのようです。期待される結果:

304:notmodified
Object {content="Hello!"}
4

3 に答える 3

1

これが動作するはずの方法であると私は信じています。304はデータを返さず、変更されていないことを通知するだけです。

ただし、データをまだメモリに保存していない場合は、ブラウザのキャッシュからデータを取得するための何らかの方法が必要です。したがって、解決策はデータをキャッシュするための書き込みコードだと思います。

HTTPSがetagでどのように機能するかはわかりませんが、HTTPSデータが常にキャッシュされるとは限りません(ブラウザとバージョン間で異なる方法と動作)。したがって、etagが機能する場合は、とにかく独自の安全なキャッシュを実装する必要があります。

于 2011-08-01T09:50:43.847 に答える
-1

304 を受け取ったら、データを再リクエストする必要がありますが、「ifModified」フラグを false に設定します。その後、リクエストは通常​​のキャッシュ ルールの対象となり、キャッシュされたデータを受け取ります。

たとえば、MVC コントローラーでは...

        DateTime pageLastUpdated = <.....>

        if (Request.Headers["If-Modified-Since"] != null)
        {
            var dt = DateTime.Parse(Request.Headers["If-Modified-Since"] as string);

            if (pageLastUpdated.Date == dt.Date && pageLastUpdated.Hour == dt.Hour && pageLastUpdated.Minute == dt.Minute && pageLastUpdated.Second == dt.Second) {
              Response.Cache.SetCacheability(HttpCacheability.NoCache);                    
              return new HttpStatusCodeResult(304, "notmodified");
            }
        }

        Response.Cache.SetCacheability(HttpCacheability.Private);
        Response.Cache.SetVaryByCustom("*");
        Response.Cache.SetExpires(pageLastUpdated.AddDays(1));
        Response.Cache.SetLastModified(pageLastUpdated);

        // now return the Json
        return Json(new {........});

送り返されたデータは、最大 1 日間クライアントにキャッシュされます。

function loadJson(url, params, onLoaded) {
  // initial request 
  $.ajax({
    type: 'GET',
    dataType: 'json',
    url: url,
    data: params,
    cache: true,
    ifModified: true, // forces check with server
    success: function (result, textStatus, jqXHR) {

        // if 304, re-request the data
        if (result === undefined && textStatus == 'notmodified') {
            $.ajax({
                type: 'GET',
                dataType: 'json',
                url: url,
                data: params,
                cache: true,
                ifModified: false, // don't check with server
                success: function (cachedResult, textStatus, jqXHR) {
                    onLoaded(cachedResult);
                }
            });
        }
        else
            onLoaded(result);
    }
});
于 2012-09-29T13:29:27.400 に答える
-1

パラメータとして URL の末尾に乱数を追加してみてください。

random_number = Math.floor(Math.random()*10101010101)
url:'http://localhost/api?' + random_number
于 2011-03-31T20:38:07.553 に答える