58

我正在使用由 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() 函数访问查询字符串,Request.RequestUri.ParseQueryString();但如果可能的话,我更喜欢这样分开。

4

3 回答 3

66

即使@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 将为null

.../api/myController?p1=Apple&p2=Banana

更新:

感谢您的建议,现在,此测试的源代码在GitHub中 ,它也可以在 Azure 上运行和测试:

于 2014-03-16T02:49:41.373 回答
51

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

/api/值?查询字符串=f

public IEnumerable<string> Get(string queryString)
    {
        return new string[] { "value3", "value4" };
    }
于 2012-08-24T03:42:37.107 回答
1

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

string query = ControllerContext.HttpContext.Request.QueryString.Value;

奖金:)

string path = ControllerContext.HttpContext.Request.Path.ToUriComponent();
于 2020-05-01T11:48:17.733 回答