2016-01-27 117 views
1

Asp.Net的Web API的OData控制器動作:如何處理Odata V4客戶端中的異常?

public async Task<IHttpActionResult> Post(Product product) 
{ 
    if (!ModelState.IsValid) 
    { 
     return BadRequest(ModelState); 
    } 
    db.Products.Add(product); 
    await db.SaveChangesAsync(); 
    return Created(product); 
} 

OData的客戶端代碼: (OData的V4客戶端代碼生成V4)

static void AddProduct(Default.Container container, ProductService.Models.Product product) 
{ 
    container.AddToProducts(product); 
    var serviceResponse = container.SaveChanges(); 
    foreach (var operationResponse in serviceResponse) 
    { 
     Console.WriteLine("Response: {0}", operationResponse.StatusCode); 
    } 
} 

我想處理異常裏面AddProducts()有道方法同時保存更改。

如何處理從服務器return BadRequest(ModelState);發送的ModelState錯誤?

最後,我只是想顯示錯誤消息到服務器發送的最終用途。例如: 「需要產品類別。」

ODataException class有什麼用?這會幫助我嗎?

請幫幫我。

回答

2

如果我理解的很好,您想攔截ModelState無效,並自定義顯示給用戶的OData錯誤。

如果你只是想的無效模型的誤差在返回的有效載荷顯示出來,你可以使用:

if (!ModelState.IsValid) 
{ 
    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState); 
} 

如果你想完全控制顯示的異常處理和信息,我建議幾個動作點你做到這一點:

  • 攔截ModelState無效:你可以用自定義ActionFilterAttribute做到這一點。在那裏,您可以覆蓋方法OnActionExecuting(HttpActionContext actionContext)。您可以訪問ModelStateactionContext.ModelState,檢查它是否有效,檢查有錯誤的字段,檢查這些錯誤的性質以及這些錯誤的生成消息等。由於不同的原因,ModelState可能無效,原因不同超出預期,不符合DataAnnotations規定的要求等。您可以在here中查看更多關於型號驗證。對於您的情況,我猜測產品實體將在類別字段中具有必需的數據註釋。

    檢查完所有錯誤後,您可以使用所需的消息來引發錯誤/錯誤列​​表的自定義異常。這對於稍後攔截您的自定義異常並且能夠在錯誤有效負載中返回您的自定義消息是必需的。

  • 攔截您的自定義異常:創建自定義ExceptionFilterAttribute來攔截您拋出的異常。重寫 OnException(HttpActionExecutedContext filterContext),你將有機會獲得異常,並檢查它,你就可以建立自己的正確OdataError

    在這裏你應該用錯誤請求HTTP狀態代碼和創建ODataError作爲有效載荷返回HttpResponseMessage。由於非常簡單的代碼示例(你可以看到,這將取決於你如何建立你的自定義異常):

     
    public override void OnException(HttpActionExecutedContext filterContext) 
    { 
        Exception ex = filterContext.Exception; 
        HttpRequestMessage currentRequest = filterContext.Request; 
        if (filterContext.Exception.GetType() == typeof(YourCustomValidationException)) 
        { 
         var oDataError = new ODataError() 
         { 
          ErrorCode = "invalidModel", 
          Message = "Your model is not valid.", 
          InnerError = new ODataInnerError() 
          { 
           TypeName = ex.TheEntityThatHasErrors 
          }, 
         };

    foreach (var validationError in ex.ValidationErrors) { oDataError.InnerError.Message += validationError + ", "; } HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.BadRequest); response.RequestMessage = currentRequest; response.Content = new StringContent(JsonConvert.SerializeObject(oDataError)); filterContext.Response = response; } }
  • 最後,你必須設置使用自定義ActionFilterAttribute和自定義ErrorFilterAttribute每次請求到達您的控制器時。可以裝飾你的行動,控制器,也可以爲您的所有API控制器過濾器在WebApiConfig,用config.Filters.Add(...);

您可以找到有關here所有這些詳細信息。最後,錯誤和異常處理對於使用或不使用OData的ASP.Net Web API是一樣的;不同的是,如果你有一個OData API,你應該在OData風格中返回錯誤。

希望所有這些信息都是可以理解的,並以某種方式幫助你。

相關問題