58

Asp.net Web Api によって生成された既定のテンプレートを使用しています。私は Get() 部分で作業しています:

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

何らかの理由で、クエリ文字列にアクセスするために必要な唯一のことは、入力文字列変数を作成することだけだと思いました。だから私は生成されたデフォルトのコントローラーにもう1つの関数(私が行った唯一の変更)を作成しました:

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

両方のメソッドにブレークポイントを配置しましたが、クエリ文字列を追加しても、常にパラメーターのない関数に移動します。したがって、私がhttp://mybaseurl/api/values?foo=f それに行くと、get(string queryString) の代わりに Get() になります。思った通りにいかない?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/値? queryString=f

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