我意识到Web 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 } }
到目前为止,似乎序列化系统似乎不能处理这种情况,但希望有人能找到一种方法:)
解决方法
为了使多态性在Web API中工作,您需要启用类型名称处理,并且数据必须包含类型信息.
如果您在场景中使用JSON,则需要在WebApiConfig.cs中打开TypeNameHandling:
config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.All;
然后,您发送到您的HandleCommand(…)操作的内容正文必须包含类型信息:
{"$type":"MvcApplication.Models.RegisterNewPersonCommand,MvcApplication",... }
对于XML,您需要使用DataContract的KnownType …
顺便提一下,是否有任何具体的原因您使用[Serializable](因为POCO类型和[DataContract]类型也被支持…)?