2013-07-26 2 views
0

Я столкнулся с интересной ситуацией в моем веб-сервисе WCF, где я испытываю различное поведение между моим локально развернутым приложением, работающим в IIS, и моей развернутой веб-ролью, запущенной на Azure.Сериализация WCF gotcha - Различное поведение Azure Web Role VS IIS

У меня есть класс, определенный как таковой

[DataContract] 
public class DefaultClassView : BaseView 
{ 
    [DataMember] 
    public Guid ClassID { get; set; } 

    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public Guid SchoolID { get; set; } 

    [DataMember] 
    public string SchoolName { get; set; } 

    [DataMember] 
    public IEnumerable<Guid> YearLevelIDs { get; set; } 

    [DataMember] 
    public IEnumerable<string> YearLevelNameList { get; set; } 

    [DataMember] 
    public IEnumerable<Guid> SubjectIDs { get; set; } 

    [DataMember] 
    public IEnumerable<string> SubjectNameList { get; set; } 
} 

Класс не затем заполняется с помощью следующего кода

public static DefaultClassView ConvertToView(this Class entity) 
{ 
    return new DefaultClassView() 
    { 
     ClassID = entity.ClassID, 
     Name = entity.Name, 
     YearLevelIDs = entity.Students.Select(o => o.YearLevelID).Distinct(), 
     YearLevelNameList = entity.Students.Select(o => o.YearLevel.Name).Distinct(), 
     SchoolID = entity.SchoolID, 
     SchoolName = entity.School.Name, 
     SubjectIDs = entity.Subjects.Select(o => o.SubjectID), 
     SubjectNameList = entity.Subjects.Select(o => o.Name) 
    }; 
} 

Этот код работает отлично (в то время как развернуто в моем локальном экземпляре IIS) до I развернул его на Azure, после чего я начал получать следующую ошибку при активации службы.

Type System.Linq.Enumerable+WhereSelectEnumerableIterator`2[Model.Subject,System.Guid]' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. 

После удаления запросов LINQ мне удалось успешно решить эту проблему, но то, что я хотел бы понять, почему это поведение настолько отличается между этими двумя платформами и если Infact это поведение является, я d также хотел бы знать, есть ли другие похожие «Gotchas», о которых мне нужно знать, связанных с развертыванием служб WCF на Azure?

ответ

0

После каждого запроса LINQ вызовите ToList(), First() или FirstOrDefault(), чтобы вы не сериализовали типы LINQ, а предназначались типы.

+0

Извините, я думаю, я был неясно, я это понимаю, и на самом деле именно так я решил проблему. Я не понимаю, почему это поведение отличается между двумя платформами. –

+0

Это связано с доступом к службе локально и удаленным сервером. –

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