2

デフォルトの/api/ {controller}を使用しながら、複数の「Get」メソッドを使用できるようにするのに問題がありました。これはダミーコードの例です(はい、まったく同じものが返されることを理解しています)。

エラー:"Multiple actions were found that match the request"私が行こうとすると/api/courses

行くこと/api/courses/allはうまくいきます、そしてそうします/api/courses/3

// GET api/courses
public IEnumerable<Courses> Get()
{
    return Db.Courses.OrderBy(x => x.Name);
}

// GET api/courses/all
[ActionName("all")]
public IEnumerable<Courses> GetAll()
{
    return Db.Courses.OrderBy(x => x.Name);
}

// GET api/courses/id
[ActionName("all")]
public Courses Get(int id)
{
    return Db.Courses.Where(x => x.id == id);
}

RouteConfig次のようになります:

routes.MapHttpRoute(
       "ApiControllerOnly",
       "api/{controller}"
);

// Allow for numeric Ids to be passed in
routes.MapHttpRoute(
       "ApiControllerAndIntegerId",
       "api/{controller}/{id}",
       null,
       new { id = @"^\d+$" }
);

routes.MapHttpRoute(
       "ApiControllerAction",
       "api/{controller}/{action}"
);

私がしたいのは電話です:

/api/courses - returns Get()
/api/courses/all - returns GetAll()
/api/courses/3 - returns Get(id = 3)

編集:

Puttingまた、/ api / course /のコースなど、Put、Postなどが機能するようにする必要があります。

4

1 に答える 1

4

エラー:/ api / coursesにアクセスしようとすると、「リクエストに一致する複数のアクションが見つかりました」

ルートのデフォルトのアクションを「Get」に指定することで、仕事ApiControllerOnlyに取り掛かることができました/api/courses。これはあなたのシナリオで機能しますか?

        routes.MapHttpRoute(
            name: "ApiControllerOnly",
            routeTemplate: "api/{controller}",
            defaults: new { action = "Get" }
        );

編集:

APIControllerに追加のPut/Post / etcメソッドがある場合は、ルートでの使用を検討しHttpMethodConstraint、 Put / Post / etcメソッドApiControllerOnlyに別のルート(つまりApiControllerOnly2)を追加する必要があります。

        config.Routes.MapHttpRoute(
            name: "ApiControllerOnly",
            routeTemplate: "api/{controller}",
            defaults: new { action = @"Get" },
            constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
        );

        config.Routes.MapHttpRoute(
            name: "ApiControllerOnly2",
            routeTemplate: "api/{controller}"
        );
        config.Routes.MapHttpRoute(
            name: "ApiControllerAndIntegerId",
            routeTemplate: "api/{controller}/{id}",
            defaults: null,
            constraints: new { id = @"^\d+$" }
        );

        config.Routes.MapHttpRoute(
            name: "ApiControllerAction",
            routeTemplate: "api/{controller}/{action}"
        );
于 2013-01-11T07:27:22.240 に答える