【问题标题】:ASP.NET 4.5 WebAPI to return list of usersASP.NET 4.5 Web API 返回用户列表
【发布时间】: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&lt;TUser&gt;。你确定它包含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


【解决方案1】:
[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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2013-06-24
    • 2013-01-14
    • 2015-01-05
    相关资源
    最近更新 更多