Варианты сжатия XML-документов ASP.NET 3.5, возвращаемых из WebMethods - PullRequest
2 голосов
/ 04 октября 2011

Я унаследовал веб-приложение ASP.NET (.net 3.5) и соответствующие клиентские компоненты C # и связанный клиент javascript.

Компоненты на стороне сервера используют сериализацию по умолчанию [WebMethod], и, учитывая размер некоторых наших XML-документов (и многословность имен элементов), мне любопытно узнать, как уменьшить размер возвращаемых документов. ,

Я открыт для двоичного XML, настраиваемой сериализации XML (например, меняю ThisVeryLongElementNameWhichShowsUpALot на что-то более короткое), простого сжатия, перемещения в JSON и т. Д. У нас есть довольно значительное количество отдельных WebMethods и различных объектов, возвращаемых, идеальное решение будет включать как можно меньшее изменение по обе стороны уравнения.

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

Может ли кто-нибудь указать мне соответствующую документацию или параметры IIS / VS.NET для настройки, чтобы изучить эти компромиссы?

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Я недавно протестировал сжатие IIS и был доволен результатами, после того, как выяснил, как установить уровень сжатия. Конечным результатом был результат JSON размером 196 КБ, сжатый до 13,6 КБ.

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

Кроме того, я бы определенно посоветовал попробовать JSON поверх XML, поскольку он дает гораздо более компактный результат. У меня нет конкретных цифр, но, насколько я помню, JSON был примерно на 50% меньше XMl.


При необходимости установить динамическое сжатие

Windows 7:

  1. Откройте консоль «Программы и компоненты», выбрав «Пуск»> «Панель управления»> «Программы и компоненты».
  2. Нажмите «Включить или отключить функции Windows».
  3. В диалоговом окне разверните Информационные службы Интернета> Службы всемирной паутины> Функции производительности и включите динамическое сжатие содержимого.
  4. Нажмите Ok.

Windows Server 2008:

  1. Откройте консоль диспетчера сервера, выбрав «Пуск»> «Все программы»> «Администрирование»> «Диспетчер сервера».
  2. В древовидном представлении диспетчера серверов разверните узел Роли и щелкните Веб-сервер (IIS).
  3. В главном окне прокрутите вниз до панели «Службы ролей» и нажмите «Добавить службы ролей».
  4. В диалоговом окне «Выбор служб ролей» щелкните и включите веб-сервер (установлен)> производительность (установлен)> сжатие динамического содержимого.
  5. Нажмите Далее.
  6. На экране «Подтверждение выбора при установке» нажмите «Установить».

Включить динамическое сжатие в IIS

  1. В приложении управления IIS выберите сервер, а в группе компонентов IIS дважды щелкните «Сжатие».
  2. Установите флажок «Включить динамическое сжатие содержимого».

Включить для "application / json" и "application / xml"

  1. Найдите файл applicationHost.config в каталоге c: \ Windows \ System32 \ inetserv \ config
  2. отредактируйте его и найдите элемент httpCompression.
  3. Под <dynamicTypes> добавить следующие элементы:
<add mimeType="application/json" enabled="true" />
<add mimeType="application/xml" enabled="true" />

Перезагрузите IIS.

Чтобы проверить, войдите в Fiddler и убедитесь, что кнопка «Декодировать» не выбрана (кнопка «Декодировать» должна быть на главной панели инструментов). Вы должны увидеть, что заголовок ответа «Content-Encoding» показывает «gzip», и что ответ сжат:

enter image description here

Расширенные настройки

Установите уровень сжатия с помощью следующей команды (уровень по умолчанию 0):

C:\Windows\System32\Inetsrv\Appcmd.exe 
    set config -section:httpCompression
    -[name='gzip'].staticCompressionLevel:9
    -[name='gzip'].dynamicCompressionLevel:4

Дополнительные сведения см. На этих сайтах:

Максимальное использование сжатия IIS. Часть 1. Настройка IIS 7

IIS 7 Сжатие. Хорошо? Плохой? Сколько стоит

Мое первоначальное тестирование ответа json:

None:          196,416 bytes
Level 0:        35,234
Level 1:        29,219
Level 4:        18,461
Level 9:        13,638
1 голос
/ 04 октября 2011

Вы можете украшать свои классы, свойства и методы атрибутами, которые сообщают ASPNET, как сериализовать. У вас есть несколько вариантов создания «меньшего» XML:

  • для свойств с VeryLongNames, используйте атрибут [XmlElement] и укажите альтернативное, более короткое имя. Подойдет любое короткое имя элемента, просто убедитесь, что оно уникально. Имейте в виду, что это снижает читабельность. XML предназначен для чтения человеком, чтобы с ним было легко работать. <StudentUserId>19820</StudentUserId> имеет четкое значение, а <u>19820</u> - нет.

  • если вы не возражаете против перехода на смешанную модель, вы можете сериализовать некоторые простые величины как атрибуты, а не элементы. Например, для простого целочисленного значения 42 текст для сериализации в качестве атрибута равен PropName='42', а текст для сериализации в качестве элемента - <PropName>42</PropName>. Таким образом, вы можете сократить размер почти вдвое, независимо от длины имени. Некоторые люди категорически против сериализации в атрибуты XML. Я никогда не понимал, почему это было verboten, поэтому я думаю, что это хороший подход для сжатия XML.

  • Существует несколько вариантов сериализации массивов в XML. Используйте XmlArrayItem, чтобы создать меньшую форму для массивов. см. эту статью MSDN для получения дополнительной информации .

Помимо использования атрибутов, есть некоторые другие вещи, которые вы можете рассмотреть ....

  • проверьте ваши XML-сообщения, чтобы убедиться, что вы сериализуете только то, что вам нужно, и что сериализованное не сериализуется неэффективным образом. Например, если вы передаете двоичное изображение размером 32 КБ, может быть лучше передать URL-адрес HTTP и позволить приложению выполнить дополнительный запрос для получения изображения, а не упаковать изображение в конверт XML. Или используйте MTOM вместо сериализации XML.

  • рассмотрите возможность оптимизации некоторых ваших сообщений. Вам всегда нужно сериализовать все? Не могли бы вы параметризировать свои веб-методы, чтобы звонящий мог запросить более или менее подробную информацию по каждому ответу?

  • Эффективно ли вы используете пространства имен XML? Не используйте несколько пространств имен без причины. Это только раздувает размер и сложность сообщений. С другой стороны, если у вас есть веские причины для использования нескольких пространств имен xml, не отказывайтесь от этих причин, чтобы сэкономить место.

  • подумайте, стоит ли тратить время и силы на оптимизацию размера полезной нагрузки XML. Какова реальная отдача? Если вы потратите 4 недели на оптимизацию и тестирование, чтобы получить пропускную способность 4%, стоит ли это того? Можете ли вы добиться большего успеха, просто уменьшив масштаб или оптимизировав схему сети?

...