Обработка некорректных опций запросов ядра OData .net. - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь обработать случай, когда параметры запроса OData неверны (например, пустое расширение).Я хочу вернуть 400 код состояния вместо 500 в случае неправильного запроса.

http://localhost:51625/odata/persons(123)?$expand=

Я реализовал пользовательский ODataEnableQueryAttribute , унаследованный от EnableQueryAttribute и использовавший его для действий контроллера.Я переопределяю все методы из EnableQueryAttribute и вызываю базовый метод внутри try ... catch block

public class ODataEnableQueryAttribute : EnableQueryAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        try
        {
            base.OnActionExecuting(context);
        }
        catch (Exception ex)
        {
            context.Result = new OAIncorrectQueryResult(ex.Message);
        }
    }

    public override void OnActionExecuted(ActionExecutedContext actionExecutedContext)
    {
        try
        {
            base.OnActionExecuted(actionExecutedContext);
        }
        catch (Exception ex)
        {
            actionExecutedContext.Result = new OAIncorrectQueryResult(ex.Message);
        }
    }
}

Но ни один метод из моего пользовательского атрибута не являетсябудучи вызванным. Я получил ArgumentException "select" и "expand" не может быть как нулевым, так и пустым.twrown from ODataQueryParameterBindingAttribute. Трассировка стека:

at Microsoft.AspNet.OData.Query.SelectExpandQueryOption..ctor(String select, String expand, ODataQueryContext context, ODataQueryOptionParser queryOptionParser)
   at Microsoft.AspNet.OData.Query.ODataQueryOptions.BuildQueryOptions(IDictionary`2 queryParameters)
   at Microsoft.AspNet.OData.Query.ODataQueryOptions.Initialize(ODataQueryContext context)
   at Microsoft.AspNet.OData.Query.ODataQueryOptions`1..ctor(ODataQueryContext context, HttpRequest request)
   at Microsoft.AspNet.OData.ODataQueryParameterBindingAttribute.ODataQueryParameterBinding.CreateODataQueryOptions[T](ODataQueryContext context, HttpRequest request)
   at Microsoft.AspNet.OData.ODataQueryParameterBindingAttribute.ODataQueryParameterBinding.BindModelAsync(ModelBindingContext bindingContext)
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ExceptionContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)

Возможно, исключение выдается из места, где создаются ODataQueryOptions. (строка 86 - https://github.com/OData/WebApi/blob/master/src/Microsoft.AspNet.OData/ODataQueryParameterBindingAttribute.cs#L86)

Итак, какМожно ли обработать недопустимые параметры запроса, возвращая ошибку 400 вместо 500

...