web-dev-qa-db-ja.com

ASP.Net Web Apiのクエリ文字列にアクセスしますか?

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()になります。思ったように機能しませんか? Request.RequestUri.ParseQueryString();を使用してGet()関数のクエリ文字列にアクセスできることは知っていますが、可能であればこのように分離することを好みます。

39
coding4fun

クエリ文字列のキー名は、アクションのパラメーター名と一致する必要があります。

/ api/values?queryString = f

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

@ 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上でも実行され、テストできます。

53
Tohid