我有一个API控制器,可以检索一个运行良好的文章列表。我为我的文章创建了一个DTO类,我的API控制器使用它,其中包含相关对象列表(标签)。
以下代码效果很好,并检索我的文章列表:
public class ArticleDTO
{
public int ArticleID { get; set; }
public string Title { get; set; }
public DateTime DatePublished { get; set; }
[AllowHtml]
public string Body { get; set; }
public ICollection<Tag> Tags { get; set; }
}
我的API控制器(注意我在linq查询中没有包含标签):
private IQueryable<ArticleDTO> MapArticles()
{
return from p in db.Articles.Include("Tags")
select new ArticleDTO() {
ArticleID=p.ArticleID,
Title = p.Title,
Subheading = p.Subheading,
DatePublished = p.DatePublished,
Body = p.Body,
};
}
public IEnumerable<ArticleDTO> GetArticles()
{
return MapArticles().AsEnumerable();
}
但是,如果我包含标签:
select new ArticleDTO() {
ArticleID=p.ArticleID,
Title = p.Title,
Subheading = p.Subheading,
DatePublished = p.DatePublished,
Body = p.Body,
Tags = Tags
};
然后我收到以下消息:
'ObjectContent`1'类型无法序列化内容类型'application / xml的响应主体;字符集= UTF-8' 。
类型'System.Data.Entity.DynamicProxies.Tag_5E08D5046E177BA781B97E38A79F1E2BCC3300645A0E505002547644006F116E',数据合约名称为“Tag_5E08D5046E177BA781B97E38A79F1E2BCC3300645A0E505002547644006F116E:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies”不是预期的。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。
我不知道这意味着什么或如何解决它,所以非常感谢任何帮助!
...谢谢
答案 0 :(得分:1)
它正在尝试序列化Tags集合,但它由代理组成。你可以做的就是拥有一个TagDTO,这样你就可以确定你要检索的内容了:
select new ArticleDTO() {
ArticleID=p.ArticleID,
Title = p.Title,
Subheading = p.Subheading,
DatePublished = p.DatePublished,
Body = p.Body,
Tags = Tags.Select(t => new TagDTO {
Name = t.Name
})
};