我想阻止我的控制器中接受無效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中會很好,但是這個系統需要極低的響應時間。
如果你知道任何更好的解決方案,請讓我知道。
感謝
使用JSON模式,請參見http:// WWW .newtonsoft。com/jsonschema –
和一個自定義模型聯編程序,您可以在其中驗證JSON –
或使用字符串customer ...您將獲得JSON字符串,驗證並將json轉換爲所需的對象。 –