Альтернатива запросу строки и файлов cookie при отправке данных на сервер?

StackOverflow https://stackoverflow.com/questions/1195075

Вопрос

У меня возникла небольшая (или, возможно, не такая уж маленькая) проблема с некоторыми сайтами ASP.NET/Castle Monorail для продукта, над которым я работаю.Это довольно устаревшая система (написанная задолго до меня), и она использует запросы GET со значительным объемом информации в строке запроса.Недавно мы столкнулись с ограничениями на длину строки запроса, а для объема данных, которые нам необходимо передать на сервер, временное хранение данных в файле cookie также нецелесообразно (мы уже значительно преодолели ограничение в 4096 байт на файл cookie, и мы установить много файлов cookie, поэтому мы, вероятно, также близки к пределу количества файлов cookie на домен или достигли его.)

Мне интересно, есть ли какие-либо альтернативы, кроме POST (в некоторых случаях переход на запрос POST возможен, но, вероятно, не во всех), которые могли бы решить эту проблему.Я надеюсь, что кто-то еще здесь, на StackOverflow, столкнулся с подобными проблемами и нашел какое-то волшебное решение (т. е.сжимать данные с помощью javascript, кодировать как base64, передавать в один элемент строки запроса?Просто не уверен, существуют ли какие-либо библиотеки, которые могут сжимать данные с помощью JavaScript способом, совместимым со встроенными классами сжатия в .NET 3.5.)

ОБНОВЛЯТЬ:

В итоге я выбрал решение POST на временный контроллер.Этот временный контроллер извлек большой список данных, закрепил его в общем сеансе (производственные серверы находятся в большой многобанковской серверной ферме, которая не использует закрепленные сеансы/IP-адреса) и выполнил GET к фактическому контроллеру, который извлек данные из общего сеанса.Не самое эффективное решение, но оно решило проблему.

Это было полезно?

Решение

Есть несколько Плагины кодирования Base64 для jQuery, но это не помогает, потому что Base64 обычно увеличивает длину данных, не короче.

В зависимости от данных я бы рассмотрел другие методы сжатия текста. Википедия перечисляет несколько:

  • Метод взвешивания контекстного дерева (CTW)
  • Преобразование Берроуза-Уиллера (предварительная обработка сортировки блоков, которая делает сжатие более эффективным)
  • LZ77 (используется DEFLATE)
  • ЛЗВ

Вот Реализация LZW для Javascript.

Кодирование Хаффмана основано на частоте букв, поэтому может не подходить для ваших данных.Вам, вероятно, придется экранировать результат, чтобы сделать его безопасным для URL.

Другие советы

Помимо перехода на POST, ваши возможности будут ограничены.Base64 собирается увеличить размер данных, а не уменьшить его.Вы упоминаете сжатие данных в один элемент строки запроса...может быть, вместо этого вы могли бы разделить данные на два отдельных запроса с помощью Ajax?Хотя я не уверен, что это осуществимо в вашей ситуации.

Я бы предложил использовать JSON в качестве формата передачи данных, если массив, подобный строке запроса, генерируется следующим образом:

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

Это было бы

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

Вы можете присвоить этой строке JSON однобуквенную переменную, как показано ниже.

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

Еще лучше было бы сжать и кодировать Base64 всю строку запроса.Поскольку вы генерируете строку запроса на стороне сервера (я предполагаю, что то же самое можно сделать и в JS, используя те же алгоритмы компиляции/декомпрессии), вы можете использовать любой встроенный алгоритм сжатия с вашим языком программирования, например gzip.После кодирования сжатых данных Base64 да, они немного расширятся, но не так сильно, как кодирование URL-адресов.

Я бы не стал слишком полагаться на JavaScript.Уплотнение строки запроса было бы первым естественным действием;но если вы намного превышаете эти пределы, вам следует попробовать сеансы ментайнинга.Вы начинаете заново с информацией о состоянии по умолчанию, затем постепенно отражаете состояние на сервере в сеансе пользователя с предоставленными данными POST, поэтому вы разделяете все эти данные на множество обработчиков (чтение страниц).

Ответ из учебника — использовать POST.Почему это невозможно?Причина, по которой был изобретен POST, заключалась в том, чтобы обойти ограничения длины в GET.

Другая возможность, в зависимости от деталей, — иметь несколько экранов, каждый из которых содержит подмножество данных, хранить данные с каждого на сервере и соединять их в конце.

Ограничение строки запроса на клиенте или на сервере?

Если проблема заключается только в том, что клиент не отправит длинную строку GET, возможно, вы можете отправить POST на прокси-сервер, который затем перенаправит запрос как GET.

Это для хранения информации о состоянии между страницами?Если да, то можно использовать файл cookie со значением GUID как таковой:

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

И сохраните информацию о сеансе на стороне сервера.Сеанс однозначно идентифицируется с помощью GUID, поэтому можно легко получить большой объем информации непосредственно на сервере.

Все, что вам затем нужно отправить/получить на стороне клиента, — это идентификатор сеанса, а также информацию, сгенерированную клиентом (GET/POST поля).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top