MSDN でこのドキュメントを調べましたが、答えがわかりません。
次のように定義されたルートがあることを考慮してください。
config.Routes.MapHttpRoute(
name: "DefaultWithActionAndID",
routeTemplate: "v{version}/{controller}/{action}/{id}",
defaults: null,
constraints: new {
action = @"[a-zA-Z]+",
id = @"\d+"
}
);
config.Routes.MapHttpRoute(
name: "DefaultWithID",
routeTemplate: "v{version}/{controller}/{id}",
defaults: null,
constraints: new {
id = @"\d+"
}
);
config.Routes.MapHttpRoute(
name: "DefaultWithoutActionOrId",
routeTemplate: "v{version}/{controller}",
defaults: null,
);
これで、次のような 2 つのコントローラーができました。
public class ItemController:ApiController{
[HttpGet]
public Item Get(int id){}
[HttpGet]
public Item GetSomething(int id){}
[HttpPut]
public Item Put(Item newItem){}
}
public class AnotherController:ApiController{
[HttpPut]
public HttpResponseMessage Put(Something item){}
}
次のように、これらすべてのエンドポイントを呼び出せるようにしたいと思います。
GET /api/Item/344
GET /api/Item?id=344
GET /api/Item/Something/2334
GET /api/Item/Something?id=2334
PUT /api/Item body={newItem}
PUT /api/Another body={newSomething}
これは機能しますが、デフォルトのアクション名として「Get」を追加した場合のみです。ルートでデフォルトのアクション名を指定しないと、一致する複数のアクション名についてエラーが発生します。デフォルトのアクション名を追加すると、アクション名がデフォルトと一致せず見つからないため、エラーなしで PUT() メソッドに PUT を呼び出すことはできません。
// Will work in some cases, but not all
config.Routes.MapHttpRoute(
name: "DefaultWithID",
routeTemplate: "v{version}/{controller}/{id}",
defaults: new {
action="Get",
id=RouteParameters.Optional
},
constraints: new {
id = @"\d+"
}
);
// Works
GET /api/Item/344
GET /api/Item?id=344
GET /api/Item/Something/2334
GET /api/Item/Something?id=2334
// Doesn't work
PUT /api/Item body={newItem}
PUT /api/Another body={newSomething}
HTTP 動詞に一致する名前のアクションを使用するようルーティングに指示するにはどうすればよいですか (使用する前に存在する場合)。