[json] Как включить сжатие gzip HTTP в динамическом контенте Windows Azure



Answers

Ну, по крайней мере, я не один на этом - и это все еще глупая PITA почти год спустя.

Проблема заключается в несоответствии типа MIME. WCF возвращает ответ JSON с Content-Type: application/json; charset=UTF-8 Content-Type: application/json; charset=UTF-8 . Конфигурация IIS по умолчанию , примерно на половину этой страницы, не включает это как сжимаемый тип MIME.

Теперь может возникнуть соблазн добавить раздел <httpCompression> в ваш web.config и добавить к нему приложение / json. Но это всего лишь плохой способ потратить хороший час или два - вы можете изменить только элемент <httpCompression> на уровне applicationHost.config.

Таким образом, существует два возможных решения. Во-первых, вы можете изменить свой ответ WCF, чтобы использовать тип MIME, который сжимается в конфигурации по умолчанию. text/json будет работать, поэтому добавление этого метода (ов) службы даст вам динамическое сжатие: WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";

Кроме того, вы можете изменить файл applicationHost.config с помощью appcmd и задачи запуска. Это обсуждается (между прочим) в этой теме . Обратите внимание: если вы добавите эту задачу запуска и запустите ее в dev-структуре, она будет работать один раз. Во второй раз это произойдет, потому что вы уже добавили элемент конфигурации. Я закончил создание второго проекта облака с отдельным файлом csdef, так что мой devfabric не запустил бы этот сценарий запуска. Однако есть и другие решения.

Обновить

Мое предложение по отдельным проектам в предыдущем абзаце на самом деле не очень хорошая идея. Не-идемпотентные задачи запуска - очень плохая идея, потому что когда-нибудь ткань Azure решит перезапустить ваши роли для вас, задача запуска не удастся, и она перейдет в цикл рециркуляции. Скорее всего, посреди ночи. Вместо этого сделайте свои задачи запуска idempotent, как описано в этом потоке SO .

Question

Я безуспешно пытаюсь включить gzip HTTP-сжатие в моем Windows Azure, поддерживающем службу WCF Restful, которая возвращает JSON только из запросов GET и POST.

Я пробовал так много вещей, что мне было бы трудно перечислять их все, и теперь я понимаю, что я работаю с противоречивой информацией (относительно старой версии лазурного и т. Д.), Поэтому лучше всего начинать с чистого листа!

Я работаю с Visual Studio 2008, используя инструменты февраля 2010 года для Visual Studio.

Итак, согласно следующей link ..

.. HTTP-сжатие теперь включено. Я использовал совет на следующей странице (только для консультаций по сжатию URL).

http://blog.smarx.com/posts/iis-compression-in-windows-azure

<urlCompression doStaticCompression="true" 
         doDynamicCompression="true"
         dynamicCompressionBeforeCache="true" 
/>

.. но я не получаю никакого сжатия. Это не помогает, что я не знаю, какая разница между urlCompression и httpCompression . Я пытался выяснить, но безрезультатно!

Может ли проблема, что инструменты для Visual Studio были выпущены до версии Azure, которая поддерживает сжатие, будет проблемой? Я где-то читал, что с помощью новейших инструментов вы можете выбрать, какую версию Azure OS вы хотите использовать при публикации ... но я не знаю, правда ли это, и если да, то я не могу найти, где выбирать. Могу ли я использовать версию с поддержкой до HTTP?

Я также попробовал модуль сжатия компрессионных http, но никаких результатов.

Есть ли у кого-нибудь какие-либо современные рекомендации о том, как достичь этого? т.е. рекомендации, относящиеся к текущей версии Azure OS.

Ура!

Стивен

Обновление: я редактировал приведенный выше код, чтобы исправить тип в фрагменте web.config.

Обновление 2: Тестирование ответов с использованием URL-адреса whatsmyip, показанного в ответе ниже, показывает, что мои ответы JSON от моего service.svc возвращаются без какого-либо сжатия, но статические HTML-страницы ARE возвращаются с сжатием gzip. Любые советы о том, как получить ответы JSON на компресс, будут с благодарностью получены!

Обновление 3: испробовал ответ JSON размером более 256 КБ, чтобы узнать, была ли проблема из-за того, что ответ JSON меньше, чем указано в комментариях ниже. К сожалению, ответ все еще не сжимается.




Эта статья из MS - это их сценарий для JSON http://msdn.microsoft.com/en-us/library/windowsazure/hh974418.aspx .

Он затрагивает многие из упомянутых проблем, например, способность обрабатывать рециркуляцию Azure и т. Д.




Да, вы можете выбрать нужную ОС, но по умолчанию вы получите последнюю.

Сжатие сложное. Есть много вещей, которые могут пойти не так. Вы случайно делаете это тестирование за прокси-сервером? Я считаю, что IIS по умолчанию не отправляет сжатый контент в прокси. Я нашел удобный инструмент, чтобы проверить, работает ли сжатие, когда я играл с этим: http://www.whatsmyip.org/http_compression/ .

Похоже, у вас есть doDynamicCompression = "false" ... это просто опечатка? Вы хотите, чтобы это было, если вы собираетесь получить сжатие в JSON, которое вы возвращаете из веб-службы.




Related