Проблемы с сериализацией при вызове службы WCF из приложения iPhone MonoTouch - PullRequest
2 голосов
/ 14 февраля 2011

У меня есть служба WCF на Windows Server, и я пытаюсь вызвать службу из приложения iPhone в MonoDevelopment. Клиент веб-сервиса был сгенерирован с использованием утилиты генерации сервиса Silverlight и скопирован в проект разработки iPhone в среде MonoTouch.

Так что обслуживание довольно простое. У меня есть метод, который вызывает GetCustomers() методы и возвращает List<Customer>. Я могу успешно создать клиента в коде приложения MonoTouch для iPhone. Этот метод выполняется, и если я пытаюсь подсчитать результат, он сообщает, что существует 91 запись (база данных Northwind / таблица Customers). Поэтому я уверен, что сервис работает просто отлично.

Проблема в том, что когда я пытаюсь получить доступ к любому свойству объекта Customer, я получаю следующую ошибку:

Свойство CustomerName имеет общедоступные методы получения и установки

но следующее исключение говорит, что это не так. Мне нужна помощь, если кто-то может объяснить мне, что я делаю неправильно!

Exception in async operation: System.Runtime.Serialization.InvalidDataContractException: DataMember property 'System.String CustomerName' on type 'NorthwindService.Customer' must have both getter and setter.
  at System.Runtime.Serialization.SharedContractMap.GetMembers (System.Type type, System.Xml.XmlQualifiedName qname, Boolean declared_only) [0x00116] in /Developer/MonoTouch/Source/mono/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/SerializationMap.cs:553 
  at System.Runtime.Serialization.SharedContractMap.Initialize () [0x00053] in /Developer/MonoTouch/Source/mono/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/SerializationMap.cs:516 
  at System.Runtime.Serialization.KnownTypeCollection.RegisterContract (System.Type type) [0x0004f] in /Developer/MonoTouch/Source/mono/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/KnownTypeCollection.cs:766 
  at System.Runtime.Serialization.KnownTypeCollection.TryRegister (System.Type type) [0x0002a] in /Developer/MonoTouch/Source/mono/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/KnownTypeCollection.cs:593 
  at System.Runtime.Serialization.KnownTypeCollection.RegisterCollection (System.Type type) [0x0000f] in /Developer/MonoTouch/Source/mono/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/KnownTypeCollection.cs:666 
  at System.Runtime.Serialization.KnownTypeCollection.TryRegister (System.Type type) [0x00062] in /Developer/MonoTouch/Source/mono/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/KnownTypeCollection.cs:605 
  at System.Runtime.Serialization.KnownTypeCollection.InsertItem (Int32 index, System.Type type) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/KnownTypeCollection.cs:389 
  at System.Collections.ObjectModel.Collection`1[T].Add (.T item) [0x0000c] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Collections.ObjectModel/Collection.cs:72 
  at System.Runtime.Serialization.DataContractSerializer.ReadObject (System.Xml.XmlDictionaryReader reader, Boolean verifyObjectName) [0x0000c] in /Developer/MonoTouch/Source/mono/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/DataContractSerializer.cs:267 
  at System.Runtime.Serialization.XmlObjectSerializer.ReadObject (System.Xml.XmlDictionaryReader reader) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/XmlObjectSerializer.cs:74 
  at System.ServiceModel.Dispatcher.DataContractMessagesFormatter.MessageToParts (System.ServiceModel.Description.MessageDescription md, System.ServiceModel.Channels.Message message) [0x000b8] in /Developer/MonoTouch/Source/mono/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/BaseMessagesFormatter.cs:364 
  at System.ServiceModel.Dispatcher.BaseMessagesFormatter.DeserializeReply (System.ServiceModel.Channels.Message message, System.Object[] parameters) [0x00043] in /Developer/MonoTouch/Source/mono/mcs/class/System.ServiceModel/System.ServiceModel.Dispatcher/BaseMessagesFormatter.cs:175 
  at System.ServiceModel.ClientRuntimeChannel.Request (System.ServiceModel.Description.OperationDescription od, System.Object[] parameters) [0x0016a] in /Developer/MonoTouch/Source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ClientRuntimeChannel.cs:500 
  at System.ServiceModel.ClientRuntimeChannel.DoProcess (System.Reflection.MethodBase method, System.String operationName, System.Object[] parameters) [0x00038] in /Developer/MonoTouch/Source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ClientRuntimeChannel.cs:443 
  at System.ServiceModel.ClientRuntimeChannel.Process (System.Reflection.MethodBase method, System.String operationName, System.Object[] parameters) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/System.ServiceModel/System.ServiceModel/ClientRuntimeChannel.cs:425 

Ответы [ 2 ]

0 голосов
/ 18 мая 2011

Компоновщик MonoTouch исключит любой код, который не используется из окончательных собственных двоичных файлов iOS.В вашем случае, getter / setter, вероятно, не используется в вашем проекте и поэтому не попадает в собственную версию.

Чтобы исправить это, вы можете украсить свои свойства DataMember с помощью MonoTouch.Foundation.Preserve.приписывать.Или прикрепите атрибут Preserve к классу, который является вашим DataContract, и передайте AllMembers = true, как показано в примере ниже.

[DataContract,
MonoTouch.Foundation.Preserve(AllMembers=true)]
public class EntityClass
{
    [DataMember]
    public string Field {get;set;}
}
0 голосов
/ 31 марта 2011

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

Это одно из немногих исключений в WCF, которое почти всегда верно и очень специфично. Вы уверены, что тип Customer имеет как геттер, так и сеттер? Соответствуют ли их уровни доступа?

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