none
“WCF”服务,返回“实体集”数据报错 RRS feed

  • 问题

  • 调用“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;
            }

            public KeyValuePair<Period, string> Date
            {
                get; set;
            }

    }

    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”可以不用显示“定义契约”的,不是吗???

    问题三:要定义契约是不是“父类”和“子类”都要定义???

    问题四:还是因为“KeyValuePair” 和 枚举类型“EnergyType”的原因???


    Science and technology is my lover.


    2012年5月31日 9:10

答案

  • 1.关于上面NotFound错误,你可以在服务端启用WCF tracing来查看下到底是什么原因引起的.

    #enable WCF tracing.
    http://blogs.msdn.com/b/madhuponduru/archive/2006/05/18/601458.aspx

    2.当你使用.NET简单类型或自定义类型也是基于.NET简单类型,你可以使用Serializable属性,这些你就不须要显示定义DataContract了,其它的复杂类型(例如类中还包含有其它自定类型的属性时),这时我就要使用DataContract与DataMember来显示标记类与属性等。

    3.对,父类与子类最好都用DataContract定义为契约

    4.因为KeyValuePair类的Key与Value属性是只读的,且没有set访问器方法,对于XmlSerializer,它不会序列化只读属性,换句话说,如果属性没有set访问器是不可以被XmlSerializer序列化的,因些你须要自己定义一个KeyValuePair类。详细请好好看下下面几篇文章:

    http://blogs.msdn.com/b/seshadripv/archive/2005/11/02/488273.aspx
    http://codeissue.com/issues/i24e5e260bd4419/serialize-net-keyvaluepair-object


    5.关于ServiceKnownType,你可以将其应用在DataContract类也可以应用在OperationContract方法上。详细可以参考:http://blogs.msdn.com/b/sowmy/archive/2006/06/06/618877.aspx

    6.如果使用NetDataContractSerializer,你可以分别用DataContract或DataMember来标志类或属性,或者用[Serializable]标志类.http://msdn.microsoft.com/en-us/library/system.runtime.serialization.netdatacontractserializer.aspx


    Please mark the replies as answers if they help or unmark if not. If you have any feedback about my replies, please contact msdnmg@microsoft.com Microsoft One Code Framework


    2012年6月1日 6:17
    版主
  • 远程服务器返回了错误: NotFound。

    这个错误信息太少了,没遇到过就帮不上你的忙。

    你最好能把详细的异常贴出来,记住要查看有内部异常。

    Peter pi 说的Tracing是最好用的调试工具,它一定能发现问题。你可以在客户端和服务端都启用,但是不知道SliverLight支不支持这个。


    快乐在于能够长时间的为自己认为值得的事情努力工作,不管它是什么。

    2012年6月6日 5:03

全部回复

  • “方法一”是不是这样???

    方法一:
    [ServiceKnownType(typeof(MonitoringMonth))]
    [ServiceKnownType(typeof(MonitoringDay))]
    [ServiceKnownType(typeof(MonitoringYear))]
    public abstract class Monitoring
    {
    }


    还是:

    [OperationContract]
    [ServiceKnownType(typeof(MonitoringMonth))]
    [ServiceKnownType(typeof(MonitoringDay))]
    [ServiceKnownType(typeof(MonitoringYear))]
    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;
    }

    方法二:使用“NetDataContractSerializer类来实现序列化”,契约应该怎样定义???

    Science and technology is my lover.

    2012年5月31日 10:39
  • 1.关于上面NotFound错误,你可以在服务端启用WCF tracing来查看下到底是什么原因引起的.

    #enable WCF tracing.
    http://blogs.msdn.com/b/madhuponduru/archive/2006/05/18/601458.aspx

    2.当你使用.NET简单类型或自定义类型也是基于.NET简单类型,你可以使用Serializable属性,这些你就不须要显示定义DataContract了,其它的复杂类型(例如类中还包含有其它自定类型的属性时),这时我就要使用DataContract与DataMember来显示标记类与属性等。

    3.对,父类与子类最好都用DataContract定义为契约

    4.因为KeyValuePair类的Key与Value属性是只读的,且没有set访问器方法,对于XmlSerializer,它不会序列化只读属性,换句话说,如果属性没有set访问器是不可以被XmlSerializer序列化的,因些你须要自己定义一个KeyValuePair类。详细请好好看下下面几篇文章:

    http://blogs.msdn.com/b/seshadripv/archive/2005/11/02/488273.aspx
    http://codeissue.com/issues/i24e5e260bd4419/serialize-net-keyvaluepair-object


    5.关于ServiceKnownType,你可以将其应用在DataContract类也可以应用在OperationContract方法上。详细可以参考:http://blogs.msdn.com/b/sowmy/archive/2006/06/06/618877.aspx

    6.如果使用NetDataContractSerializer,你可以分别用DataContract或DataMember来标志类或属性,或者用[Serializable]标志类.http://msdn.microsoft.com/en-us/library/system.runtime.serialization.netdatacontractserializer.aspx


    Please mark the replies as answers if they help or unmark if not. If you have any feedback about my replies, please contact msdnmg@microsoft.com Microsoft One Code Framework


    2012年6月1日 6:17
    版主
  • 1.关于上面NotFound错误,你可以在服务端启用WCF tracing来查看下到底是什么原因引起的.

    #enable WCF tracing.
    http://blogs.msdn.com/b/madhuponduru/archive/2006/05/18/601458.aspx

    2.当你使用.NET简单类型或自定义类型也是基于.NET简单类型,你可以使用Serializable属性,这些你就不须要显示定义DataContract了,其它的复杂类型(例如类中还包含有其它自定类型的属性时),这时我就要使用DataContract与DataMember来显示标记类与属性等。

    3.对,父类与子类最好都用DataContract定义为契约

    4.KeyValuePair默认不能被序列化,你须要自定义一个KeyValuePair并将其标志为[Serializable]

    5.关于ServiceKnownType,你可以将其应用在DataContract类也可以应用在OperationContract方法上。详细可以参考:http://blogs.msdn.com/b/sowmy/archive/2006/06/06/618877.aspx

    6.如果使用NetDataContractSerializer,你可以分别用DataContract或DataMember来标志类或属性,或者用[Serializable]标志类.http://msdn.microsoft.com/en-us/library/system.runtime.serialization.netdatacontractserializer.aspx


    Please mark the replies as answers if they help or unmark if not. If you have any feedback about my replies, please contact msdnmg@microsoft.com Microsoft One Code Framework

    Thanks  a  lot...

          “4、KeyValuePair默认不能被序列化,你须要自定义一个KeyValuePair并将其标志为[Serializable]”

           应该怎样自定义呢???       

          实体对象属性如下:

          public KeyValuePair<Period, string> Date
            {
                get; set;
            }

           

             服务接口方法:

           public List<Monitoring> GetMonitoringEntityData(Monitoring.EnergyType energytype, KeyValuePair<Monitoring.Period, string> monitordate, KeyValuePair<Monitoring.MonitorType, string> monitortype, string meterusetype, bool issubstation)

           

    Science and technology is my lover.

    2012年6月6日 2:48
  • 远程服务器返回了错误: NotFound。

    这个错误信息太少了,没遇到过就帮不上你的忙。

    你最好能把详细的异常贴出来,记住要查看有内部异常。

    Peter pi 说的Tracing是最好用的调试工具,它一定能发现问题。你可以在客户端和服务端都启用,但是不知道SliverLight支不支持这个。


    快乐在于能够长时间的为自己认为值得的事情努力工作,不管它是什么。

    2012年6月6日 5:03