日期:2014-05-18  浏览次数:21107 次

“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进行序列化。