2012-08-01 17 views
10

Ho questo bizzarro problema con Chrome. Molto spesso sembra memorizzare le richieste PUT in cache.Chrome sta memorizzando nella cache una richiesta HTTP PUT

I Dettagli: Ho un app utilizzando backbone.js e quando si cerca di persistere alcune modifiche ad un modello (spina dorsale genera automaticamente una richiesta PUT), Chrome appena wont inviare tale richiesta al server. Funziona perfettamente bene in Firefox e IE (non ho visto il problema in Safari finora).

Ecco uno screenshot dalla scheda Rete degli strumenti di sviluppo di Chrome. Come puoi vedere, la risposta per la richiesta PUT viene restituita dalla cache (la richiesta non colpisce il server !!) Chrome caches PUT request

Ecco uno screenshot dei dettagli dell'intestazione di quella stessa richiesta. Ancora una volta, è evidente che Chrome non si preoccupa di inviare la richiesta PUT al server. Chrome cached PUT request header

Il payload della richiesta è dati JSON. Qualche idea sul perché questo sta accadendo/cosa sto facendo male?

UPDATE: Chromium ha confermato che questa è davvero una bug on it's end (grazie gen Hančič).

soluzione temporanea ho finito override Backbone.sync metodo e aggiungendo un timestamp alla querystring di PUT, POST e DELETE richieste in modo che siano sempre unici:

if(!options.data && model && (method == 'create' || method == 'update' || method == 'delete')) { 
    params.url += (params.url.indexOf('?') == -1 ? '?' : '&') + '_=' + new Date().getTime(); 
} 
+2

questo accade solo se si inviano i dati nella richiesta PUT, che avrete già inviato prima o fa questo anche occure se si modificano i dati da presentare e far scattare la chiedere di nuovo? –

+0

La risposta dal server non cambia forse è per questo che viene memorizzata nella cache. Come ha detto Robin, modifica/correggi la richiesta – Zebra

+1

I dati cambiano decisamente. Tuttavia, penserei che non dovrebbe importare se i dati sono cambiati o meno. Un PUT in realtà non è un tipo di richiesta memorizzabile nella cache. È pensato per inviare dati al server, non per recuperare i dati. – anushr

risposta

4

Io uso parametro in più per evitare la memorizzazione nella cache :

url += '?_dc=' + Math.random().toFixed(20).replace('.', ''); 

Non interpreto questo parametro sul lato server.

MODIFICA: Oltre a Chrome ci sono molte cose che potrebbero memorizzare le richieste di cache - ad esempio il server proxy dell'utente. Penso che un ulteriore parametro di query sia una buona soluzione per evitare la memorizzazione nella cache.

+0

Sono d'accordo che sarebbe la soluzione alternativa appropriata. Ho provato a farlo ma, sfortunatamente, poiché utilizziamo backbone.js, l'aggiunta di parametri aggiuntivi per la query querystring è piuttosto difficile (a meno che qualcuno non abbia suggerimenti su come avere un carico utile di richiesta E param di querystring con backbone) – anushr

+0

Si potrebbe implementare il metodo 'sync' per il modello. Come posso vedere, potresti passare 'url' con' options' al metodo 'Backbone.sync'. Vedi http://backbonejs.org/#Sync e l'implementazione 'sync' del backbone per maggiori dettagli. Potresti racchiudere 'Backbone.sync' e fare tutte queste cose in un posto. –

+0

Ho finito col sovrascrivere 'Backbone.sync' e incluso il timestamp (' url + = '? _ =' + New Date(). GetTime() ') ogni volta che c'è una richiesta PUT, POST o DELETE (apparentemente Chrome ha problemi con tutti e 3) – anushr

0

Backbone utilizza jQuery o Zepto per effettuare la richiesta AJAX. Supponendo che stai usando jQuery, imposta la cache.

Esegui questo per impostare la cache off nell'applicazione complessiva in modo non sarà necessario preoccuparsi di cache:

$.ajaxSetup({ 
     cache : false 
}); 

Se mantenere la cache è importante per il vostro business, credo che si potrebbe fare qualcosa così per specifica nessuna cache chiama:

model.save({}, {cache:false}); 
+1

La proprietà 'cache' ha effetto solo sulle richieste' GET' (come dovrebbe essere). Non fa nulla per le richieste di 'PUT'. – anushr

+0

Non penso, ho impostato la cache false e vedo che le richieste PUT hanno la query noCache. –

+0

Non sei sicuro di dove hai trovato che le informazioni sbagliate su quella cache funzionano solo per la richiesta GET, forse oggi farai sovrascrittura su Backbone.Syncs, in seguito quando testerai $ .ajaxSetup solo capirai che funziona. Ho molti progetti che usano Backbone.js e jQuery e so che questa linea è sufficiente. –

Problemi correlati