0

通話時

http://mysite.com/Project/42

以下のルーティングとメソッドについては、「要求に一致する複数のアクションが見つかりました...Get(Int32)...Children(Int32)」が表示されます

通話中

http://mysite.com/Project/42/Children

正しく戻ります。

私のルーティングは次のとおりです。

config.Routes.MapHttpRoute(
    name: "ForChildren",
    routeTemplate: "api/{controller}/{id}/Children",
    defaults: new { action = "Children" }
);

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

そして私の方法:

public class ProjectController : ApiController {

    public IEnumerable<Project> Get(int id){
        ...
    }

    [HttpGet]
    public IEnumerable<Project> Children(int id) {
        ...
    }
}

アクションを指定しないと、Webapi がデフォルトでメソッド (GET) になると思いました。現在、Webapi は名前を無視してメソッドを実行しているように見え、パラメーターの一致のみを探しています。私は本当にそれを信じていません。

4

3 に答える 3

1

これは、アクションの選択が Web API で現在どのように機能するかに関する既知の動作/問題です。リクエストが ' http://mysite.com/Project/42 ' であるシナリオでは、リクエストは'DefaultApi' ルートに一致し、アクションの選択中にアクション セレクターに必要な変数 'action' の値がないため、 GET メソッドを介して到達できる利用可能なアクションのリストから把握しようとします。ルート パラメーター (ここでは「id」など) とクエリ文字列パラメーターに基づいて、se から最適なアクションを見つけようとします。あなたのシナリオでは、アクション セレクターは、それぞれが id パラメーターを受け入れる 2 つの get アクションを確認するため、それらを選択する際にあいまいさが見られます。

あなたのシナリオに似た問題が現在ここに提出されています: http://aspnetwebstack.codeplex.com/workitem/184

于 2013-05-10T22:30:38.520 に答える
1

これに対する簡単な解決策は、ルートを 1 つだけにすることです。

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

次に、デフォルトのアクションを装飾します。

public class ProjectController : ApiController {

    [ActionName("DefaultAction")]
    public IEnumerable<Project> Get(){
        // api/project
        // Return all projects
    }

    [HttpGet]
    public IEnumerable<Project> Children(int id) {
        // api/project/1/children 
        // Return children of project with id == 1
    }
}
于 2013-05-11T10:53:29.033 に答える