Почему мой WCF-сервер возвращает пустые ответы, используя protobuf-net? - PullRequest
1 голос
/ 22 октября 2009

Я обновил существующее приложение WCF, чтобы добавить поддержку protobuf-net. По сути, я:

  • добавлен protobuf-net.dll (.net 3.0) в качестве ссылки в сборке, содержащей все мои объекты данных. На эту сборку ссылаются как мой сервер, так и мой клиент

  • заменено [DataMember] на [DataMember (Order = x)] (с использованием увеличивающихся целых чисел как x)

  • Обновлены все мои OperationContracts с атрибутом ProtoBehavior

  • Обновлен мой сервисный номер

С клиента я вызываю этот метод на сервере:

[OperationContract(IsOneWay = false), ProtoBehavior]
ConnectionData Join(string userId, string Password);

, где ConnectionData определяется следующим образом:

[DataContract]
public class ConnectionData
{
    [DataMember(Order = 1)]
    public ConnectionStatusEnum ConnectionStatus; // this is a normal enum with five elements

    // .....

    [DataMember(Order = 5)]
    public bool MustChangePassword;
}

Теперь вот что происходит:

  • Если я отлаживаю сервер, я вижу, что объект ConnectionData правильно инициализирован и возвращен в методе Join

  • Если я отлаживаю клиента, я вижу нулевой объект, возвращаемый из моего вызова Join

  • Я включил трассировку WCF до максимальной детализации, в журнале сервера ничего не бросалось в глаза, но в файле журнала клиента я видел это предупреждение:

System.Runtime.Serialization.ElementIgnored
Нераспознанный элемент был встречаются в XML во время десериализация, которая была проигнорирована.
Элемент http://tempuri.org/:proto

Я понюхал свой сетевой трафик и не виню protobuf-net за неспособность десериализовать это:

<s:Body><JoinResponse xmlns="http://tempuri.org/"><proto/></JoinResponse></s:Body>

Как я могу дополнительно устранить проблему и получить protobuf-net для правильной сериализации моих сообщений?


Я использую protobuf-net r275

Ответы [ 2 ]

0 голосов
/ 11 ноября 2009

Я проделал дополнительную работу в этой области, и я подозреваю проблема в том, что у вас есть сервисная ссылка (либо через IDE, либо через svcutil), которая , хотя он повторно использует совместно используемые контракты данных, вызывает дублирование интерфейса контракта (и теряет атрибут поведения, что приводит к его нарушению).

Параметры:

  • не использовать сервисную ссылку (использовать канал напрямую или подкласс ClientBase<T>)
  • использовать новые опции конфигурации конечной точки
  • взломать сгенерированный интерфейс для включения поведения (создает проблемы с обслуживанием)

Если вы не знакомы с ними, я планирую написать запись в блоге для первого варианта в ближайшие пару дней.

0 голосов
/ 23 октября 2009

Извините за задержку - рабочее время и т. Д. Знают ли оба конца об этом изменении? К сожалению, интеграция WCF не очень хорошо работает с прокси-серверами, сгенерированными "mex", но работает нормально с совместным использованием сборок.

В качестве альтернативы, в настоящее время выполняется некоторая работа по использованию поведения конечной точки, которое может быть указано в конфигурации; это не 100%, но должно быть очень скоро - и позволяет WCF прозрачно использовать protobuf-net без посредников в контракте на обслуживание (хотя участникам все равно нужно знать об этом, либо через [ProtoMember(n)] и т. д., либо [DataMember(Order=n)].

...