2017-02-06 10 views
0

私のコントローラで無効なjsonボディを受け入れるREST APIを停止しようとしています。無効なjsonを受け入れる.NET MVCコントローラ

.NET MVCエンドポイントを持つREST APIがあります。このエンドポイントでは、我々は(大部分は、この例では単純化)タイプの顧客の体を取る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" 
    } 
], 
} 

何このデータはコントローラに掲載されたときに発生することは、顧客オブジェクトはFIRSTNAME、姓と外部参照が含まれていることですが、アドレスは含まれません。これは、json階層によれば、まだ外部参照にあり、終了していないからです。

この機能のユニットテストを作成してDeserializeObjectを試行すると、JsonSerializationExceptionが発生しますが、これはコントローラメソッドでは発生しません。

今、コントローラで受け入れられている無効なjsonを停止する方法を見つけようとしています。私は、jsonの部分直列化がどのような形式でも必要ではない.Jsonは有効であるか、そうではない。私は検証フィルタを構築し、それをHttpConfigに追加することを考えました。このフィルタは、リクエストの意図された本体がどのように見えるかを調べるためにリフレクションを使用し、例外がスローされた場合に本体を非直列化しようとします要求は合格しません。

不完全なjsonボディを許可するフラグなど、MVCに組み込まれたこれを行うための単純でリソースの少ない集中的な方法があると仮定しているので、私はこれをやり続けましたが、私はそれを見つけることができませんでした。私はまた、このような各リクエストをフィルタリングするために非常にリソース集約的なので、特に反映が非常に課税されており、検証を試みるために例外をキャッチしているので、フィルタでこれを行うことには消極的です。このフィルタは小さなMVC APIでも問題ありませんが、このシステムでは応答時間が極端に短くなります。

もっと良い解決策がわかっている場合は、私に知らせてください。

おかげ

+0

使用JSONスキーマは、http参照:// WWWを.newtonsoft。com/jsonschema –

+0

とJSON –

+0

を検証するか、またはstring 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

関連する問題