Передача наименьшего количества данных по сети с помощью WCF - PullRequest
1 голос
/ 28 августа 2009

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

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_IIndexer" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                    maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                    maxReceivedMessageSize="65536">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="None">
                        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                        <message clientCredentialType="Windows" />
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://mach1:9000/Indexer" binding="netTcpBinding"
                bindingConfiguration="NetTcpBinding_IIndexer" contract="in.IIndexer"
                name="NetTcpBinding_IIndexer" />
        </client>
    </system.serviceModel>
</configuration>

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

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

Ответы [ 4 ]

8 голосов
/ 28 августа 2009

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

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

  1. Zulfiqar Ahmed: Оптимизация размера сообщения SOAP: Кодировка против сжатия
  2. Кенни Вольф: Характеристики производительности кодировщиков WCF
  3. MSDN: Выбор кодировщика сообщений
2 голосов
/ 28 августа 2009

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

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

2 голосов
/ 28 августа 2009

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

0 голосов
/ 03 марта 2014
  1. Использовать сжатие .. В 4.5

      <binaryMessageEncoding compressionFormat="GZip"/>
    
      <tcpTransport maxReceivedMessageSize="20000000"/>
    </binding>
    

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

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

  4. Использовать EmitDefaultValue

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...