2013-10-22 18 views
2

我想能夠公開使用WebAPI 2的用戶列表。但是,由於我在MVC5中使用新的Asp.Net身份驗證框架,我似乎無法找到一種方法來標記具體字段爲DataMembers在WebAPI中公開ApplicationUser

繼承人我有:

[DataContract]  
public class ApplicationUser : IdentityUser { 
    public Nullable<DateTime> birthday { get; set; } 
    [DataMember] 
    public int tolerance { get; set; } 
    [DataMember] 
    public string twitter { get; set; } 
} 

然而,這似乎並沒有工作,因爲IdentityUser沒有[DataContract]屬性。我試過創建一個自定義IdentityUser,但是在創建IdentityUser的自定義副本之後,我一直無法構建。

任何提示或在這裏工作?我寧願不必創建ViewModel,除非這是目前的最佳做法。

+0

當談到WebAPI時,使用ViewModel顯然是最好的實踐。如果你真的想避免使用ViewModel,請在Ilenuminati的回答中做什麼。 – JustMaier

回答

1

我知道這是一個古老的問題,當我試圖達到同樣的目的時,我偶然發現了這個問題。這是我最終做的。你可以覆蓋你的屬性並將它們標記爲[JsonIgnore],以便它們不會自動序列化。

public class ApplicationUser : IdentityUser 
    { 
     public UserType UserType { get; set; } 

     [JsonIgnore] 
     public override string PasswordHash 
     { 
      get { return base.PasswordHash; } 
      set { base.PasswordHash = value; } 
     } 
    } 
+0

謝謝@Illuminati,這將是我一直在尋找的答案。也就是說,這不是最好的做法,並且在WebAPI中發送整個模型可能通常不是最好的想法。 – JustMaier

+1

我同意這不是最好的。但是當你在做一個小的POC,並且你想在ApplicationUser對象中傳輸東西時 - 你真的不想增加AutoMapper的複雜性或者創建ViewModels – Illuminati

2

您可能應該發送一個不同的對象與您需要的用戶信息,而不是序列化用戶對象。

1

你想使用什麼格式?我沒有看到默認的Json格式化程序的任何問題。但對於xml序列化程序,它也需要基類爲DataContract。

查看模型始終是這裏的最佳實踐,儘管爲了簡單起見,大多數web api示例都使用數據實體。這兩種模式是不同的擔憂。視圖模型代表您的API的合同,數據模型代表您的領域概念。將兩個模型組合成一個模型可能會影響您的設計決策,或者更嚴重地會導致安全問題。使用數據實體可能會將意外數據暴露給用戶。例如,不同的格式化程序有不同的規則來控制模型的暴露。 JsonIgnore在xml格式化程序中不起作用。如果你有自定義的格式化程序,它會更復雜。特別是對於身份用戶實體,它具有許多敏感屬性,如密碼哈希,安全戳。我不會推薦你公開它。

順便說一句,有很多映射工具可以幫助簡化從域模型到視圖模型的映射。您可能需要它們:http://www.nuget.org/packages?q=mapper

+0

我將使用JSON,但我需要'IdentityUser'上的JSONIgnore屬性,但我無法修改或複製它... 現在,我知道最佳做法是創建視圖模型,我會創建一個視圖模型並使用[AutoMapper](http://www.nuget.org/packages/AutoMapper)映射到使用[this question]中的信息的視圖模型(http://stackoverflow.com/a/4285596/616888)。 – JustMaier