2013-07-26 3 views
0

J'ai rencontré une situation intéressante dans mon service Web WCF, où mon comportement est différent entre mon application déployée localement s'exécutant dans IIS et mon rôle Web déployé s'exécutant sur Azure.Sérialisation WCF getcha - Rôle différent Rôle Web Azure VS IIS

J'ai une classe définie en tant que telle

[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; } 
} 

La classe est ensuite rempli par le code suivant

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) 
    }; 
} 

Ce code a parfaitement fonctionné (alors qu'il était déployé dans mon instance locale IIS) jusqu'à ce que je déployé sur Azure, à quel point j'ai commencé à recevoir l'erreur suivante lorsque le service a été activé.

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. 

Lors du retrait des requêtes LINQ j'ai pu résoudre avec succès cette question, mais ce que je voudrais comprendre est pourquoi ce comportement est si différent entre les deux plates-formes et si enfait ce comportement est, je J'aimerais aussi savoir s'il existe d'autres "Gotchas" similaires dont je dois avoir conscience concernant le déploiement de services WCF sur Azure?

Répondre

0

Après chaque requête LINQ, appelez ToList(), First() ou FirstOrDefault() afin de ne pas sérialiser les types LINQ, mais les types prévus.

+0

Désolé je suppose que je n'étais pas clair, je comprends cela et en fait c'est exactement comment j'ai résolu le problème. Ce que je ne comprends pas, c'est pourquoi ce comportement est différent entre les deux plates-formes. –

+0

Cela est dû à l'accès local au service par rapport à un serveur distant. –

Questions connexes