我正在使用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)。它不像我想的那样工作吗?我知道我可以使用Request.RequestUri.ParseQueryString();
访问Get()函数中的查询字符串,但如果可能的话,我更喜欢将它分开。
答案 0 :(得分:52)
即使@Kiran Challa的回答是正确的,但您可能更倾向于直接从网址获取网址参数。在这些情况下,试试这个:
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;
现在对于以下网址,p1Val将是&#34; Apple&#34;,p2Val将是&#34; Banana&#34;,p3Val将 null 。
.../api/myController?p1=Apple&p2=Banana
感谢您的建议,现在,此测试的源代码位于GitHub 它也可以在Azure上运行并进行测试:
答案 1 :(得分:38)
查询字符串键名称应与操作的参数名称匹配:
/ API /值?的的queryString = F 强>
public IEnumerable<string> Get(string queryString)
{
return new string[] { "value3", "value4" };
}
答案 2 :(得分:0)
在路由或动态路由中使用通配符时,还有另一种获取查询字符串的方法,如下所示。
string query = ControllerContext.HttpContext.Request.QueryString.Value;
奖金:)
string path = ControllerContext.HttpContext.Request.Path.ToUriComponent();