我在我的 WCF Web 服务中遇到了一个有趣的情况,我在 IIS 中运行的本地部署的应用程序和在 Azure 上运行的部署的 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 查询后,我能够成功解决此问题,但我想了解的是为什么两个平台之间的这种行为如此不同,如果事实上这种行为是设计使然,我也想知道是否存在我需要了解与在 Azure 上部署 WCF 服务相关的任何其他类似“陷阱”吗?