Поддержка собственного алгоритма сжатия для контента, обслуживаемого IIS - PullRequest
4 голосов
/ 16 ноября 2010

У меня есть несколько интернет-устройств, которые взаимодействуют с моим приложением MVC на IIS 7.5.В настоящее время я использую встроенное динамическое прозрачное сжатие (gzip / deflate).

Я хотел бы иметь возможность поддерживать другой алгоритм сжатия, который работает намного лучше, чем gzip (7zip) дляконтент, который я отправляю / получаю.

Другими словами, на клиенте я добавлю заголовок: accept: gzip, deflate, 7zip (или аналогичный), и сервер распознает это и применит наилучший выбор при отправке контента.

Какой лучший способ объединить все это?(Я знаю, как реализовать факт кодирования / декодирования 7zip)

Спасибо.

1 Ответ

0 голосов
/ 17 ноября 2010

На стороне сервера вы можете сжать свои ответы, используя HttpModule .HttpModule похож на global.asax в том, что он предоставляет запросы и ответы события жизненного цикла , такие как BeginRequest, ReleaseRequestState и EndRequest.Вы можете изменить содержимое ответа, обработав соответствующее событие и изменив поток вывода.Обычно вы изменяете ответ, прикрепляя выходной фильтр .Например, модуль HttpCompress (больше не обновляется) добавляет сжатые фильтры в события ReleaseRequestState или PreSendRequestHeaders:

http://code.google.com/p/httpcompress/source/browse/trunk/HttpCompress/HttpModule.cs

В дополнение к сжатию содержимоговам нужно установить заголовок Content-Encoding.Более свежий (хотя и бета) пример можно найти в модуле Rich Crane Wicked Compression .CodeProject также имеет пример модуля.

Имейте в виду, что сжатие HttpModule, скорее всего, не будет хорошо работать, если IIS настроен на сжатие на уровне сервера.Кроме того, будьте готовы к нескольким угловым случаям, если вы используете обработчики Ajax или .axd.Эти запросы могут работать не так, как вы ожидаете, или могут не проходить через ваш модуль без явного подключения.

На стороне клиента вам необходимо будет передавать свой собственный токен Accept-Encoding с каждым запросом.Избегайте сжатия на сервере, если этот токен не установлен.Если вы добавите клиентов в будущем, может быть непонятно, почему они терпят неудачу, если все ответы сжимаются с помощью пользовательского сжатия.

Я не уверен, как ваши клиенты делают запросы, но большинство запросов HttpКонвейеры / Response позволяют подключаться к потоку ответов аналогично серверу.Перед отправкой ответа вашему средству визуализации проверьте свой собственный токен кодировки содержимого.Если он присутствует, запустите процедуру распаковки.Если нет, передайте ответ без изменений.

...