Вообще считается, что есть 3 способа сжатия WCF трафика. Вот перевод источника:
- На транспортном уровне, используя message encoder, который сжимает все данные проходящие через канал. Есть пример такого подхода в WCF SDK, [SDK Folder]TechnologySamples/Extensibility/MessageEncoder/Compression
- На уровне сообщений, добавляя определенные метаданные к SOAP-сообщению и сжимая тело этого сообщения. Можно использовать специфический WCF binding или MessageInspector Behavior чтобы модифицировать тело сообщения. Вот пример такого подхода: WS-Compression for WCF.
- Только для транспорта на протоколе Http (не наш случай) можно использовать поддержку сжатия самого протокола.
Ну и конечно не следует забывать про оптимизацию на уровне приложения а не на уровне WCF. Сами классы DataSet и DataTable довольно-таки тяжеловесные, хотя не могу сказать относится ли это к сериализации для передачи через WCF. Где-то попадалось, что для оптимизации сериализации датасетов нужно задать пару свойств:
ds.SchemaSerializationMode = SchemaSerializationMode.ExcludeSchema;
ds.RemotingFormat = SerializationFormat.Binary;