0

私は WebApi を初めて使用し、パラメーターのマッピングを理解していません。2 つのパラメーターを持つ HttpGet メソッドを持つコントローラーがありました。のように定義された WebApiConfig マッピングで

config.Routes.MapHttpRoute(
                name: "MyActionApi",
                routeTemplate: "api/{controller}/{action}/{p},{q}");

これはうまくいくように見えました。

同様に、3 つのパラメーター HttpGet メソッドを持つ別のコントローラー (DetailsController) を追加しました。

私は追加しました

config.Routes.MapHttpRoute(
                name: "MyActionApi2",
                routeTemplate: "api/{controller}/{action}/{p},{q},{r}");

しかし、に移動する

http://mysite/api/Details/CrossReport/12,14,Peter

404エラーを出し、言う

要求に一致するコントローラー「詳細」でアクションが見つかりませんでした。

しかし、このようにナビゲートします

http://mysite/api/Details/FilterByDate/12,14?q=10

正しい結果が得られます。

何故ですか?最初のケースのように、カンマで区切ってください。そして、最初のケースでは機能するのに、2番目のケースでは機能しないのはなぜですか?

作業コントローラーのメソッド:

public IEnumerable<Order> FilterByDate(DateTime dateStart, DateTime dateEnd).

動作していません:

public IEnumerable<Detail> FilterByDate(DateTime dateStart, DateTime dateEnd, int maxCount)

どちらにも HttpGet 属性があります。

4

3 に答える 3

1

1 つの考えとして、ルーティング構成で MyActionApi の前に MyActionApi2 があることを確認しましたか? 私が間違っていなければ、最初に一致する可能性のあるものを探します...したがって、MyActionApiは一致します(3つのパラメーターがあっても)

于 2014-08-27T17:21:31.090 に答える
1

一致するアクションを定義する必要があります。DetailsController クラスに次のシグネチャを持つアクションを追加してみてください。

[HttpGet]
public IEnumerable<Detail> CrossReport(string p, string q, string r)

ご覧のとおり、アクション名とパラメーター名は、ルートにあるものと一致する必要があります。

于 2013-01-15T18:13:48.103 に答える
0

WebApi には、routes のパラメーターと body/url のパラメーターの 2 種類のパラメーターがあります。

ルート内のパラメータ

この例では、id パラメータはルートにあります。

http://mysite/api/Details/CrossReport/{id}

ルート パラメータは「/」で区切られており、ルートの一部があります。

http://mysite/api/Details/CrossReport/{id}/{name}/{detailId}

Web API コントローラーでは、次のようにする必要があります。

public IEnumerable<Order> FilterByDate(int id, string name, int detailId)

本文/URL のパラメータ

url のパラメーターは & で区切られており、このすべてのパラメーターは ? の後にあります。ルート中。例えば。

http://mysite/api/Details/CrossReport?id=3&name="john"&detailId=5

そして、あなたのWeb APIコントローラーでは同じです:

public IEnumerable<Order> FilterByDate(int id, string name, int detailId)

オブジェクトが他のプロパティによって複合されている場合:

public class MyObject 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

メッセージの本文に含めることができるのは 1 つだけです。メッセージの本文を送信し、Web API コントローラーがそれらを受信する必要があります。

public IEnumerable<Order> FilterByDate(MyObject obj)
于 2016-10-11T12:00:10.863 に答える