Mac (или C++) подключение к двоичному WCF

У меня есть служба WCF, размещенная с использованием TCP/IP (netTcpBinding):

var baseWcfAddress = getWcfBaseUri();
host = new ServiceHost(wcfSingleton, baseWcfAddress);

var throttlingBehavior = new System.ServiceModel.Description.ServiceThrottlingBehavior();
throttlingBehavior.MaxConcurrentCalls = Int32.MaxValue;
throttlingBehavior.MaxConcurrentInstances = Int32.MaxValue;
throttlingBehavior.MaxConcurrentSessions = Int32.MaxValue;
host.Description.Behaviors.Add(throttlingBehavior);

host.Open();

Я хотел бы написать клиент Mac на Objective C или C++. Существуют ли какие-либо классы, которые могут облегчить подключение к моей службе WCF? Если нет, каковы мои шаги и варианты, чтобы это произошло?

2 ответа

Решение

Каждая привязка начинается с net считается не совместимым. Даже чистый клиент.NET без WCF не может связываться со службой без огромных усилий, переопределяя весь двоичный протокол и кодировку. Вы, вероятно, должны начать с:

Ваш вариант для Mac - использовать Mono, который должен иметь поддержку netTcpBinding.

Ваш реальный вариант для Objective-C / C++ на Mac - это создание совместимого сервиса WCF, предоставляющего данные через HTTP. Если вы не являетесь владельцем сервиса, вы можете создать сервис маршрутизации WCF, который будет мостом между совместимым HTTP и netTCP.

Редактировать:

Еще одна вещь - если сервис использует netTcpBinding с настройками по умолчанию это обеспечивается безопасностью Windows. Я ожидаю, что это может быть еще одним шоу-стопором на Mac.

В контексте комментария:

netTcpBinding было обнаружено, что это один из более быстрых вариантов - безусловно, гораздо быстрее, чем пробная привязка vanilla BasicHttpBinding/WS. Это единственная реальная необходимость, так как netTcpBinding использовал двоичный код вместо простого текста, это было быстрее.

Во-первых, я смотрел на это много, много раз - и, как ни странно, каждый раз, когда я проверял это, NetTcpBinding совершенно не может быть быстрее, чем базовое предложение XML. Однако, поскольку ваша цель - производительность, у меня есть варианты...

Я немного пристрастен (так как я написал это), но я настоятельно рекомендую здесь "protobuf-net"; так как он разработан по тем же идиомам, что и большинство сериализаторов.NET, его легко заменить, но он быстрее (ЦП) и меньше (bandwitdh) в каждом тесте, который я делаю для этого - или тестах, которые делают другие люди. А поскольку формат protobuf является открытой спецификацией, вам не нужно беспокоиться о том, что привязки "Net" не являются совместимыми.

Для MS .NET у меня есть прямые перехватчики WCF, которые можно использовать исключительно из конфигурации, что делает его быстрым. Честно говоря, я не знаю, насколько хорошо это будет работать с аналогом Mono - я не пробовал. Это может сработать, но если нет, то другой вариант - просто byte[] или же Stream по сети и беспокоиться о (де) сериализации вручную.

Мой предпочтительный макет здесь - привязка basic-http с включенным MTOM, что дает вам простоту и переносимость простейшей привязки xml без дополнительных затрат base-64 для двоичных данных.

Другие вопросы по тегам