Ответ 1
Имя ключа строки запроса должно соответствовать имени параметра для действия:
/API/значения? QueryString = F
public IEnumerable<string> Get(string queryString)
{
return new string[] { "value3", "value4" };
}
Я использую шаблон по умолчанию, созданный Asp.net Web Api. Я работаю с частью Get():
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
По какой-то причине я думал, что единственное, что вам нужно было сделать для доступа к строке запроса, это просто создать переменную входной строки. Поэтому я создал еще одну функцию (единственное изменение, которое я сделал) для созданного по умолчанию контроллера:
public IEnumerable<string> Get(string queryString)
{
return new string[] { "value3", "value4" };
}
Я поставил точку прерывания в обоих методах, но даже если добавить строку запроса, она всегда переходит к функции без параметров. Поэтому, если я перейду к http://mybaseurl/api/values?foo=f
он все равно будет Get() вместо get (string queryString). Разве это не работает так, как я думал? Я знаю, что могу получить доступ к строке запроса в функции Get(), используя Request.RequestUri.ParseQueryString();
, но я предпочитаю, чтобы она была разделена, если это возможно.
Имя ключа строки запроса должно соответствовать имени параметра для действия:
/API/значения? QueryString = F
public IEnumerable<string> Get(string queryString)
{
return new string[] { "value3", "value4" };
}
Несмотря на то, что ответ @Kiran Challa правильный, есть несколько ситуаций, которые вы могли бы предпочесть получить параметры URL непосредственно из URL-адреса. в этих сценариях попробуйте следующее:
using System.Net.Http;
var allUrlKeyValues = ControllerContext.Request.GetQueryNameValuePairs();
string p1Val = allUrlKeyValues.LastOrDefault(x => x.Key == "p1").Value;
string p2Val = allUrlKeyValues.LastOrDefault(x => x.Key == "p2").Value;
string p3Val = allUrlKeyValues.LastOrDefault(x => x.Key == "p3").Value;
Теперь для следующего URL-адреса p1Val будет "Apple", p2Val будет "Banana", а p3Val будет пустым.
.../api/myController?p1=Apple&p2=Banana
Спасибо за предложения, теперь исходный код этого теста находится в GitHub и он также работает и может быть протестирован на Azure: