我有以下网络服务:
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyTestClass
{
[OperationContract]
public List<TrackInfo> GetAll(string songName)
{
return new List<tracksInfo>;
}
}
我的目的很简单。 Anyhows,当TrackInfo在服务引用之外的类中声明时,另一端的服务(意味着在silverlight区域中)仅识别TrackInfo类,但无法找到GetAll方法。当我尝试将trackinfo类放在引用内但在MyTestClass之外时,会出现同样的问题
我尝试将trackinfo类放在serivce中作为datacontract:
[DataContract]
public class TrackInfo
{
public int ID { get; set; }
//Should consider using a stream instead
public List<Image> FullSizeNotes { get; set; }
public Image TrackNotes { get; set; }
public Stream MidiFile { get; set; }
}
现在服务识别GetAll函数,但不识别trackinfo的属性。
答案 0 :(得分:1)
数据合同是一种“选择加入”技术,与ASMX服务中的XML Serializer不同。除非你另有说明,否则那个序列化所有公共字段和公共读/写属性。
数据合同需要使用[DataMember]属性对要序列化的属性进行修饰。
[DataContract]
public class TrackInfo
{
[DataMember]
public int ID { get; set; }
//Should consider using a stream instead
[DataMember]
public List<Image> FullSizeNotes { get; set; }
[DataMember]
public Image TrackNotes { get; set; }
[DataMember]
public Stream MidiFile { get; set; }
}
答案 1 :(得分:0)
另一种适用于.NET 3.5 SP1的方法是将您的实体外部化,这样您就不必编写它们了。请务必阅读完整图片的评论:
基本上,您在客户端和服务器之间共享类文件代码,并在设置服务引用时,告诉VS重用客户端上已存在的类型。
皮特