Domanda

Ho un piccolo (o forse non così piccolo) problema con alcuni siti ASP.NET/Castle monorotaia per un prodotto io lavoro su. Questo è un piuttosto sistema legacy (scritto ben prima del mio tempo), e utilizza richieste GET con una notevole quantità di informazioni nella stringa di query. Abbiamo recentemente incontrato limitazioni di lunghezza di stringa di query, e per la quantità di dati che è necessario trasferire al server, la memorizzazione dei dati temporaneamente in un cookie inoltre, non è plausibile (siamo già ben oltre il limite di 4096 byte per cookie, e noi impostare un sacco di biscotti, quindi siamo probabilmente vicino o al limite di cookie per dominio pure.)

Mi chiedo se ci sono delle alternative, oltre POST (in alcuni casi cambiando ad una richiesta POST può essere possibile, ma probabilmente non in tutti), che potrebbe risolvere questo problema. Sto sperando che qualcuno altro qui su StackOverflow ha incontrato problemi simili, e ha qualche soluzione wizardly (cioè comprimere i dati con javascript, codificare come Base64, passare ad un singolo elemento stringa di query? Proprio non è sicuro se ci sono delle librerie che possono comprimere dati con javascript in modo compatibile con built-in classi di compressione in .NET 3.5.)

UPDATE:

Soluzione finito per scegliere è stato quello di POST a un controller temporanea. Questo controller temperatura tirato il grande elenco di dati, bloccato in una sessione condivisa (server di produzione sono in una grande fattoria server multi-banca che non fa uso di sessioni di appiccicoso / IPS), ed eseguito un GET per il controller attuale, che ha tirato i dati della sessione condivisa. Non è la soluzione più performante, ma ha risolto il problema.

È stato utile?

Soluzione

Ci sono diversi href="http://plugins2.jquery.com/search/node/base64+type%3Aproject_project" plugin Base64 codifica per jQuery , ma che non aiuta perché Base64 rende in generale i dati più , non inferiore.

A seconda dei dati, mi piacerebbe guardare in alcune altre tecniche di compressione del testo. Wikipedia elenca alcuni :

  • Context metodo per struttura di ponderazione (CTW)
  • Burrows-Wheeler trasformata (blocco classificare preelaborazione che rende la compressione più efficiente)
  • LZ77 (usato da DEFLATE)
  • LZW

Ecco un href="http://www.marklomas.net/ch-egg/articles/lzwjs.htm" rel="nofollow noreferrer"> implementazione .

codifica di Huffman basata sulla frequenza lettera, quindi non può essere appropriato per i tuoi dati. Probabilmente dovrete per sfuggire il risultato per renderlo sicuro per le URL.

Altri suggerimenti

Al di là di passaggio a pubblicare il tuo opzioni stanno per essere limitato. Base64 è destinato ad aumentare la dimensione dei dati non diminuirlo. Lei parla di comprimere i dati in un singolo elemento stringa di query ... magari invece si potrebbe suddividere i dati in 2 richieste separate utilizzando AJAX? Non sono sicuro se questo è fattibile per la vostra situazione, però.

Io suggerirei di usare JSON come formato di trasferimento dei dati se viene generato un array come stringa di query nel seguente modo:

params[]=sth&params[]=sth2&params[]=sth3

Questa sarebbe

{params:['sth1', 'sth2', 'sth3']}

È possibile sssign questa stringa JSON per una singola variabile lettera come qui di seguito

p={params:['sth1', 'sth2', 'sth3']}

Qualcosa ancora meglio sarebbe comprime e codifica Base64 l'intera stringa di query. Dal momento che si genera la stringa di query sul lato server (suppongo questo, ma stessa cosa può essere fatto in JS utilizzando gli stessi algoritmi comp / decomp) è possibile utilizzare qualsiasi algoritmo di compressione interna con il linguaggio di programmazione come gzip. Dopo Base64 codifica dei dati compressi, sì, si espanderà un po ', ma non tanto quanto la codifica URL espande.

Non vorrei fare troppo affidamento su JavaScript. Compattare la stringa di query sarebbe la prima cosa naturale da fare; ma se siete molto più avanti questi limiti, si dovrebbe provare mentaining sessioni. Si avvia fresco con informazioni stato di default, poi a poco a poco rispecchiano lo stato del server nella sessione dell'utente con i dati POST forniti, in modo da partizionare tutti i dati in molti gestori (leggere le pagine).

La risposta da manuale è quello di utilizzare POST. Perché questo non è possibile? La ragione per cui è stato inventato POST era praticamente per aggirare i limiti di lunghezza in GET.

Un'altra possibilità a seconda delle particolari è quello di avere più schermi, ciascuno con un sottoinsieme dei dati, e memorizzare i dati da ciascuna sul server e collegarli alla fine.

è la limitazione stringa di query sul client o server?

Se il problema è solo che il cliente non invierà la stringa GET lungo, forse potete inviare a un server proxy che poi inoltra la richiesta come un GET.

E 'questo per contenere le informazioni di stato tra le pagine? In tal caso, l'opzione potrebbe essere quella di utilizzare un cookie con il suo valore un GUID come tale:

_SESSIONID=3F2504E0-4F89-11D3-9A0C-0305E82C3301

E memorizzare il lato server informazioni di sessione. La sessione è identificato univocamente con un GUID, quindi è quindi facile recuperare la grande quantità di informazioni direttamente sul server.

Tutto è quindi necessario inviare / recuperare sul lato client è che id di sessione, così come client generato informazioni (campi GET / POST).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top