комплексный параметр в ASP Web Api 2 GET

1

Мне нужно передать список сложных объектов в GET-Request, чтобы я мог фильтровать результаты.

Сложный объект выглядит так:

public class RecordFilter
{
    public int PageNumber {get;set;}
    public int MaxRecordsPerPage {get;set;}
    public List<FilterElement> FilterElements {get;set;}
}

public FilterElement
{
    public string Name {get;set;}
    public object Value {get;set;}
    public bool IgnoreCase {get;set;}
}

Теперь я хочу передать это как параметры в GET-Request следующим образом:

api/test/records?PageNumber=1&MaxRecordsPerPage=10&FilterElements=%7B%22Name%22%3A%22test%22%2C%20%22Value%22%3A%22x%22%2C%20%22IgnoreCase%22%3A%20true%7D

расшифровал его следующим образом:

api/test/records?PageNumber=1&MaxRecordsPerPage=10&FilterElements={"Name":"test", "Value":"x", "IgnoreCase": true}

Он добавит элемент в "FilterElements" -List, но этот элемент имеет только значения по умолчанию из конструктора (я использую [FromURI])...

Как передать список моих объектов в Webservice?

Теги:
get
asp.net-web-api2

1 ответ

0
Лучший ответ

Поместив объект JSON в свой GET-параметр, вы неправильно используете метод GET. Согласно w3c, методы GET должны использоваться только для извлечения данных из веб-службы (см. W3schools.com)

Хотя это может быть вопросом стиля, существует еще одна практическая причина не помещать "полезную нагрузку" в параметр URL: URL-адрес имеет ограничения по длине. Размер списка, который вы передаете, может отличаться, и вы не знаете наверняка, если сериализованный список JSON будет всегда короче, чем максимальная длина URL-адреса (примерно 2000 символов, кстати)

Мое предложение состоит в том, что вы создаете метод GET и POST на вашем веб-сервисе. Вы передаете список FilterElement службе, вызывая метод POST от вашего клиента следующим образом:

using (var wb = new WebClient())
{        
    string url = "api/test/records"; //the URL to your web service
    var response = wb.UploadValues(url, "POST", FilterElements); //FilterElements being a list of objects you want to pass
}

Затем вы сохраняете список в сеансе веб-сервисов (как показано здесь). (В этом примере используются примитивные типы, но сеанс также работает для сложных типов).

В методе GET вы читаете список из сеанса, выполняете личную фильтрацию и возвращаете отфильтрованный список.

  • 0
    это решение отлично и именно то, что я искал!
  • 0
    Последний вопрос о сессии. Я использовал сессию так: _session = SessionStateUtility.GetHttpSessionStateFromContext (HttpContext.Current); но когда я помещаю некоторые значения в сессию, их больше нет после того, как я сделал следующий вызов webservice. Я помещаю это в global.aspx защищенный void Application_PostAuthorizeRequest () {HttpContext.Current.SetSessionStateBehavior (System.Web.SessionState.SessionStateBehavior.Required);}
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню