Я создаю API с контроллером с одним действием GET:
[Route("api/xxxxx/{param1:int}/{param1:int}")]
public IHttpActionResult Get(int param1, int param2) {
// method body...
}
URL-адреса будут в следующем формате:
/api/xxxxx/1/1?p1=5&p2=hello&p3=20161108
/api/xxxxx/1/1?p1=active
Количество и имена параметров строки запроса могут различаться.
Я хочу передать параметры строки запроса в метод контроллера, но я не могу жестко закодировать их в сигнатуре метода из-за разных имен и номеров. Есть ли способ сделать это? Я пытался вызвать var qsParams = ControllerContext.Request.GetQueryNameValuePairs();
, но получаю сообщение об ошибке "ресурс не найден" при попытке запросить любой URL-адрес со строкой запроса с учетом показанного выше атрибута Route
.
Я придумал одну альтернативу: использовать значения маршрута вместо параметров строки запроса, затем использовать универсальный {*tags}
и передать его как параметр метода:
[Route("api/xxxxx/{param1:int}/{param1:int}/{*tags}")]
public IHttpActionResult Get(int param1, int param2, string tags) {
// method body...
}
С URL-адресами в формате
/api/xxxxx/1/1/5/john/20161108
/api/xxxxx/1/1/active
Это работает, но я бы предпочел использовать строку запроса, чтобы иметь возможность использовать именованные ключи, вместо того, чтобы полагаться на порядок параметров (кроме того, использование строки запроса, похоже, лучше концептуально соответствует тому, что я делаю).
Итак, как я могу передать переменные параметры строки запроса в действие контроллера? Я говорю «передать» параметры, но их не обязательно нужно передавать в качестве параметров метода, если я могу получить доступ к параметрам строки запроса из тела метода, получая при этом URL-адрес со строкой запроса для разрешения в рассматриваемое действие.
РЕДАКТИРОВАТЬ:
Стоит отметить, что создание нескольких методов действия для каждого возможного набора параметров не является вариантом.
РЕДАКТИРОВАТЬ 2:
Я вижу два прямых решения, если они возможны:
- Передайте всю строку запроса методу действия в виде одного строкового параметра. Затем я мог бы вручную проанализировать строку запроса.
- Иметь возможность использовать
ControllerContext.Request.GetQueryNameValuePairs()
внутри тела метода, НЕ добавляя соответствующие параметры в сигнатуру метода.
Тем не менее, я не понял, возможны ли эти две вещи, хотя вполне вероятно, что одна из них или обе.