当传入的通知具有不同的 JSON 结构时,如何在 MVC 5 中编写控制器方法?

问题描述

我正在尝试在 MVC 5 中编写一个 webhook 接收服务来接收来自 GoToConnect webapi 的通知

来自其服务器的 webhook 通知具有标准的包装结构。

{
  "source": "messaging","type": "message","content": {object}
}

但是,内容值可以是多种通知类型之一,这些通知都具有不同的结构,可以通过“类型”字段中的值进行识别。我的问题是在传入的 json 结构可能完全不同时找到一种进行模型绑定的方法

如果我可以访问原始 json 文件,我可以使用 switch 语句根据类型值手动反序列化传入的内容,但我很难找到一种简单的方法来做到这一点。是否已经有一种方法可以控制模型绑定,以便我可以选择创建的对象,然后使用继承将它们组合在一起,或者是否有一种简单的方法可以将原始 json 作为参数传递给控制器​​方法

解决方法

所以,通过更多的研究,我找到了问题的答案。

首先,我为每个通知内容类型创建了类,其中包含一个空标记接口以及一个包含 Type 和具有该接口类型的属性的包装类。

然后,我通过扩展 DefaultModelBinder 类构建了一个自定义模型绑定器。在 BindModel 方法中,我使用传入通知的 Type 值来实例化我想要的特定通知内容对象。我将该对象存储在接口类型属性中,然后将其返回。

之后,我可以通过将 Interface Type 属性转换为我在控制器方法中想要的特定类型来访问该数据。