カスタムの ApiControllerActionSelector を使用したいと思います。
public class MyActionSelector : ApiControllerActionSelector
{
public override HttpActionDescriptor SelectAction(
HttpControllerContext context)
{
HttpMessageContent requestContent = new HttpMessageContent(
context.Request);
var json = requestContent.HttpRequestMessage.Content
.ReadAsStringAsync().Result;
string type = (string)JObject.Parse(json)["type"];
var actionMethod = context.ControllerDescriptor.ControllerType
.GetMethods(BindingFlags.Instance | BindingFlags.Public)
.FirstOrDefault(m => m.Name == "Create" + type);
if (actionMethod != null)
{
return new ReflectedHttpActionDescriptor(
context.ControllerDescriptor, actionMethod);
}
return base.SelectAction(context);
}
}
モデルはこちら。Abcという変な名前を付けました。
public class Abc
{
public string Type { get; set; }
public string Type1Data { get; set; }
}
アクションメソッドはこちら。
public void Createtype1(Abc a)
{
}
最後に、アクション セレクターをプラグインします。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Services.Replace(typeof(IHttpActionSelector),
new MyActionSelector());
}
}
ここで http://localhost:port/api/yourapicontroller に POST すると、JSON の type フィールドの値に応じて、アクション メソッド Create* が選択されます。