2017-09-24 18 views
1

假設驗證碼:ASP.NET核心 - 如何認識反序列化已經通過中間件失敗

public class Test 
{ 
    public DateTime  Date  { get; set; } 
    public string  Title  { get; set; } 
} 

[HttpPut, Route("test")] 
public IActionResult test([FromBody]Test Data) 
{ 
    .... 
} 

如果用戶提供在體內無效JSON,數據將是無效的。

有沒有一種方法可以在代碼執行之前捕捉到它,所以我不必在每個API方法上測試null值?

我一直在想它可能作爲一箇中間件可行,但我沒有經驗,所以我不確定。

+0

您應驗證模型數據。如果屬性是必需的,你應該標記它們,然後驗證過程('ModelState.IsValid')會告訴你它是否正確。 – poke

+0

但這意味着我需要爲每個調用添加一個「if(ModelState.IsValid)...」;我試圖找到是否可以在管道中捕獲並從單個位置返回一個通用錯誤 – Thomas

回答

1

您可以使用MVC過濾器在執行操作時自動執行驗證。引述the documentation

您可以使用動作過濾器,如果狀態是無效的自動驗證模型的狀態,並返回任何錯誤:

using Microsoft.AspNetCore.Mvc; 
using Microsoft.AspNetCore.Mvc.Filters; 

namespace FiltersSample.Filters 
{ 
    public class ValidateModelAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext context) 
     { 
      if (!context.ModelState.IsValid) 
      { 
       context.Result = new BadRequestObjectResult(context.ModelState); 
      } 
     } 
    } 
} 

OnActionExecuted方法操作方法運行後,可以看到和通過ActionExecutedContext.Result屬性處理操作的結果。如果動作執行被另一個過濾器短路,則ActionExecutedContext.Canceled將被設置爲真。如果操作或後續操作過濾器拋出異常,則ActionExecutedContext.Exception將被設置爲非空值。將ActionExecutedContext.Exception設置爲null會有效'處理'異常,然後將執行ActionExectedContext.Result,就好像它是從操作方法正常返回一樣。

+0

實際上,它並不像我預期的那樣工作:這迫使我用一個屬性來裝飾每個調用;但是由於我們有一個可以在很多方面使用的框架,我正在尋找一些完全自動化的東西,並且任何編寫新的休息調用的人都不需要考慮。 – Thomas

+0

@Thomas你也可以裝飾控制器,將其應用於所有的方法。或者你可以[用'AddMvc'調用全局設置過濾器](https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters#filter-scopes-and-order-of-執行)使其適用於所有路線。 – poke

+0

我以前沒看到過這個電話!完善!再次感謝! – Thomas