Routing 在ASP.NETWebAPI中访问查询字符串?

Routing 在ASP.NETWebAPI中访问查询字符串?,routing,query-string,asp.net-web-api,Routing,Query String,Asp.net Web Api,我使用的是Asp.net Web Api生成的默认模板。我正在使用Get()部分: //获取api/值 公共IEnumerable Get() { 返回新字符串[]{“value1”,“value2”}; } 出于某种原因,我认为访问查询字符串所要做的唯一事情就是创建一个输入字符串变量。因此,我对生成的默认控制器又创建了一个函数(我所做的唯一更改): public IEnumerable<string> Get(string queryString) {

我使用的是Asp.net Web Api生成的默认模板。我正在使用Get()部分:

//获取api/值
公共IEnumerable Get()
{
返回新字符串[]{“value1”,“value2”};
}
出于某种原因,我认为访问查询字符串所要做的唯一事情就是创建一个输入字符串变量。因此,我对生成的默认控制器又创建了一个函数(我所做的唯一更改):

        public IEnumerable<string> Get(string queryString)
    {
        return new string[] { "value3", "value4" };
    }
public IEnumerable Get(字符串查询字符串)
{
返回新字符串[]{“value3”,“value4”};
}
我在这两个方法中都设置了一个断点,但即使我添加了一个查询字符串,它也总是转到没有参数的函数。所以如果我去
http://mybaseurl/api/values?foo=f

它仍然是Get()而不是Get(字符串queryString)。这不是我想的那样吗?我知道我可以使用
Request.RequestUri.ParseQueryString()访问Get()函数中的查询字符串但如果可能的话,我更喜欢这样将其分开。

查询字符串键名称应与操作的参数名称匹配:

/api/值?queryString=f

public IEnumerable<string> Get(string queryString)
    {
        return new string[] { "value3", "value4" };
    }
public IEnumerable Get(字符串查询字符串)
{
返回新字符串[]{“value3”,“value4”};
}
即使您的答案是正确的,您也很少希望直接从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将是“苹果”,p2Val将是“香蕉”,p3Val将是空的

更新: 谢谢你的建议,现在,这个测试的源代码在 它还可以在Azure上运行和测试:


当您在路由或动态路由中使用通配符时,还有一种获取查询字符串的方法,如下所示

string query = ControllerContext.HttpContext.Request.QueryString.Value;
奖金:)


如果我两次指定相同的查询名称,我会得到一个错误500-这在HTTP中是允许的(名称可以有多个值),但这会导致
freewebapi
崩溃:你是对的@Dai必须改进代码以避免该异常。用.FirstOrDefault()或.LastOrDefault()替换.SingleOrDefault()怎么样?如果url中有“$callback”,我们如何获取它
.../api/myController?p1=Apple&p2=Banana
string query = ControllerContext.HttpContext.Request.QueryString.Value;
string path = ControllerContext.HttpContext.Request.Path.ToUriComponent();