将 class 作为 Web API 中的模型

Base class as model in Web API

假设我有以下 class 结构:

public abstract class BaseModel
{
    public string Name {get;set;}
}

public class ExtendedOne : BaseModel
{
    prop string Prop1 {get;set;}
}

public class ExtendedTwo : BaseModel
{
    prop string AnotherProp {get;set;}
}

然后我有以下 Web API 端点:

[Route("api/Test")
public IHttpActionResult Post(BaseModel model)
{
    //Do work
}

我希望客户端能够 post 每个扩展 classes 的实例到此端点。

当我尝试这个时,模型只是空的。

我正在尝试的可行吗?

  1. 是否可以:

Web的架构应该可以实现api。

Web api 并不真正关心您在输入中定义的 class。它接收(大部分)格式为 JSON 的数据。如果您查看 fiddler 请求,class 的名称不会发送到网络 api。这将是一个简单的 Json,看起来像

POST http://localhost/api/Values/SomeMethod HTTP/1.1
User-Agent: Fiddler
Host: localhost:49946
Content-Length: 63
Content-Type: application/json; charset=utf-8

{
    name: "Some Name"
}

管道中存在的媒体格式化程序将看到名称 属性 存在,并将创建一个 BaseModel 对象。他们通常会忽略其他属性,因此它应该适用于继承的 classes.

  1. 可能出错的地方:

从包含的代码片段中,我们无法得到它为什么不起作用的提示。可能您需要包含更多代码。但是,一种可能是:如果你使用派生class,而没有设置派生class的Name属性。 像

var extended = new ExtendedOne{Prop1="Value1"}// Name is left out

在这种情况下,如果 json 序列化程序配置为省略空值(在这种情况下为名称),发送到网络 api 的 json 可能类似于

POST http://localhost/api/Values/SomeMethod HTTP/1.1
User-Agent: Fiddler
Host: localhost:49946
Content-Length: 63
Content-Type: application/json; charset=utf-8

{
    prop1: "Value1"
}

由于 Name 不存在,webapi 认为它是不同的东西,不构建模型并将模型设置为 null。您可以通过简单地查看提琴手中传递的内容来检测您的问题是什么。

这不起作用,因为 BaseModel 是抽象的。 WebApi 正在尝试将模型参数反序列化为 BaseClass 实例,但无法实例化,因为它是抽象的。 Web Api 对派生的 类 一无所知。它只知道它认为代表一个 BaseClass 实例的 JSON,这个实例又是无效的,因为它是抽象的。