none
求助 泛型返回类型的操作 产生通讯异常 RRS feed

  • 问题

  • 新补充:

    重新测试了下发现是User作为数据契约时产生的错误,通过 操作 User TestGetUser() 来操作也产生了相同的异常,

    这里怀疑是否与User继承了 抽象基类有关,

    具体User的实现为:

        public interface IEntity
        {
            /// <summary>
            /// 主键
            /// </summary>
            Guid Id { get; }
    }
    
    
     [DataContract]
        public abstract class AbstractEntityBase:IEntity
        {
            public AbstractEntityBase()
            {
                this.Id = Guid.NewGuid();
    
                /*
                this.Flag = 0;
                this.CreateTimeStamp = DateTime.Now;
                this.LastTimeStamp = DateTime.Now;
                */ 
            }
    
            [DataMember]
            [Key]
            [Required]
            public Guid Id
            {
                get;
                protected set;
            }
    }
    
    /// <summary>
        /// 用户信息
        /// </summary>
        [DataContract]
        public class User : AbstractEntityBase
        {
            public User()
            {
                //this.Roles = new List<Role>();
                //this.Organizations = new List<Organization>();
            }
    
            /// <summary>
            /// 登录名
            /// </summary>
            [DataMember]
            [Required(ErrorMessage = "User Name is required")]
            [Display(Name = "User Name")]
            [MaxLength(20,ErrorMessage="Max Length is 20")] 
            public string UserName { get; set; }
    
            /// <summary>
            /// 密码
            /// </summary>
            [DataMember]
            [Required(ErrorMessage="Pass Word is required ")]
            [Display(Name="Pass Word")]
            [MinLength(6,ErrorMessage="Min Length is 6")]
            public string PassWord { get; set; }
    }
    请有经验的大侠帮助!

     

     

     

    原问题----------------------------------------------------

    操作契约定义为:

     [OperationContract]
            ServiceResult<User> GetUserByName(string name);
    

    其中返回类型定义为:

     

        /// <summary>
        /// 服务结果类
        /// </summary>
        [DataContract]
        public class ServiceResult
        {
            /// <summary>
            /// 是否执行成功
            /// </summary>
            [DataMember(IsRequired=true)]
            public bool Successed { get; set; }
    
            /// <summary>
            /// 错误信息
            /// </summary>
            [DataMember]
            public string Error { get; set; }
        }
    
        /// <summary>
        /// 包含TResult泛型的服务结果类
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        [DataContract(Name="ServiceResultOf{0}")]
        public class ServiceResult<TResult> : ServiceResult
        {
            /// <summary>
            /// 返回结果
            /// </summary>
            [DataMember]
            public TResult Result { get; set; }
        }
    

     


    通过WsHttpBinding 发布的服务,在客户端调用过程中产生异常:

    接收对 http://127.0.0.1:8866/UserService 的 HTTP 响应时发生错误。这可能是由于服务终结点绑定未使用 HTTP 协议造成的。这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致。有关详细信息,请参见服务器日志。

     

    我试过调用返回 ServiceResult 基类,不包含泛型类型的操作,完全没有问题,

    这里泛型User类型也是正常的数据契约,

     

    服务实现Message安全 + Username验证;

     

    请教知道原因的朋友赐教~

     


    • 已编辑 w-w-w 2011年11月10日 3:24 问题补充
    2011年11月10日 2:34

答案

  • 。。。。杯具~~ 问题已经解决了, 原来是Entity Framework的原因,ef 查询结果不能直接作为wcf服务的返回值,必须进行一次包装 或者 克隆;

     

    无语的~~真是麻烦!!!

    • 已标记为答案 w-w-w 2011年11月10日 4:41
    2011年11月10日 4:41

全部回复

  • 泛型的话,最有可能是序列化的原因

    试试直接使用[Serializable]

    2011年11月10日 2:46
  • 。。。。杯具~~ 问题已经解决了, 原来是Entity Framework的原因,ef 查询结果不能直接作为wcf服务的返回值,必须进行一次包装 或者 克隆;

     

    无语的~~真是麻烦!!!

    • 已标记为答案 w-w-w 2011年11月10日 4:41
    2011年11月10日 4:41