Вопрос по c#, wcf, .net – Передача наименьшего количества данных по сети с помощью WCF

1

В моем проекте есть служба netTCP WCF. Это app.config для этого:



    
        
            
                
                    
                    
                    
                        
                        
                    
                
            
        
        
            
        
    

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

Какие есть полезные советы и рекомендации для сжатия данных, отправляемых клиентом в службу WCF?

Ваш Ответ

4   ответа
2

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

Исходя из сложности поиска информации о сжатии WCF через TCP и о существовании функции сжатия вnoemax.com/products/wcfx/features.htmlЯ подозреваю, что вынам нужно написать код или приобрести сторонние возможности сжатия. John Fisher
Так вот где я запутался - у меня нетЯ не настраиваю сериализацию, яm либо передающие примитивы, либо массив пользовательского класса. Пользовательский класс неt наследует ISerializable и не помечается атрибутом [Serialized]. Все, что я сделал, это пометил все мои собственные классы публичные свойства с атрибутом [datamember]. Кроме этого, ничего не было сделано. Так что я неЯ действительно знаю, что у меня есть. :-( Matt
Ой. Затем вы'не реально контролировать то, чтос транспортированы. Вы можете посмотреть на элементы управления потоком WCF, чтобы увидеть, какое сжатие вы могли бы добавить (я не имеюсделал это). Или вы можете прекратить транспортировку реальных объектов и изменить свои контракты на транспортировку сжатых BLOB-объектов, которые преобразуются в или из реальных объектов. John Fisher
0

  <binarymessageencoding compressionformat="GZip">

  <tcptransport maxreceivedmessagesize="20000000">

</tcptransport></binarymessageencoding>

Не используйте пространства имен, установите для пространства имен значение "" (и в договоре на обслуживание.) [DataContract (Namespace = "" )] открытый класс AddDeckMessage

Редко (если когда-нибудь отправлять интерфейсы / базовые классы на XML) ... XML не понимает и добавляет Microsoft explcit XML. Не используйте knowntype, используйте простые DTO, которые вы можете настроить по проводам ...

Используйте EmitDefaultValue

Будьте осторожны с byte [] со сжатием без tcp. Если вы видите 123, вы видите 15-30 байтов для каждого байта в зависимости от кодировки. Используйте uuencode, если вам нужно использовать стандартные протоколы WS.

8

указанная привязкой, будет определять, как ваши данные будут преобразованы в байты в сети. Для NetTcpBinding он автоматически использует двоичное кодирование, которое дает вам наиболее компактное представление вашего сообщения из всех встроенных кодировщиков WCF.

Для получения дополнительной информации я бы порекомендовал эти ресурсы:

Зульфикар Ахмед:Оптимизация размера сообщения SOAP: кодировка против сжатияКенни Вольф:Характеристики производительности кодеров WCFMSDN:Выбор кодировщика сообщений
Это может быть самый компактный из встроенных кодировщиков WCF, но онс помощью TCP, и это неПо-видимому, поддерживает фактическое сжатие. John Fisher
Первая ссылка не работает :( Пожалуйста, исправьте это Iúri dos Anjos
2

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

Марк Гравелл, один из модераторов SO, является экспертом, которого яМы смотрели на этот вопрос. У него на самом деле есть схема сериализации под названием protobuf-net, которая доступна для использования.Вот.

Кривая обучения для этого крутая :-) Matt

Похожие вопросы