Подтвердить что ты не робот

Полиморфизм в веб-API: возможна ли единая конечная точка?

Я понимаю, что веб-API ориентирован на REST, но мне все же хотелось бы настроить один метод контроллера, который может обрабатывать сценарий Command/Response. До сих пор я не был успешным... есть ли способ, чтобы следующая классная структура была признана одной конечной точкой API?

[Serializable]
public abstract class Command{
    public int CommandId{get; set;}
}
[Serializable]
public class RegisterNewPersonCommand:Command{
   public string Name{get; set;}
}
//etc... various Command subclasses. Similar thing for Responses.

//now have a single endpoint to Handle Commands
public class CommandsController : ApiController{
   public Response HandleCommand(Command command){
      //handle Command based on which subclass it is
      //return appropriate Response subclass
   }
}

До сих пор не кажется, что система сериализации может обрабатывать этот сценарий, но я надеюсь, что кто-то там нашел способ сделать это:)

4b9b3361

Ответ 1

Чтобы полиморфизм работал в веб-API, вам нужно включить обработку имен имен, и данные должны содержать информацию о типе.

Вам нужно включить TypeNameHandling в WebApiConfig.cs, если вы используете JSON в своем сценарии:

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = 
    Newtonsoft.Json.TypeNameHandling.All;

Затем тело контента, которое вы отправляете в действие HandleCommand(...), должно содержать информацию о типе:

{"$type":"MvcApplication.Models.RegisterNewPersonCommand, MvcApplication", ... }

Для XML вам необходимо использовать DataContract KnownType...

Кстати, существует ли какая-то конкретная причина, по которой вы используете [Serializable] (поскольку также поддерживаются типы POCO и [DataContract]...)?