我意识到 Web API 以 REST 为重点,但我仍然想配置一个可以处理命令/响应场景的 Controller 方法。到目前为止,我还没有成功……有没有办法让单个 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 中工作,您需要启用类型名称处理并且数据必须包含类型信息。
您需要打开 TypeNameHandling
在 WebApiConfig.cs
如果您在场景中使用 JSON:
config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling =
Newtonsoft.Json.TypeNameHandling.All;
然后,您发送到您的
HandleCommand(...)
的内容正文操作必须包含类型信息:{"$type":"MvcApplication.Models.RegisterNewPersonCommand, MvcApplication", ... }
对于 XML,您需要使用 DataContract 的已知类型...
顺便说一下,您使用
[Serializable]
有什么特别的原因吗? (因为还支持 POCO 类型和 [DataContract]
类型...)?
关于asp.net-web-api - Web API 中的多态性 : Single endpoint possible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13609579/