2011-02-14 82 views
2

我在Windows服务器上有一个WCF服务,我试图从MonoDevelopment中的iPhone应用程序调用该服务。 Web服务客户端使用Silverlight服务生成实用程序生成,并复制到MonoTouch环境中的iPhone开发项目中。从iPhone调用WCF服务的序列化问题MonoTouch应用程序

所以这项服务非常简单。我有一种方法调用GetCustomers()方法并返回List<Customer>。我可以在MonoTouch iPhone应用程序代码中成功创建客户端。该方法执行,如果我试图对结果进行计数,它告诉我有91条记录(Northwind数据库/ Customers表)。所以我相信这项服务工作得很好。

问题是,当我尝试访问我得到以下错误的客户对象的任何属性:

The CustomerName property does have public getter and setter

,但以下情况例外称,它不。我需要一些帮助,如果有人能够引导我通过我做错了什么!

 
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 

回答

0

不,服务不能正常工作。它看起来是一个异步方法,所以当你的第一次调用看起来是成功的,它可能不是真的,除非你关闭异步调用并获得返回值。结果的处理和计数可能非常成功,但结果的实际序列化(这需要客户类型同时具有setter和getter)不是。

这是WCF中少数几乎总是正确且非常具体的例外之一。你确定客户类型有一个getter和setter吗?他们的访问级别是否一致?

0

MonoTouch链接器将排除任何未在最终本机iOS二进制文件中使用的代码。在你的情况下,getter/setter可能不在你的项目中使用,所以没有进入本地版本。

要解决此问题,您可以使用MonoTouch.Foundation.Preserve属性修饰DataMember属性。或者,将保留属性粘贴到您的DataContract类上,并传入AllMembers = true,如下例所示。

[DataContract, 
MonoTouch.Foundation.Preserve(AllMembers=true)] 
public class EntityClass 
{ 
    [DataMember] 
    public string Field {get;set;} 
}