【发布时间】:2014-11-25 13:44:33
【问题描述】:
我是 ASP.NET 的新手。刚读完 ASP.NET MVC、Web API 和 SPA 方面的 3 本书。但这似乎不足以解决一个非常简单的问题。我的 web api 控制器中有以下代码来返回 JSON/XML 数据。所需的数据是返回在身份框架中注册的用户列表。已在 MVC 上完成此操作,但无法弄清楚 Web api。
[AllowAnonymous]
[Route("UserInfos")]
public IEnumerable<AppUser> GetUserInfos()
{
List<AppUser> logins = new List<AppUser>();
foreach (AppUser user in UserManager.Users)
{
logins.Add(user);
}
return logins;
}
但我在调用此 Web API 时遇到错误。错误如下。
<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'.
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace/>........
....
....
我在 SPA 中做用户管理器/管理,所以我需要 web api 返回用户、角色等列表。就像 MVC 如何在模型/控制中返回这些数据以构建管理页面一样。
请帮忙。感谢任何指向教程的链接,因为我已经用尽一切来寻找答案。谢谢。
[编辑] 下面的代码解决了它。我为此目的创建了一个模型。但为什么我不能直接访问和使用身份模型?我可以在 MVC 中做到这一点。
[AllowAnonymous]
[Route("UserInfos")]
public IEnumerable<FlatUserModel> GetUserInfos()
{
List<FlatUserModel> logins = new List<FlatUserModel>();
foreach (AppUser user in UserManager.Users)
{
logins.Add(new FlatUserModel
{
Id=user.Id,
Name=user.UserName,
Email=user.Email
});
}
return logins;
}
【问题讨论】:
-
UserManager.Users的类型为IQueryable<TUser>。你确定它包含AppUser对象吗? -
将您的用户映射到平面视图模型。看起来您有子关系,在序列化时可能会导致循环引用。
-
如何映射到平面视图模型?这是否意味着我创建了一个与 AppUser/IdentityUser 具有相同属性的视图模型并将 UserManager.Users 中的每个项目分配给这个新的扁平对象?
-
尝试将这行代码添加到您的 Web API 配置文件中,以停止递归引用。 var jsonFormatter = config.Formatters.OfType
().First(); jsonFormatter.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
标签: asp.net asp.net-mvc asp.net-web-api