“WCF”服务,返回“实体集”数据报错
调用“WCF”服务,生成实体集,这两步是没有问题的。但是,返回“实体集”数据时报错,错误信息如下:
public System.Collections.ObjectModel.ObservableCollection<MyCharts.MyChartsService.Monitoring> EndGetMonitoringDatasEntity(System.IAsyncResult result) {
object[] _args = new object[0];
System.Collections.ObjectModel.ObservableCollection<MyCharts.MyChartsService.Monitoring> _result = ((System.Collections.ObjectModel.ObservableCollection<MyCharts.MyChartsService.Monitoring>)(base.EndInvoke("GetMonitoringDatasEntity", _args, result)));
return _result;
}
远程服务器返回了错误: NotFound。
1、服务方法:
[OperationContract]
public List<Monitoring> GetMonitoringDatasEntity(string energytype, string monitordate_type, string monitordate_value, string monitortype_type,string monitortype_value, string meterusetype, bool issubstation)
{
var datas = new Mycems.BLL.MonitoringResult().GetMonitoringDatas(energytype, monitordate_type, monitordate_value, monitortype_type, monitortype_value, meterusetype, issubstation);
return datas;
}
断点显示:“datas”集合是有数据的。
2、实体类“Monitoring”,其中有一个抽象方法。
public abstract class Monitoring
{
#region 检索条件
public EnergyType Type
{
get; set;
}
public abstract double[] Datas
{
get;
}
}
3、子类,实现了“Datas”抽象方法
public class MonitoringYear : Monitoring
{
public override double[] Datas
{
get
{
return new [] { M01, M02, M03, M04, M05, M06, M07, M08, M09, M10, M11, M12 };
}
}
}
问题一:是因为使用“抽象方法”的原因吗??? 这样的问题应该怎样解决???
问题二:还是因为没有显示的定义“契约”??? “WCF 4.0”可以不用显示“定义契约”的,不是吗???
问题三:要定义契约是不是“父类”和“子类”都要定义???
------解决方案--------------------结贴率0,有点担心!
------解决方案--------------------
Monitoring是抽象类啊,抽象类是不能实例化的,客户端接收到数据库,需要对数据进行反序列化,而反序列化的过程本身是先实例化一个类的对象,然后填充该对象的所有属性,既然是抽象类,实例化就做不到,它也不知道你接收的是什么派生类。
方法一:你可以在服务接口上添加[ServiceKnownType(typeof(MonitoringYear))]
方法二:使用NetDataContractSerializer类来实现序列化,替代默认的DataContractSerializer
------解决方案--------------------Why??
我不是说了嘛,它不知道你接收的是什么派生类,所以你需要告诉它,就通过那个ServiceKnownType
------解决方案--------------------
http://theburningmonk.com/2010/08/wcf-using-the-netdatacontractserializer-to-share-your-type/
看不懂英文的话,就无视介绍,直接看代码部分,他定义了UseNetDataContractSerializerAttribute类,这样就可以使用[UseNetDataContractSerializer]修饰你的远程方法了,只要添加了[UseNetDataContractSerializer]特性的方法,都使用了那个NetDataContractSerializer进行序列化。