Я пытаюсь обработать случай, когда параметры запроса 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