2013-04-03 53 views
3

我對WebApi有個小問題。.NET中的POST對象WebAPI

問題: 如果我要發佈使用JSON的模型,我可以添加儘可能多的成員我想,只要在​​模型中定義的成員都在場。

問題: 如何在我的Json對象中存在未定義的成員時觸發異常。沒有定製的JsonConverter,這可以實現嗎? 我在尋找的是一個通用的解決方案,而不是每個不同型號的轉換。

型號:

public class Person 
{ 
    [Required] 
    public string Name { get; set; } 
} 

阿比控制器:

public class PersonController : ApiController 
{ 
    public HttpResponseMessage Post(Person person) 
    { 
     if (person != null) 
     { 
      if (ModelState.IsValid) 
      { 
       //do some stuff 
       return new HttpResponseMessage(HttpStatusCode.OK); 
      } 
     } 
     return new HttpResponseMessage(HttpStatusCode.BadRequest); 

    } 
} 

的Json帖(體) {"Name":"Joe"} - >有效 {"Name":"Joe","InvalidMember","test","Name","John"} - 還>有效。在這種情況下,我想觸發一個異常。因爲如果你看它,它完全不符合我的模型定義。

+0

事實上,這不是一個真正的問題,但我想強迫我的客戶使用所描述的API,而不是用無用的信息填充它。這只是消耗帶寬。如果API沒有造成問題,那麼客戶端可能不會發布額外的數據。 – JeanD

+0

發佈額外的數據仍然會消耗帶寬。在您檢查其結構時,數據已經傳輸到服務器。不知道你是否試圖阻止額外的數據發佈。在這種情況下,你必須在客戶端工作。 – Floremin

+0

是的,我知道。我只想讓客戶意識到發佈額外的數據,就這些。 「嘿,你發佈我不需要的數據。清理你的文章,然後再試一次」。如果您忽略額外的數據,客戶端會繼續發佈它,這將導致不必要的網絡流量。 – JeanD

回答

3

有一兩件事你可以嘗試在玩弄此設置:

config.Formatters.JsonFormatter.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Error; 

它應該給你一個無效的模型狀態,當有未在JSON認可額外的屬性。

+1

這個命名似乎違反直覺,我會認爲它是*在* -posting方案(成員從JSON中缺少),而不是* -posting(從對象定義中缺少成員)。但是其中的文檔非常清楚:*「在獲取或設置缺少成員(例如JSON包含的屬性不是對象上的成員)時,在反序列化過程中處理。」* - http://james.newtonking.com /projects/json/help/index.html?topic=html/P_Newtonsoft_Json_JsonSerializer_MissingMemberHandling.htm – Snixtor

+0

謝謝。這解決了我的問題。我知道這個設置是存在的,但是我假設它只處理欠發佈。獲得的教訓:從不承擔任何事情;) – JeanD