none
关于Entity在WCF中调用的问题 RRS feed

  • 问题

  • 我现在实现一个结构,在服务端用ado ef来调用数据库中的数据,用wcf将获得的实体传递到客户端。但是始终显示

    The request channel timed out while waiting for a reply after 00:00:49.5000000. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout.

    我调试了一下,发现也不是序列化的问题。代码片段如下:

    wcf 端

            public TestTable getEntity(string entityName)
            {
                TestTable entity = null;
                using (SecurityModelContainer securityContainer = new SecurityModelContainer())
                {
                    entity = (from e in securityContainer.TestTables
                              where e.testName == entityName
                              select e).SingleOrDefault();
                    
                }
                  return entity;
            }

    在服务器端entity调试的确没有问题,但是只要用客户端调用就出老是显示上面的错误,客户端调用也比较简单

           TestTable testEntity =  secuirtyClient.getEntity("admin");

    我在服务端做了一下修改,如下:

             public TestTable getEntity(string entityName)
            {
                TestTable entity = null;
                entity = new TestTable();
                entity.testId = 1;
                entity.testAge = 38;
                entity.testName = "admin";
                return entity;
            }

    这样客户端调用是没有问题的,现在不知道问题出在哪里?要是序列化不正常,修改后的代码也不可能实现。我看了一下用svcutil生成的契约文件,需要的POCO类都正常的描述了,我是用的VS.NET2010RC版本中的ADO.NET POCO Entity Generator来产生的POCO类。不知道到底是什么问题。

    下面是自动生成的POCO类:

        public partial class TestTable
        {
            #region Primitive Properties

            public virtual int testId
            {
                get;
                set;
            }
            public virtual string testName
            {
                get;
                set;
            }
            public virtual Nullable<int> testAge
            {
                get;
                set;
            }

            #endregion
        }

     

    2010年4月12日 9:19

答案

  • 通过实验找到问题,问题是ObjectContext上下文在采用VS2010中ADO.NET POCO Entity Generator来产生的ObjectContext默认是支持LazyLoad的。而序列化和LazyLoad是有冲突的。因此不能采用LazyLoad。可以设置 this.ContextOptions.LazyLoadingEnabled = false来实现,如果要延迟加载可以参考这篇文章 : http://blogs.msdn.com/adonet/archive/2010/01/05/poco-proxies-part-2-serializing-poco-proxies.aspx 。

    对应于单个对象,可以采用以上文章方法得到解决。而如果对象和对象之间有关联关系这种,用以上方法采用延迟加载还是没有解决。比如对象Role和对象Operator之间存在关系,在Operator对象中根据ADO.NET POCO Entity Generator产生的代码中应该自动有个Role对象,在加载Operator时应该也对Role进行代理解析。而事实上程序报错,因此暂时在WCF操作POCO只有不使用延迟加载。

        不知道有没更好的方法,或者是我对链接的文章并没有看透?(E文不太好:) )

    • 已标记为答案 Mog Liang 2010年4月20日 6:48
    2010年4月13日 9:07

全部回复

  • 先尝试把 TimeOut的几个属性都修改大一点 看看,客户端和服务端Binding里设置。

     


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2010年4月12日 11:30
    版主
  • 通过实验找到问题,问题是ObjectContext上下文在采用VS2010中ADO.NET POCO Entity Generator来产生的ObjectContext默认是支持LazyLoad的。而序列化和LazyLoad是有冲突的。因此不能采用LazyLoad。可以设置 this.ContextOptions.LazyLoadingEnabled = false来实现,如果要延迟加载可以参考这篇文章 : http://blogs.msdn.com/adonet/archive/2010/01/05/poco-proxies-part-2-serializing-poco-proxies.aspx 。

    对应于单个对象,可以采用以上文章方法得到解决。而如果对象和对象之间有关联关系这种,用以上方法采用延迟加载还是没有解决。比如对象Role和对象Operator之间存在关系,在Operator对象中根据ADO.NET POCO Entity Generator产生的代码中应该自动有个Role对象,在加载Operator时应该也对Role进行代理解析。而事实上程序报错,因此暂时在WCF操作POCO只有不使用延迟加载。

        不知道有没更好的方法,或者是我对链接的文章并没有看透?(E文不太好:) )

    • 已标记为答案 Mog Liang 2010年4月20日 6:48
    2010年4月13日 9:07
  • 关注一下。。。

    2010年4月14日 13:34