在ASP.Net Web Api中访问查询字符串?

cod*_*fun 42 routing query-string asp.net-web-api

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

        // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我认为访问查询字符串的唯一方法就是创建一个输入字符串变量.所以我创建了另一个函数(我做的唯一更改)到生成的默认控制器:

        public IEnumerable<string> Get(string queryString)
    {
        return new string[] { "value3", "value4" };
    }
Run Code Online (Sandbox Code Playgroud)

我在两种方法中都设置了一个断点,但即使我添加一个查询字符串,它总是会转到没有参数的函数.所以,如果我去http://mybaseurl/api/values?foo=f 它仍然是Get()而不是get(string queryString).它不像我想的那样工作吗?我知道我可以使用Get()函数访问查询字符串Request.RequestUri.ParseQueryString();但是如果可能的话我更喜欢将它分开.

Toh*_*hid 57

尽管@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;
Run Code Online (Sandbox Code Playgroud)

现在对于以下URL,p1Val将为"Apple",p2Val将为"Banana",p3Val将为null.

.../api/myController?p1=Apple&p2=Banana
Run Code Online (Sandbox Code Playgroud)

更新:

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

  • 如果我两次指定相同的查询名称,则会收到错误 500 - 这在 HTTP 中是允许的(名称可以有多个值),但它会使 `freewebapi` 崩溃:http://freewebapi.azurewebsites.net/api/values?p1=苹果&amp;p2=香蕉&amp;p1=Foo (2认同)

Kir*_*lla 41

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

/ API /值?的queryString = F

public IEnumerable<string> Get(string queryString)
    {
        return new string[] { "value3", "value4" };
    }
Run Code Online (Sandbox Code Playgroud)