2013-07-26 12 views
0

我遇到了一個有趣的情況,在我的WCF webservice中,我遇到了在IIS中運行的本地部署應用程序與在Azure上運行的已部署Web角色之間的不同行爲。WCF序列化陷阱 - 不同的行爲Azure Web角色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實例)填充,直到我將其部署到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還想知道是否還有其他類似的「需要注意的問題」與在Azure上部署WCF服務有關?

回答

0

在每個LINQ查詢之後,調用ToList(),First()或FirstOrDefault(),以便不序列化LINQ類型,但是打算使用的類型。

+0

對不起,我想我不清楚,我明白,事實上,這正是我如何解決這個問題。我不明白的是爲什麼這兩種平臺之間的行爲不同。 –

+0

這是由於本地訪問服務與遠程服務器。 –