Frage

habe ich ein kleines (oder vielleicht nicht so klein) Problem mit einigen ASP.NET/Castle Einschienenstellen für ein Produkt, das ich die Arbeit an. Dies ist ein ziemlich Altsystem (geschrieben gut vor meiner Zeit), und es verwendet, um Anforderungen mit einer beträchtlichen Menge an Informationen in dem Query-String GET. Wir haben vor kurzem in Query-String-Längenbeschränkungen führen und für die Datenmenge müssen wir Übertragung an den Server, die Daten vorübergehend in einem Cookie gespeichert ist auch nicht plausibel (wir sind schon weit über die 4096 Byte-Grenze pro Cookie, und wir set eine Menge von Cookies, so dass wir wahrscheinlich in der Nähe oder an der Grenze der Cookies pro Domain als auch.)

sind

Ich frage mich, ob es irgendwelche Alternativen sind neben POST (in einigen Fällen auf eine POST-Anfrage Wechsel möglich sein kann, aber wahrscheinlich nicht in allen), die dieses Problem lösen könnte. Ich hoffe, dass jemand anderes hier auf Stackoverflow hat sich zu ähnlichen Problemen führen, und hat einige wizardly Lösung (dh komprimieren Daten mit Javascript, kodieren als base64, auf eine einzelne Abfrage-String Element passieren? Nur nicht sicher, ob es irgendwelche Bibliotheken, dass komprimieren kann mit Javascript Daten in einer Art und Weise kompatibel mit integrierten Kompressionsklassen in .NET 3.5.)

UPDATE:

Lösung Ich landete Wahl, um es zu einem temporären Controller war. Dieser Temperaturregler zog die große Liste von Daten, es in einer gemeinsamen Sitzung fest (die Produktionsserver sind in einer großen Multi-Bank-Server-Farm, die nicht klebrig nicht verwendet Sitzungen / IP), und führte eine GET zum eigentlichen Controller, der gezogen die Daten aus der gemeinsamen Session. Nicht die performante Lösung, aber es löste das Problem.

War es hilfreich?

Lösung

Es gibt mehrere Base64 kodieren Plugins für jQuery , aber das nicht hilft, weil Base64 im allgemeinen die Daten länger macht, nicht kürzer.

In Abhängigkeit von den Daten, würde ich bei einigen anderen Textkompressionstechniken aussehen. Wikipedia listet einige :

  • Kontextbaum Gewichtungsmethode (CTW)
  • Burrows-Wheeler-Transformation (Block Sortier Vorverarbeitung das macht eine effizientere Kompression)
  • LZ77 (verwendet von DEFLATE)
  • LZW

Hier ist eine LZW-Implementierung für Javascript .

Huffman-Kodierung auf Häufigkeit von Buchstaben basiert, so dass es nicht sinnvoll sein könnte für deine Daten. Sie werden wahrscheinlich das Ergebnis zu entkommen, um es URL-sicher zu machen.

Andere Tipps

Darüber hinaus Schalten Sie Ihre Möglichkeiten POST gehen zu beschränken. Base64 wird die Größe der Daten zu erhöhen, ist es nicht verringern. Sie erwähnen die Komprimierung der Daten in einer einzigen Abfrage-String Artikel ... vielleicht stattdessen können Sie die Daten in zwei getrennte Anfragen aufgeteilt Ajax? Ich bin mir nicht sicher, ob das für Ihre Situation machbar ist, though.

Ich würde vorschlagen, JSON als Datenübertragungsformat zu verwenden, wenn ein Array wie Query-String erzeugt wird, wie folgt:

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

Dies wäre

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

Sie können sssign diesen JSON-String in einem einzigen Buchstaben Variable wie unter

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

Etwas wäre noch besser komprimieren und Base64 codiert, die gesamte Abfrage-String. Da Sie den Query-String auf der Serverseite erzeugen (ich nehme an, dies aber gleiches kann mit dem gleichen comp / Zersetzungsprod Algorithmen in JS erfolgen) Sie einen eingebauten Komprimierungsalgorithmus mit Ihren Programmiersprache wie gzip verwenden können. Nach Base64 den komprimierten Daten codiert, ja wird es ein wenig erweitern, aber nicht so viel wie die URL-Codierung erweitert es.

Ich würde nicht zu viel auf Javascript angewiesen. die Query-String-Kompaktierung wäre die erste natürliche Sache zu tun; aber wenn man weit voraus, diese Grenzen sind, dann sollten Sie versuchen, Sitzungen mentaining. Sie starten frisch mit Standardzustand Info, dann allmählich den Zustand auf dem Server in der Sitzung des Benutzers widerspiegeln mit POST-Daten zur Verfügung gestellt, so dass Sie alle diese Daten in viele Handler (lesen Seiten) partitionieren.

Das Lehrbuch Antwort ist POST zu verwenden. Warum sollte dies nicht möglich sein? Der Grund POST erfunden wurde, war so ziemlich Länge Grenzen in GET herum zu erhalten.

Ein andere Möglichkeit auf den Details abhängig ist, mehrere Bildschirme zu haben, die jeweils mit einer Teilmenge der Daten, und die Daten von jedem auf dem Server und verbinden sie am Ende nach oben.

Ist die Query-String-Beschränkung auf dem Client oder den Server?

Wenn das Problem ist nur, dass der Kunde das lange GET String nicht senden, können Sie vielleicht an einen Proxy-Server nach, die dann leitet die Anforderung als GET.

Ist das zu halten, Zustandsinformationen zwischen den Seiten? Wenn ja, könnte eine Option sein, ein Cookie zu verwenden, mit dem Wert, es ist ein GUID als solche:

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

und speichern Sie die Sitzungsinformationen Server-Seite. Die Sitzung ist eindeutig mit einer GUID identifiziert, so ist es dann einfach, die große Menge an Informationen direkt auf dem Server abgerufen werden.

Alles, was Sie dann brauchen, um clientseitige zu Senden / Abrufen ist, dass Session-ID, sowie Client generierten Informationen (GET / POST Felder).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top