none
在客户端返回的数组中没有元素 RRS feed

  • 问题

  • 服务端的方法返回IList<T>,那么在客户端返回的是数组。
    可客户端返回的数组中却没有元素。
    服务端的方法是正确的,我直接调用服务端的DLL文件测试过了。可以返回数据。没有问题。
    可是客户端的方法在编译和运行时不报出错误,但返回的数组就是没有元素。
    这是为什么啊?
    做最好的自己
    2009年5月24日 7:37

答案

  • 你好,

    从你的描述来看,你是通过看GridView显示的数据来判断是否返回数据有值的。一般来说这不是一个好方法。由于GridView在页面生命周期中可能发生变化(比如在Page_PreRender里又被清空了)或者由于其他的显示问题(Visible=false等等)可能得到数据而你在页面上却看不到东西。这样是不能判断出是否有数据返回的。请按照下面的方法调试:

    在这里设置一个断点,检查lwArray 和lwList:
    this.GridView1.DataSource = lwList;

    看看是否有数据。

    如果没有的话请在服务器端的GetLeaveWordInfos方法中设置断点进行调试。
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2009年5月25日 7:22
    版主
  • Hi,
     LeaveWordInfo[] lwArray = proxy.GetLeaveWordInfos(3, 1);       //   加个断点,看看到底有没有数据,确保lwArray 里返回数据。
    List<LeaveWordInfo> lwList = new List<LeaveWordInfo>();
    lwList = lwArray.ToList<LeaveWordInfo>();//这个转换会不会成功?检查一下~

          步骤,确保每部分都能找到数据。缩小问题的查找范围。如果不行的话,我们继续讨论~
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月25日 9:16
    版主
  • 首先感谢Allen Chen和Frank Xu Lei的帮助。
    经过昨天晚上的琢磨,终于把问题解决了。

    是数据契约名称空间的问题。

    因为我的两个解决方案里的Model的数据契约只是使用了DataContract特性,并没有指定 名称空间,而我的两个Model的名称空间又不同,所以根据名称空间的默认生成方式:
    “ http://schemas.datacontract.org/2004/07/+该数据契约所在的名称空间”
    我的两个数据契约的名称空间是不同的。

    具有不同名称空间的两个数据契约是非等效的,也就不允许互换。

    特此,列一下等效的数据契约的条件:
    (1)数据契约的名称、名称空间相同
    (2)数据契约成员的名称、类型相同
    (3)数据契约成员的序列化顺序相同

    做最好的自己
    2009年5月26日 2:15

