2016-03-04 61 views
4

我有一個要求,當請求Json包含重複鍵時,從ASP.NET Web API Post請求返回400錯誤。如何檢測Web API中的重複鍵發佈請求Json

例如,如果請求是

{ 
    "key1": "value1", 
    "key2": 1000, 
    "key2": 2000, 
    "key3": "value3" 
} 

那麼我希望錯誤被拋出,由於是有兩個「KEY2」鍵。

我控制器的方法看起來像

[HttpPost] 
public IHttpActionResult PostMethod([FromBody]RequestModel request) 
{ 
    ..... 
} 

和我RequestModel模型像

public class RequestModel 
{ 
    [Required] 
    public string Key1 {get; set; } 

    [Required] 
    public int Key2 {get; set; } 

    public string Key3 {get; set; } 
} 

在上面的例子中的JSON序列似乎樂意與2000年接受請求並填充鍵2,或任何密鑰的最後一個實例是。

我想我需要做的事情涉及JsonSerializerSettings類,或實現一個自定義的JsonConverter,但我不確定如何繼續。

回答

1

這裏是一個自定義JsonConverter它拋出一個HttpResponseException與代碼400,當遇到一個複製的鑰匙,其Asp.Net的Web API會自動處理它。

class DuplicateJsonConverter : JsonConverter 
{ 
    public override bool CanWrite { get { return false; } } 

    public override bool CanConvert(Type objectType) 
    { 
     return true; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var paths = new HashSet<string>(); 
     existingValue = existingValue ?? Activator.CreateInstance(objectType, true); 

     var backup = new StringWriter(); 

     using (var writer = new JsonTextWriter(backup)) 
      do 
      { 
       writer.WriteToken(reader.TokenType, reader.Value); 

       if (reader.TokenType != JsonToken.PropertyName) 
        continue; 

       if (string.IsNullOrEmpty(reader.Path)) 
        continue; 

       if (paths.Contains(reader.Path)) 
         throw new HttpResponseException(HttpStatusCode.BadRequest); //as 400 

       paths.Add(reader.Path); 
      } 
      while (reader.Read()); 

     JsonConvert.PopulateObject(backup.ToString(), existingValue); 
     return existingValue; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

並且您應該使用此轉換器修飾您的RequestModel類。

[JsonConverter(typeof(DuplicateJsonConverter))] 
class RequestModel 
{ 
    \\... 
} 
1

您可以創建一個攔截DelegateHandler,每當您收到請求時它都會觸發。在這裏你可以獲得發送到控制器的數據並檢查它是否有重複的鍵。 創建處理程序是這樣註冊的:

GlobalConfiguration.Configuration.MessageHandlers.Add(new YourDelegateHandler());