Оптимизация передачи пропускной способности WCF (уменьшение детализации)
В настоящее время мы используем WCF для передачи между нашими клиентами и серверами. Мы используем HttpTransportBinding с BinaryMessageEncoding. Внутренняя часть - это.NET, а внешняя - Xamarin (iOS, Android, Windows 10) и Silverlight. Мы рассматриваем разные варианты трансфера. Конечно, есть и REST, и Web Sockets, но мой вопрос касается сериализации, а не самого протокола. Я, однако, смотрю на все наши варианты снижения пропускной способности передачи.
Конечная цель - использовать двоичную сериализацию, которая передает только минимальные данные для корректной работы сериализации DataContract. Передача не должна быть удобочитаемой для человека, и именно поэтому мы не используем Json. Я открыт для рассмотрения других видов сериализации или других DataContractSerializer, которые будут выполнять эту работу, но сейчас я борюсь с тем, чтобы WCF отправлял по проводам больше данных, чем фактически необходимо. Если я посмотрю на данные в Fiddler, то увижу, что они отправляют пустые или пустые DataMembers, абсолютно неактуальные пространства имен XML и так далее.
Здесь вы можете видеть, что я пытался остановить DataContractSerializer от отправки этих вещей по проводам на уровне атрибутов, но DataContractSerializer игнорирует мои просьбы:
[DataMember(IsRequired = false)]
bool IsPrimaryKeyOnly { get; set; }
[DataMember(IsRequired = false)]
ErrorDictionary ErrorDetails { get; set; }
[DataMember(IsRequired =false)]
bool IgnoreWarnings { get; set; }
[System.Runtime.Serialization.DataContractAttribute(IsReference = true, Namespace = "")]
[System.SerializableAttribute()]
public class AssetClass : Adapt.Model.RecordBase, Adapt.Model.IRecord
{
}
Могу ли я что-нибудь сделать, чтобы DataContractSerializer выполнял мои запросы? Существует ли более эффективный DataContractSerializer, совместимый с Xamarin? Любые другие уловки, чтобы уменьшить многословие WCF? Я делаю что-то не так в том смысле, как я объявляю свои атрибуты, или я ошибаюсь, полагая, что сериализатор должен быть достаточно умным, чтобы не включать значения по умолчанию?
Что огорчает нас, так это то, что кроме этой проблемы, WCF является очень хорошей технологией, когда вы знаете, что все потребители этой службы будут основаны на Microsoft. На первый взгляд кажется, что Microsoft перестала заботиться о совершенствовании WCF и его последующих компонентов, таких как DataContractSerialization. Я бы предпочел не заменять технологию оптом. Я бы лучше решил проблему с многословием.
Пожалуйста, сохраняйте альтернативные технологические предложения только для комментариев.
1 ответ
Частичный ответ: https://bkiener.wordpress.com/2010/05/04/optimize-data-contracts-for-better-wcf-performance/
Одна вещь, которую можно сделать, - это уменьшить имена DataContracts и Properties, указав их Name в самом атрибуте. Таким образом, свойство с именем "ReallyLongPropertyNameThatEatsBandwidth" может иметь псевдоним "a". Я сделал несколько базовых тестов с этим, и один из наших вызовов снизился с 188k до 168k. Это все еще не объясняет весь другой мусор в передаче, но это помогает.