IIS で実行されているローカルに展開されたアプリケーションと Azure で実行されている展開された Web ロールの間で異なる動作が発生しているという興味深い状況に WCF Web サービスで遭遇しました。
私はそのように定義されたクラスを持っています
[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 クエリを削除すると、この問題を正常に修正できましたが、理解したいのは、この動作が 2 つのプラットフォーム間で非常に異なる理由であり、実際にこの動作が設計によるものである場合は、 Azure に WCF サービスを展開することに関連して、私が知っておく必要がある他の同様の「落とし穴」はありますか?