asp.net-web-api - Web API 中的多态性 : Single endpoint possible?

标签 asp.net-web-api

我意识到 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 中工作,您需要启用类型名称处理并且数据必须包含类型信息。

您需要打开 TypeNameHandlingWebApiConfig.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/

相关文章:

asp.net - OData 和 Entity Framework 不同模型映射

asp.net-web-api - 在 WebApi2 项目中使用 CacheOutput 属性时解决依赖关系失败

javascript - 如何从 API JSON 数据创建下拉菜单

json - 如何让 JSON.NET 将日期/时间序列化为 ISO 8601?

c# - 使用 Simple Injector 和 IHttpControllerActivator 解决 ASP.NET Web API 中的依赖关系

javascript - Backbone.js 模板不从模型继承属性

http - 如何从 HttpResponseMessage 获取当前的 cookie/ session ID?

asp.net-web-api - 在 WebAPI 中的查询字符串中传递并验证 OWIN Bearer token

asp.net-web-api - 你能告诉我IExceptionhandler的优点和缺点吗?

javascript - 使用站点身份验证 cookie 的摘要进行 CSRF