全部回复

  • 把服务操作的实现代码贴一下,还有就是你确保你的返回的结果集有数据。~
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月24日 13:20
    版主
  • 把服务操作的实现代码贴一下,还有就是你确保你的返回的结果集有数据。~
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl

    我特定做了一个测试,是可以返回结果的
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月24日 14:40
    版主
  • 我也做了一个简单的测试,也可以返回结果。
    这个错误出现在我正在做的个人网站里,要把代码全都复制上来就太多了。
    所以我挑了一些你可能需要的代码,如果你还想看什么地方的代码我可以给你贴上来。
            protected void Page_Load(object sender, EventArgs e)
            {
                CN.LanPei.iZone.iZoneClient.ServiceProxy.LeaveWordServiceProxy proxy =
                    new CN.LanPei.iZone.iZoneClient.ServiceProxy.LeaveWordServiceProxy("LeaveWordEndPoint");

                LeaveWordInfo[] lwArray = proxy.GetLeaveWordInfos(3, 1);

                List<LeaveWordInfo> lwList = new List<LeaveWordInfo>();
                lwList = lwArray.ToList<LeaveWordInfo>();

                this.GridView1.DataSource = lwList;
                this.GridView1.DataBind();
            }

            protected void Button1_Click(object sender, EventArgs e)
            {
                CN.LanPei.iZone.iZoneClient.ServiceProxy.LeaveWordServiceProxy proxy =
                    new CN.LanPei.iZone.iZoneClient.ServiceProxy.LeaveWordServiceProxy();
                Response.Write(proxy.Test(123.5,333));
            }
    这是我解决方案里的测试客户端的代码,这个页面上有一个Button和一个GridView,Button单击后可以正常执行。而GridView却不能返回数据。
    Button能够正常执行应该说明服务地址是正确的吧,而且配置也没有问题吧。
    服务实现类的代码是没有问题的,因为我用服务的实现类的代码测试了一下,是可以返回数据,并在GridView上显示的。
    我的服务和客户端是放在两个解决方案里的,为的是模仿现实中的开发情况。

    服务的契约为:
            /// <summary>
            /// 获取留言信息
            /// </summary>
            /// <param name="pageSize"></param>
            /// <param name="pageNumber"></param>
            /// <returns></returns>
            [OperationContract]
            IList<LeaveWordInfo> GetLeaveWordInfos(int pageSize, int pageNumber);

    服务的实现为:
            /// <summary>
            /// 获取留言信息
            /// </summary>
            /// <param name="pageSize"></param>
            /// <param name="pageNumber"></param>
            /// <returns></returns>
            public IList<LeaveWordInfo> GetLeaveWordInfos(int pageSize, int pageNumber)
            {
                return leaveWordBll.GetLeaveWordInfos(pageSize, pageNumber);
            }

    客户端的契约为:
            /// <summary>
            /// 获取留言信息
            /// </summary>
            /// <param name="pageSize"></param>
            /// <param name="pageNumber"></param>
            /// <returns></returns>
            [OperationContract]
            LeaveWordInfo[] GetLeaveWordInfos(int pageSize, int pageNumber);
    客户端的实现为:
            /// <summary>
            /// 获取留言信息
            /// </summary>
            /// <param name="pageSize"></param>
            /// <param name="pageNumber"></param>
            /// <returns></returns>
            public LeaveWordInfo[] GetLeaveWordInfos(int pageSize, int pageNumber)
            {
                return base.Channel.GetLeaveWordInfos(pageSize, pageNumber);
            }


    做最好的自己
    2009年5月25日 1:53
  • 你好,

    从你的描述来看,你是通过看GridView显示的数据来判断是否返回数据有值的。一般来说这不是一个好方法。由于GridView在页面生命周期中可能发生变化(比如在Page_PreRender里又被清空了)或者由于其他的显示问题(Visible=false等等)可能得到数据而你在页面上却看不到东西。这样是不能判断出是否有数据返回的。请按照下面的方法调试:

    在这里设置一个断点,检查lwArray 和lwList:
    this.GridView1.DataSource = lwList;

    看看是否有数据。

    如果没有的话请在服务器端的GetLeaveWordInfos方法中设置断点进行调试。
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2009年5月25日 7:22
    版主
  • Hi,
     LeaveWordInfo[] lwArray = proxy.GetLeaveWordInfos(3, 1);       //   加个断点,看看到底有没有数据,确保lwArray 里返回数据。
    List<LeaveWordInfo> lwList = new List<LeaveWordInfo>();
    lwList = lwArray.ToList<LeaveWordInfo>();//这个转换会不会成功?检查一下~

          步骤,确保每部分都能找到数据。缩小问题的查找范围。如果不行的话,我们继续讨论~
    you have a dream,you gonna protect it! http://www.cnblogs.com/frank_xl
    2009年5月25日 9:16
    版主
  • 首先感谢Allen Chen和Frank Xu Lei的帮助。
    经过昨天晚上的琢磨,终于把问题解决了。

    是数据契约名称空间的问题。

    因为我的两个解决方案里的Model的数据契约只是使用了DataContract特性,并没有指定 名称空间,而我的两个Model的名称空间又不同,所以根据名称空间的默认生成方式:
    “ http://schemas.datacontract.org/2004/07/+该数据契约所在的名称空间”
    我的两个数据契约的名称空间是不同的。

    具有不同名称空间的两个数据契约是非等效的,也就不允许互换。

    特此,列一下等效的数据契约的条件:
    (1)数据契约的名称、名称空间相同
    (2)数据契约成员的名称、类型相同
    (3)数据契约成员的序列化顺序相同

    做最好的自己
    2009年5月26日 2:15