2012-04-04 8 views
0

Когда я вернусь IEnumerable<ProgramRange> исключение брошено:Возвращаясь IEnumerable <> из службы WCF вызывает исключение: Базовое соединение закрыто: соединение было закрыто неожиданно

Базовое соединение закрыто: соединение было закрыто неожиданно.

Класс 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> (does't работы)

Я знаю, что на stackowerflow есть несколько вопросов по этому вопросу, и я попробовал много предложений, но я не могу заставить его работать.

Edit:

Вот класс 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; } 
} 

ответ

0

Я нашел ответ на свой вопрос, и здесь идет:

Проблема заключалась в том, что WCF не удалось сериализовать циклическую ссылку, что Entity Framework создается при загрузке ссылки объектов.

Чтобы решить эту проблему, просто поставить

[DataContract(IsReference = true)] 

по классу модели.

Это объясняется здесь подробно, http://www.binaryforge-software.com/wpblog/?p=129

2

Edit:
Вы используете NULLABLE объекты, это не допускается в службе ФОС.
Добавить [IgnoreDataMember] перед этими членами или сделать их недействительными для устранения проблемы.


Не могли бы вы также опубликовать класс GradeVariant? Возможно, что в этом классе есть некоторые неотъемлемые элементы, которые неожиданно закрыли соединение.
Несколько возможностей - словарь или элемент с нулевым значением.
Ваш тест с одним ProgramRange может работать, потому что список GradeVariants пуст или нулевым.

Хороший совет попробовать проверить внутреннее исключение внутреннего исключения внутреннего исключения ....
В конце строки он обычно говорит что-то вроде синтаксического разбора словаря.

+0

Может ли это быть проблема, даже если класс коллекции вариант в пределах программы пусто? – FatAlbert

+0

Думаю, ты здесь. Проблема была связана с GradeVariant. На данный момент я удалил «virtual», который предотвращает загрузку связанных данных (не знаю, как работает Entity Framework, почему виртуальная машина загружает связанные данные. Рано или поздно мне тоже нужно избавиться от нулевых типов. Спасибо за вашу помощь! – FatAlbert

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, но я действительно не знаю. Информация об исключении из вышеизложенного должна содержать дополнительную информацию.

Смежные вопросы

 Смежные вопросы