返回IEnumerable<>从WCF服务导致异常:基础连接已关闭:连接意外关闭

时间:2012-04-04 14:07:25

标签: wcf service ienumerable

当我返回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; }
}

3 个答案:

答案 0 :(得分:2)

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


你也可以发布GradeVariant类吗?可能在该类中存在某些不可解析的元素,这些元素意外地关闭了连接 一些可能性是字典或可以为空的项目 使用单个ProgramRange进行测试可能会起作用,因为GradeVariants列表为空或为空
尝试的一个好建议是检查内部异常的内部异常的内部异常.... 在行的末尾,它通常表示无法解析词典。

答案 1 :(得分: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,但我真的不知道。上述异常信息应提供更多信息。

答案 2 :(得分:0)

我找到了自己问题的答案,接下来就是:

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

要解决此问题,只需输入

即可
[DataContract(IsReference = true)]

在模型类上。

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