Asp.net web api Web API中的多态性:单端点可能吗?

Asp.net web api Web API中的多态性:单端点可能吗?,asp.net-web-api,Asp.net Web Api,我意识到WebAPI是以REST为中心的,但我仍然希望配置一个可以处理命令/响应场景的控制器方法。到目前为止我还没有成功。。。有没有办法让单个API端点识别以下类结构 [Serializable] public abstract class Command{ public int CommandId{get; set;} } [Serializable] public class RegisterNewPersonCommand:Command{ public string Nam

我意识到WebAPI是以REST为中心的,但我仍然希望配置一个可以处理命令/响应场景的控制器方法。到目前为止我还没有成功。。。有没有办法让单个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]
类型也受支持…)有什么具体原因吗?

即使它可以工作,这如何帮助重用任何代码?我想减少控制器中的代码。而不是命令的每个子类的样板方法(
HandleNewUserCommand(NewUserCommand){},HandleUserPasswordChangeCommand(UserPasswordChangeCommand){}',等等),单个
HandleCommand`方法将负责使用反射和IoC将命令传递到适当的域逻辑。这似乎是正确的想法。有没有办法将HttpClient配置为包含$type信息?在我的测试中,
var task=client.PostAsJsonAsync(“api/commands/handlecommand”,testCommand)
在序列化为json时不包含$type信息。这回答了我的问题,并帮助我了解如何在客户端指定格式。最简单的客户端代码看起来像:
private void-SendCommand(Command-Command){var-json=new-JsonMediaTypeFormatter{SerializerSettings={typenameholding=typenameholding.All};var-response=client.PostAsync(“api/commands/handlecommand”,Command,json).Result;//handle-response}
这对我很有帮助。。我必须在互联网上搜索的另一件事是,接口是不可序列化的,这一点我永远都知道,但由于.Net中Json序列化的魔力,我似乎忘记了:)所以没有ICollection,IEnumerable,而是使用List等等。。。现在多态序列化正在工作:),现在我想知道是否应该将DTO的:p
TypeNameHandling.Auto
更好些,因为它在与字段/属性的类型匹配时不会写入实例类型名,这通常是大多数类型的情况。