Сложный тип как необязательный аргумент в действии веб-API

Мне нужно сделать параметр сложного типа необязательным в «Действии контроллера веб-API», чтобы мой фильтр действий для нулевых значений мог игнорировать его, проверяя свойство аргумента IsOptional. Я получаю эту ошибку:

Необязательный параметр errorCode не поддерживается FormatterParameterBinding.

У меня есть такой контроллер:

[Route("api/v1/Temp/{number}/{errorCode?}/{value?}")]
[HttpGet]
public IHttpActionResult Temp(int number, ErrorDetail errorCode = null, string value = null)
{
    return Ok("good");
}

и иметь actionFilter для проверки нулевых значений, например:

public override void OnActionExecuting(HttpActionContext actionContext)
{
    var parameters = actionContext.ActionDescriptor.GetParameters();
    foreach (var param in parameters)
    {
        if (param.IsOptional)
            continue;

        object value = null;

        if (actionContext.ActionArguments.ContainsKey(param.ParameterName))
            value = actionContext.ActionArguments[param.ParameterName];

        if (value == null)
            throw new GasException((ulong)ErrorCodes.NullValue, ErrorCodes.NullValue.GetDescription());
    }
}

Есть ли способ сделать сложный тип необязательным параметром? Как игнорировать дополнительные параметры сложного типа в фильтре действий?


person Muhammad Saad Javed    schedule 17.01.2017    source источник
comment
Я нашел способ обойти это, используя настраиваемый атрибут в действии моего контроллера, который принимает все необязательные параметры, а затем пропускает эти необязательные параметры в фильтре значений NULL.   -  person Muhammad Saad Javed    schedule 17.01.2017


Ответы (1)


Не похоже, что ты можешь. Если клиент, выполняющий запрос, не предоставляет значение для параметра сложного типа, он будет автоматически предоставлен как null веб-API ASP.NET, поскольку они являются ссылочными типами.

Следовательно, нет необходимости явно устанавливать для них значение по умолчанию null:

public IHttpActionResult Temp(int number, ErrorDetail errorCode, string value)
{
    return Ok("good");
}

Удалив значения по умолчанию = null в сигнатуре метода выше, эта ошибка, касающаяся «необязательный параметр не поддерживается ...», исчезает.

Не уверен в намерении вашего фильтра действий, так как вы проверяете nulls и выдаете исключение. Это означает, что эти параметры действительно обязательны, а не необязательны.

person Ray    schedule 05.06.2018