3

Asp.Net Web API Odata 控制器操作:

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()在保存更改的同时在 Method 中以适当的方式处理异常。

如何捕获ModelState从服务器发送的错误return BadRequest(ModelState);

最后,我只想将错误消息显示给从服务器发送的最终用途。示例:“产品类别是必需的。”

上课有什么用ODataException?这会帮助我吗?

请帮我。

4

1 回答 1

4

如果我理解得很好,您想拦截 ModelState 无效,并自定义向用户显示的 OData 错误。

如果您只想在返回的有效负载中显示无效模型的错误,您可以使用:

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

如果您想完全控制显示的异常处理和消息,我建议您使用几个操作点来完成此操作:

  • 拦截ModelState无效:您可以使用自定义来执行此操作ActionFilterAttribute。在那里,您可以覆盖方法OnActionExecuting(HttpActionContext actionContext)。您可以访问ModelStatethrough actionContext.ModelState,检查它是否有效,检查有错误的字段,检查这些错误的性质以及为这些错误生成的消息等。 ModelState 可能由于不同的原因而无效,例如与预期,不满足 DataAnnotations 等指定的要求。您可以在此处查看有关模型验证的更多信息。对于您的情况,我猜 Product 实体将在 Category 字段中有一个必需的数据注释。

    检查所有错误后,您可以使用所需消息的错误/错误列​​表引发自定义异常。这对于稍后拦截您的自定义异常并能够在错误有效负载中返回您的自定义消息是必要的。

  • 拦截你的自定义异常:创建一个自定义ExceptionFilterAttribute来拦截你抛出的异常。覆盖 OnException(HttpActionExecutedContext filterContext)您将可以访问异常,并检查它,您将能够构建正确的OdataError

    在这里,您应该返回HttpResponseMessageBadRequest http 状态代码和创建的 ODataError 作为有效负载。作为一个非常简单的代码示例(您可以看到它取决于您如何构建自定义异常):

    公共覆盖无效 OnException(HttpActionExecutedContext filterContext)
    {
        异常 ex = filterContext.Exception;
        HttpRequestMessage currentRequest = filterContext.Request;
        if (filterContext.Exception.GetType() == typeof(YourCustomValidationException))
        {
            var oDataError = 新 ODataError()
            {
                ErrorCode = "invalidModel",
                Message = "您的模型无效。",
                内部错误 = 新 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; } }
  • 最后,您必须设置自定义ActionFilterAttributeErrorFilterAttribute每次请求到达您的控制器时要使用的自定义。您可以装饰您的操作、控制器,或者您可以在 , 中为所有 API 控制器设置过滤WebApiConfigconfig.Filters.Add(...);

您可以在此处找到有关所有这些的更多信息。最后,对于 ASP.Net Web API,无论有无 OData,错误和异常处理都是一样的;不同之处在于,如果您有 OData API,则应该以 OData 样式返回错误。

希望所有这些信息都可以理解并以某种方式帮助您。

于 2016-01-27T11:40:36.197 回答