0

当我返回IEnumerable<ProgramRange>异常时:

基础连接已关闭:连接意外关闭。

ProgramRange 类如下所示:

[DataContract]
public partial class ProgramRange
{
    public ProgramRange()
    {
        this.GradeVariants = new HashSet<GradeVariant>();
    }

    [DataMember]
    public int ID { get; set; }
    [DataMember]
    public int Range { get; set; }
    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public virtual ICollection<GradeVariant> GradeVariants { get; set; }
}

该系列仅包含八项,因此我认为这<dataContractSerializer maxItemsInObjectGraph="2147483647" />不是经常建议的。

当我从上下文中获取数据时,.ToList()它不可能是这样的:

 public IEnumerable<ProgramRange> GetAll()
    {
        using (Entities dbContext = new Entities())
        {
            return dbContext.ProgramRanges.ToList();

        }
    }

我尝试在实现中将 ProgramRange 类添加到您的服务的已知类型:

 [ServiceBehavior]
 [ServiceKnownType(typeof(ProgramRange))]
 public class ValidationService : IValidationService

我已经尝试返回其他一些东西来测试:(ProgramRange有效),IEnumerable<string>(有效),List<ProgramRange>(无效)

我知道在stackowerflow上有几个关于这个主题的问题,我尝试了很多建议,但我无法让它发挥作用。

编辑:

这是 GradeVariant 类:

[DataContract]
public partial class GradeVariant
{
    public GradeVariant()
    {
        this.GradeVariantRules = new HashSet<GradeVariantRule>();
    }

    [DataMember]
    public int ID { get; set; }
    [DataMember]
    public int GradeTypeID { get; set; }
    [DataMember]
    public int ProgramRangeID { get; set; }
    [DataMember]
    public Nullable<int> ProgramID { get; set; }
    [DataMember]
    public Nullable<int> ApprenticeID { get; set; }
    [DataMember]
    public Nullable<int> Prefix { get; set; }
    [DataMember]
    public Nullable<bool> IV { get; set; }
    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public virtual GradeType GradeType { get; set; }
    [DataMember]
    public virtual ProgramRange ProgramRange { get; set; }
    [DataMember]
    public virtual ICollection<GradeVariantRule> GradeVariantRules { get; set; }
}
4

3 回答 3

2

编辑:
您正在使用可为空的对象,这在 wcf 服务中是不允许的。
在这些成员前面添加 [IgnoreDataMember] 或使它们不可为空以解决您的问题。


您也可以发布课程 GradeVariant 吗?该类中可能存在某些无法解析的元素,导致连接意外关闭。
一些可能性是字典或可为空的项目。
您使用单个 ProgramRange 的测试可能会起作用,因为 GradeVariants 列表为空或为空。

尝试的一个好技巧是检查内部异常的内部异常的内部异常...。
在行尾,它通常会说诸如无法解析字典之类的内容。

于 2012-04-04T14:13:35.653 回答
0

如果是序列化(可能是),请更直接地尝试此操作以查看是否可以找到问题:

try
{
    MemoryStream tempWrite = new MemoryStream();
    DataContractSerializer ds = new DataContractSerializer(typeof(ProgramRange));
    ds.WriteObject(myProgramRangeInstance, tempWrite);

    MemoryStream tempRead = new MemoryStream(tempWrite.GetBuffer());
    ProgramRange newInstance = (ProgramRange)ds.ReadObject(tempRead);
}
catch(Exception ex)
{
    Console.WriteLine(ex.ToString());
}

尝试myProgramRangeInstance从您的类的有效实例开始。这会告诉你这是否是一个序列化问题,以及究竟是什么原因造成的。

现在,我打赌你正在使用 HashSet,但我真的不知道。上面的异常信息应该提供更多信息。

于 2012-04-04T14:27:15.187 回答
0

我找到了我自己的问题的答案,这里是:

问题是 WCF 无法序列化 Entity Framework 在加载引用实体时创建的循环引用。

要解决此问题,只需输入

[DataContract(IsReference = true)]

在模型类之上。

这里有详细解释,http://www.binaryforge-software.com/wpblog/?p=129

于 2012-04-16T11:20:20.697 回答