Сериализация IDictionaryв WCF - PullRequest
0 голосов
/ 19 ноября 2010

У нас есть приложение, для которого один из наших объектов DTO имеет свойство, типизированное как IDictionary<string, object>.

Я сейчас пытаюсь выставить этот объект через службу WCF.Это работает в некоторых случаях, но не в общем случае.Чтобы продемонстрировать проблему, рассмотрим следующие два метода:

[OperationContract]
public IDictionary<string, object> Test1()
{
    return new Dictionary<string, object>
    {
        { "testkey1", "newstringvalue"},
    };
}

[OperationContract]
public IDictionary<string, object> Test2()
{
    return new Dictionary<string, object>
    {
        { "testkey1", "newstringvalue"},
        { "testkey2", new object [] { "one" , "two", "three", } }
    };
}

Метод Test1 () работает как положено, но когда я вызываю Test2 (), я получаю странную ошибку времени выполнения на клиенте:

Истекло время ожидания канала запроса в ожидании ответа после 00:01:00.Увеличьте значение тайм-аута, передаваемое вызову Request, или увеличьте значение SendTimeout в Binding.Время, отведенное для этой операции, могло быть частью более длительного времени ожидания.

Внутреннее исключение: удаленный сервер возвратил ошибку: (504) Время ожидания шлюза.

Это несмотря натот факт, что исключение было брошено мгновенно, т.е.На самом деле мне не пришлось ждать ни минуты для этого ответа.На сервере не отображается никаких ошибок.

Я подозреваю, что это связано с тем, что сериализатор не может сериализовать объект [], но это не то, что указано в ошибке.

Итакмои вопросы:

  1. Что здесь происходит?
  2. Как мне обойти это, чтобы я мог правильно сериализовать свои объекты?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 ноября 2010

Поскольку ни я, ни кто-либо из моих коллег не могли придумать способ заставить эту сериализацию работать напрямую, мы в конце концов обошли проблему, обернув наш объект в пользовательский объект, который преобразует Dictionary<string, object> в Dictionary<string, string>, который имеет специальный случай сериализации, определенный для строковых массивов. Затем мы изменили приложение, чтобы знать об этом. Не особенно элегантно, но достаточно просто и, кажется, работает.

0 голосов
/ 19 ноября 2010

Я думаю, вам нужно добавить объект [] к известным типам с помощью KnownTypeAttribute, чтобы второй вариант работал, поскольку именно это вы помещаете в словарь.

В любом случае, чтобы увидеть реальную ошибку на сервере, вам нужно включить трассировку WCF (или запустить отладчик в режиме, в котором он останавливается на каждом исключении, даже если оно перехвачено)

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