Поведение, которое вы замечаете, больше связано с выбором действия и привязкой модели, а не с маршрутизацией атрибутов.
Если вы ожидаете, что идентификаторы будут поступать из строки запроса, измените шаблон маршрута, как показано ниже (поскольку способ, которым вы его определили, делает идентификаторы обязательными в пути uri):
[HttpPost("api/set/copy")]
Глядя на ваш второй вопрос, хотите ли вы принять список идентификаторов внутри самого uri, например api/set/copy/[1,2,3]
? если да, я не думаю, что веб-API имеет встроенную поддержку такого типа привязки модели.
Вы можете реализовать привязку настраиваемого параметра, как показано ниже, для ее достижения (я предполагаю, что есть и другие лучшие способы добиться этого, например, с помощью связывателей моделей и поставщиков значений, но я мало о них знаю... так что вам, вероятно, потребуется изучить эти варианты тоже):
[HttpPost("api/set/copy/{ids}")]
public HttpResponseMessage CopySet([CustomParamBinding]int[] ids)
Пример:
[AttributeUsage(AttributeTargets.Parameter, Inherited = false, AllowMultiple = false)]
public class CustomParamBindingAttribute : ParameterBindingAttribute
{
public override HttpParameterBinding GetBinding(HttpParameterDescriptor paramDesc)
{
return new CustomParamBinding(paramDesc);
}
}
public class CustomParamBinding : HttpParameterBinding
{
public CustomParamBinding(HttpParameterDescriptor paramDesc) : base(paramDesc) { }
public override bool WillReadBody
{
get
{
return false;
}
}
public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext,
CancellationToken cancellationToken)
{
//TODO: VALIDATION & ERROR CHECKS
string idsAsString = actionContext.Request.GetRouteData().Values["ids"].ToString();
idsAsString = idsAsString.Trim('[', ']');
IEnumerable<string> ids = idsAsString.Split(',');
ids = ids.Where(str => !string.IsNullOrEmpty(str));
IEnumerable<int> idList = ids.Select(strId =>
{
if (string.IsNullOrEmpty(strId)) return -1;
return Convert.ToInt32(strId);
}).ToArray();
SetValue(actionContext, idList);
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
tcs.SetResult(null);
return tcs.Task;
}
}
person
Kiran Challa
schedule
22.07.2013