gpt4 book ai didi

c# - Web Api 模型绑定(bind)和多态继承

转载 作者:IT王子 更新时间:2023-10-29 04:51:23 24 4
gpt4 key购买 nike

我想问是否有人知道是否可以将继承自抽象类的具体类传递给 Web Api。

例如:

public abstract class A
{
A();
}

public class B : A
{
}

[POST("api/Request/{a}")]
public class Request(A a)
{
}

目前我环顾四周,大多数解决方案似乎都说使用 TypeNameHandling 会起作用。

JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter();
jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;

然而事实并非如此。我的模型也从控制台应用程序传递到 webapi。我读到过我可以反序列化 json 对象,但在尝试了几次之后我决定这行不通。

我研究过创建一个客户模型 Binder ,但是我不想让我的应用程序变得更复杂。目前我从抽象类继承了 3 个模型,但将来可能会扩展它。正如您可能注意到的那样,添加自定义模型绑定(bind)器可能需要多个绑定(bind)器,除非有一种方法可以使一个绑定(bind)器对抽象类的所有类型通用。

为了在我的控制台应用程序中对此进行扩展,我已经实例化了类 b,然后在发布到我的 webapi 之前将其传递给 ObjectContent

item = B();

//serialize and post to web api
MediaTypeFormatter formatter;
JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter();
jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;
formatter = jsonFormatter;

_content = new ObjectContent<A>(item, formatter);
var response = _client.PostAsync("api/Request", _content).Result;

调用webapi操作时对象为空

最佳答案

如果真的想实现问题中提出的问题,可以使用自定义方法来实现。

首先,创建一个继承自 JsonConverter 的自定义 json 转换器,在其中选择一个目标类并反序列化一个实例。

然后,在您的 WebApiConfig.Register 中,将您的新转换器添加到 config.Formatters.JsonFormatter.SerializerSettings.Converters 中,享受这个怪异的 Action 。

你应该这样做吗?没有。

了解如何使用此类 API 不会给任何新用户带来任何乐趣,记录这一点并不容易,而且最重要的是 - 以这种方式实现它没有任何好处。如果输入类型不同,那么它们应该具有不同 URL 的单独 API 方法。如果只有少数属性不同 - 将它们设为可选。

为什么示例不起作用?TypeNameHandling来自 Json.NET,Web API 对此一无所知,并且类型信息不是 JSON 规范的一部分,因此没有解决此特定问题的标准方法。

关于c# - Web Api 模型绑定(bind)和多态继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17277578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com