Я хотел создать глобальный атрибут проверки для своего веб-API. Поэтому я следовал руководству и получил следующий атрибут:
public class ValidationActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid)
{
return;
}
var errors = new List>();
foreach (var key in actionContext.ModelState.Keys.Where(key =>
actionContext.ModelState[key].Errors.Any()))
{
errors.AddRange(actionContext.ModelState[key].Errors
.Select(er => new KeyValuePair(key, er.ErrorMessage)));
}
actionContext.Response =
actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, errors);
}
}
Затем я добавил его в глобальные фитлеры в Global.asax :
configuration.Filters.Add(new ValidationActionFilter());
. Он отлично работает с большинством моих действий, но не так, как ожидалось, с действиями, которые имеют необязательные и обнуляемые параметры запроса.
Например:
Я создал маршрут:
routes.MapHttpRoute(
name: "Optional parameters route",
routeTemplate: "api/{controller}",
defaults: new { skip = UrlParameter.Optional, take = UrlParameter.Optional });
И действие в моемProductsController
:
public HttpResponseMessage GetAllProducts(int? skip, int? take)
{
var products = this._productService.GetProducts(skip, take, MaxTake);
return this.Request.CreateResponse(HttpStatusCode.OK, this._backwardMapper.Map(products));
}
Теперь, когда я запрашиваю этот URL:http://locahost/api/products
Я получаю ответ с кодом состояния 403 и следующим содержимым:
[
{
"Key": "skip.Nullable`1",
"Value": "A value is required but was not present in the request."
},
{
"Key": "take.Nullable`1",
"Value": "A value is required but was not present in the request."
}
]
Я считаю, что это не должно отображаться как ошибка проверки, поскольку эти параметры являются необязательными и допускают значение NULL.
Кто-нибудь сталкивался с этой проблемой и нашел решение?