2016-10-24 1 views
0

Я пытаюсь создать конечную точку RESTApi, где пользователи могут отправлять несколько идентификаторов для фильтрации определенных ресурсов.WebAPI Modelbinding - [FromUri] не работает над перечислениями гидов

Поэтому я создал объект запроса, который можно использовать повторно в моем собственном проекте, чтобы все было просто (по крайней мере для меня).

При создании запроса QueryString GET-запросов я проверяю свойства request-ojects для beeing IEnumerable. Если это так, я добавлю следующие значения:

var collection = new NameValueCollection(); 
foreach (var pi in request.GetType().GetProperties().Where(p => p.CanRead && p.CanWrite)) 
{ 
    var propVal = pi.GetValue(request, null); 
    if (propVal == null) 
     continue; 

    if (pi.PropertyType.IsArray || typeof(IEnumerable).IsAssignableFrom(pi.PropertyType)) 
    { 
     var enumerable = propVal as IEnumerable; 
     if (enumerable != null) 
     { 
      foreach (var singleValue in enumerable) 
      { 
       collection.Add(pi.Name, singleValue.ToString()); 
      } 
     } 
    } 
    else 
    { 
     collection.Add(pi.Name, propVal.ToString()); 
    } 
} 
return collection; 

, который построит меня примерно так, например.

http://localhost/API/Reporting/EndPoint?Ids=b94a3f1b-15cd-4feb-ac34-bd58bc1c3c2b,77dc84ac-4d48-4cbd-ba12-9de3108a5747

конечная точка принимает запрос-строительный объект его из Ури с помощью атрибута [FromUri].

public TheResponse EndPoint([FromUri] TheRequest request) 

тогда TheRequest имеет свойство типа IEnumerable<Guid> Ids {get;set;}.

Однако свойство Ids всегда является пустым массивом с пустым Guid.

Как это можно достичь? Мне нужна индивидуальная привязка модели здесь?

В соответствии с просьбой, это как мой запрос-объект выглядит следующим образом:

public class TheRequest 
{ 
    public IEnumerable<Guid> Ids { get; set; } 
} 
+0

Пожалуйста, добавьте полный код TheRequest. – Sefa

+0

Это может быть достигнуто с помощью специальной модели-связующего. – Nkosi

+0

@Nkosi вы могли бы предоставить ссылку, с которой начать или указать мне какое-то направление на то, как следует внедрять модель-связующее? – KingKerosin

ответ

1

Теперь я издевался до теста интеграции на основе этой ситуации. Модель связующего по умолчанию [FromUri] испытывает проблемы связывания Guid с, как вы в настоящее время их в строке запроса, поскольку она читает ему только один длинную строку

94a3f1b-15cd-4feb-ac34-bd58bc1c3c2b,77dc84ac-4d48-4cbd-ba12-9de3108a5747

, которые он не может разобрать на действительный Guid. Следовательно, коллекция с одним пустым Guid (по умолчанию (Guid)).

Но если строка запроса при условии, как это:

/API/Отчетность/EndPoint Идентификаторы = b94a3f1b-15cd-4feb-ac34-bd58bc1c3c2b & Идентификаторы = 77dc84ac-4d48-4cbd-ba12-9de3108a5747

, разделив их на отдельные параметры ?Ids={guid}&Ids={guid} и протестируйте его, обратите внимание, что конечная точка будет вызываться с заданными параметрами.

Так что либо измените способ создания URL-адреса, либо, если текущий формат не может быть изменен, затем создайте собственное связующее устройство для интерпретации строки запроса по желанию.

Для пользовательской модели связующего начать здесь Parameter Binding in ASP.NET Web API

Смежные вопросы