1

WebApiConfig.cs で次の 2 つのルートが定義されています。

    config.Routes.MapHttpRoute(
        name: "DefaultApiWithAction",
        routeTemplate: "api/{controller}/{action}/{id}"
    );

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

サーバーでは、次の 2 つの方法があります。

public IEnumerable<SampleForm> Get()
{
    // do stuff
}

public IEnumerable<SampleForm> GetSampleFormsByState([FromUri]string[] state)
{
    // do stuff
}

「リクエストに一致する複数のアクションが見つかりました」というエラーが表示され、これら 2 つの方法を指摘しています。リクエストは次のようなものです。

http://localhost/tracker/api/sampleform?state[]=pending&state[]=rejected&state[]=removed

興味深いのは、2 番目の方法を次のように変更した場合です。

public IEnumerable<SampleForm> GetSampleFormsByState(string state)
{
    // do stuff
}

次のようなリクエストを行います。

http://localhost/tracker/api/sampleform?state=pending

問題はない。

何が起こっている?ルーティングが失敗する原因となるアレイの原因は何ですか? 私は何をする必要がありますか?

4

1 に答える 1

0

string[]複合型です。[FromUri]それが、バインディングを機能させるために使用しなければならなかったまさにその理由です。したがって、次の両方のメソッドを Web API で選択して、複合型パラメーター バインディングを使用して HTTP GET を処理できます。

public IEnumerable<SampleForm> Get() { }
public IEnumerable<SampleForm> GetSampleFormsByState([FromUri]string[] state) { }

署名の 1 つをstring単純な型である に変更すると、複雑な型に対して 2 つの GET メソッドを使用する必要がなくなり、Web API はアクション メソッドを混乱なく選択できるようになります。

この問題を回避するには、このように GET を処理するアクション メソッドを 1 つだけ定義します。

public IEnumerable<SampleForm> Get([FromUri]string[] state) { }

state != null && state.Length > 0アクション メソッドでは、フィルターでリクエストからの状態データを使用するようにチェックするだけです。

于 2013-09-20T04:24:46.920 に答える