2014-11-25 69 views
0

我是ASP.NET新手。剛剛在ASP.NET MVC,Web API和SPA中完成了3本書。但這似乎不足以解決一個非常簡單的問題。我在我的web api控制器中有以下代碼來返回JSON/XML數據。所需的數據是返回在Identity Framework中註冊的用戶列表。在MVC上做了這些,但無法弄清楚web api。ASP.NET 4.5 WebAPI返回用戶列表

[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管理部門,SOI需要Web API返回用戶,角色等的名單就像MVC如何在模型/控制建設行政返回這些數據頁。

請大家幫忙。任何指向教程的鏈接都會受到讚賞,因爲我已經用盡了所有需要解決的問題。謝謝。

[編輯] 下面的這段代碼解決了它。我爲此創建了一個模型。但爲什麼我不能直接訪問和使用Identity模型?我可以在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; 
    } 
+0

'UserManager.Users'是類型'的IQueryable '的。你確定它包含'AppUser'對象嗎? – 2014-11-25 01:20:43

+0

將您的用戶映射到展平視圖模型。它看起來像你有孩子的關係,當序列化時可能導致循環引用。 – trevorc 2014-11-25 02:26:55

+0

我如何映射到展平視圖模型?這是否意味着我創建了一個與AppUser/IdentityUser具有相同屬性的視圖模型,並將UserManager.Users中的每個項目分配給這個新的漸變對象? – 2014-11-25 03:47:09

回答

0
[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; 
}