2017-02-06 60 views
0

我想阻止我的控制器中接受無效json正文的REST API。.NET MVC控制器接受無效json

我有一個REST API,它有一個.NET MVC端點。在此終結,我們有一個post方法,它採用類客戶(在這個例子大大簡化)的一個機構,它的類如下:

public class Customer 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public List<Address> Addresses { get; set; } 
    public List<Xref> Xrefs { get; set; } 
} 

public class Address 
{ 
    public string AddressLineOne { get; set; } 
    public string AddressLineTwo { get; set; } 
} 

public class Xref 
{ 
    public string System { get; set; } 
    public List<Segment> Segments { get; set; } 

} 

public class Segment 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

和一個控制器的方法如下:

[HttpPost] 
public async Task<IHttpActionResult> Post([FromBody]Customer customer) 
{ 
... 
} 

身體的有效JSON表示如下:

{ 
"FirstName": "firstName", 
"LastName": "lastName", 
"Addresses": 
[ 
    { 
     "AddressLineOne" : "addressLineOne", 
     "AddressLineTwo" : "addressLineTwo" 
    } 
], 
"Xrefs":[ 
    { 
     "System":"systemOne", 
     "Segments":[ 
      { 
       "Name":"name", 
       "Value":"value" 
      } 
     ] 
    } 
] 
} 

我注意到,如果我與無效JSON API提出請求,請求控制器仍然REC在不正確的部分之後,將會甩掉身體並忽略所有的東西。這種表示的下面是一個例子,其中外部參照沒有一個右括號:

{ 
"FirstName": "firstName", 
"LastName": "lastName", 

"Xrefs":[ 
    { 
     "System":"systemOne", 
     "Segments":[ 
      { 
       "Name":"name", 
       "Value":"value" 
      } 

     ] 

, 
"Addresses": 
[ 
    { 
     "AddressLineOne" : "addressLineOne", 
     "AddressLineTwo" : "addressLineTwo" 
    } 
], 
} 

什麼時候該數據被髮布到控制器的情況是,客戶對象將包含名字,姓氏和外部參照,但將不包含地址。這是因爲根據json層次結構,我們仍然處於外部參照,並沒有關閉它。

爲此功能創建單元測試並嘗試DeserializeObject時,您遇到JsonSerializationException,但這不會發生在控制器方法中。

現在我試圖找到一種方法來阻止在控制器中接受無效的json。我不希望任何形式的部分json反序列化,無論json是有效還是不是。我想構建一個驗證過濾器並將其添加到HttpConfig中,此過濾器將使用反射來找出請求的預期內容應該是什麼樣子,然後它會試圖將其反序列化到其中,如果拋出異常請求不會通過。

我一直這樣做,因爲我認爲有一個更簡單和更少資源密集的方式來構建MVC,例如允許不完整的json主體的標誌,但我一直無法找到它。我也不願意在過濾器中這樣做,因爲過濾每個請求會非常耗費資源,特別是因爲反射非常重要,而且我們正在捕獲異常以嘗試驗證。這個過濾器在一個小的MVC API中會很好,但是這個系統需要極低的響應時間。

如果你知道任何更好的解決方案,請讓我知道。

感謝

+0

使用JSON模式,請參見http:// WWW .newtonsoft。com/jsonschema –

+0

和一個自定義模型聯編程序,您可以在其中驗證JSON –

+0

或使用字符串customer ...您將獲得JSON字符串,驗證並將json轉換爲所需的對象。 –

回答

0

你應該能夠使用模型綁定驗證通過簡單地添加關鍵字到您的類,以確保數據。

看看使用一個要求一堆標籤:

public class Xref 
{ 
    [Required] 
    public string System { get; set; } 
    [Required] 
    public List<Segment> Segments { get; set; } 

} 

或者一般驗證模式:

[HttpPost] 
[ValidateModel] 
public async Task<IHttpActionResult> Post([FromBody]Customer customer) 
{ 
... 
} 

See this for specific examples