Маршрут к различным действиям, основанным на значении json

Я хотел бы перенаправить запросы на разные действия на основе значения конкретного json-параметра.

Например, учитывая следующие данные json:

{ type: "type1", type1data: "type1value" } 

а также

 { type: "type2", type2data: "type2value" } 

Я бы хотел иметь 2 разных действия на моем ApiController:

 void CreateType1(string type1data) { // ... } void CreateType2(string type2data) { //... } 

Как это можно сделать?

Обновить:

Я хотел бы иметь тот же URL, если это возможно. Что-то вроде /objects/create .

Я бы скорее использовал пользовательский 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); } } 

Вот модель. Я дал ему странное имя Абака.

 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()); } } 

Если теперь вы используете POST для http: // localhost: port / api / yourapicontroller, в зависимости от значения в поле типа в JSON, будет выбран метод действия Create *.

Что-то вроде этого. Для простоты этот пример не является правильной асинхронной реализацией.

 using System.Net.Http; using System.Web.Http; namespace MyApi.Controllers { public class MyType { public string type {get; set;} } public class MyType1 { public string type {get; set;} public string type1data {get; set;} } public class MyType2 { public string type {get; set;} public string type2data {get; set;} } public class ObjectsController : ApiController { // // api/objects/create // public void Create() { // buffer the content to allow the dual reads below Request.Content.LoadIntoBufferAsync().Wait(); // get the body as a object so we can access its type property MyType postedObject = Request.Content.ReadAsAsync().Result; // decide switch (postedObject.type) { case "type1": CreateType1(Request.Content.ReadAsAsync().Result.type1data); break; case "type2": CreateType2(Request.Content.ReadAsAsync().Result.type2data); break; default: // 400 Bad Request would be best, I think. break; } } private void CreateType1(string type1data) { // ... } private void CreateType2(string type2data) { // ... } } }