如何从继承的 FromBody 模型中获取正确的类型?

2024-04-20

正文的帖子有几种不同的 XML 传入。所有 XMLS 几乎都是相同的,因此我首先添加一个基类,其他 XMLS 继承自该基类。

这是模型:

[XmlInclude(typeof(TextMsg))]
[XmlRoot("xml")]        
public class BaseClass
{
    public string ToUserName { get; set; }
    public string FromUserName { get; set; }
    public string CreateTime { get; set; }
    public string MsgType { get; set; }            
}        
[XmlRoot("xml")]        
public class TextMsg : BaseClass
{
    public TextMsg()
    {
        MsgType = "text";
    }
    public string Content { get; set; }
    public string MsgId { get; set; }
}

还有几个类继承自基类模型,现在我在这里只展示一个。

这是方法:

[HttpPost]
[Produces("application/xml")]
public async Task<IActionResult> mp([FromBody]BaseClass XmlData)
{
    BaseClass ReturnXmlData = null;
    var a = XmlData.GetType();            
    return Ok(ReturnXmlData);
}  

远程服务器将向我的服务器发送包含 XML 的请求。现在传入变量XmlData只获取基类的值和类型。

我需要获取真实的值和类型,然后通过传入的类型和值返回不同的XML。

我该如何解决这个问题?谢谢。


这是传入的 XML 之一,与上面的 TextMsg 模型匹配:

<xml> 
<ToUserName>123</ToUserName>
<FromUserName>456</FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType>text</MsgType>
<Content>this is a test</Content>
<MsgId>1234567890123456</MsgId>
</xml>

您可以为此创建一个自定义模型绑定器

public class XmlBinder : IModelBinder
{
    public async Task BindModelAsync(ModelBindingContext bindingContext)
    {
        try
        {
            var memoryStream = new MemoryStream();
            await bindingContext.HttpContext.Request.Body.CopyToAsync(memoryStream);
            memoryStream.Seek(0, SeekOrigin.Begin);
            XElement root = XElement.Load(memoryStream);
            memoryStream.Seek(0, SeekOrigin.Begin);

            string messageType = root.Element("MsgType").Value;
            Type xmlType = GetTypeFromMessage(messageType);
            var serializer = new XmlSerializer(xmlType);
            var model = serializer.Deserialize(memoryStream);

            bindingContext.Result = ModelBindingResult.Success(model);
        }
        catch
        {
            bindingContext.Result = ModelBindingResult.Failed();
        }
    }

    private Type GetTypeFromMessage(string msgType)
    {
        switch (msgType)
        {
            case "text":
                return typeof(TextMsg);
            case "image":
                return typeof(ImageMsg);
            //... other cases
            default:
                return typeof(BaseClass);
        }
    }
}

将此模型活页夹应用于BaseClass

[ModelBinder(typeof(XmlBinder))]
public class BaseXml
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从继承的 FromBody 模型中获取正确的类型? 的相关文章

  • Windows 10 Mobile (10.0.14393) 地理围栏后台任务 (LocationTrigger)

    自从10 0 14393 周年纪念更新 LocationTrigger似乎不起作用 我有 Windows Phone 8 1 应用程序 也适用于 UWP 应用程序 输出到的便携式库Windows Runtime Component图书馆 w
  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • CultureInfo 的实例(来自相同的文化)根据操作系统而变化

    我有一个网站 上面写着这样的日期 CultureInfo cultureInfo CultureInfo GetCultures CultureTypes AllCultures FirstOrDefault c gt string Equ
  • 在 C# Winforms 应用程序中嵌入 Windows XP 主题

    我有一个旧版 C Windows 窗体应用程序 其布局是根据 Windows XP 默认主题设计的 由于需要将其作为 Citrix 应用程序进行分发 该应用程序现在看起来像经典主题应用程序 因为 Citrix 不鼓励使用主题系统服务 所以
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • 为什么要在 C++ 中使用 typedef?

    可以说我有 set
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • 在hbase中创建表

    我是 hbase 和 hadoop 的新手 无论如何 我已经成功建立了一个由3台机器组成的hadoop集群 现在我需要一些帮助来建立数据库 我有一个表 评论 包含字段 user id comments 对评论的评论 可以多个 和状态字段相同
  • Powershell查找7天内过期的用户

    我正在尝试运行一个 powershell 脚本来查询 7 天内过期的帐户 我目前有 a 获取日期 AddDays 7 搜索 ADAccount AccountExpiring 时间跨度 7 选择对象 SamAccountName Accou
  • 实体框架 6 - 处理嵌套对象的加载

    这是我在实体框架中使用的类层次结构的简化版本 public class Questionnaire public int Id get set public ICollection
  • 在Scala中,“视图”有什么作用?

    具体来说 我在这里查看问题1 http pavelfatin com scala for project euler http pavelfatin com scala for project euler 列出的代码如下 val r 1 u
  • DotNetOpenAuth 的来源在哪里?主要的 Sourceforge 链接仅包含示例和 ApplicationBlock

    现在 DNOA 可以做到回电报告 http www dotnetopenauth net openid dotnetopenauth e2 80 99s e2 80 9ccall home e2 80 9d reporting 我想调查源头
  • 使用 Jersey 在 REST 服务中上传多个文件

    这里有很多建议使用的链接multipart form data以及如何在此处上传文件 无法真正找到一个用于通过 CURL 命令上传的多个文件的组合以及接受 REST 服务的文件FormDataMultiPart 目前服务中的代码如下所示 j
  • 解析aspx文件中的控件并将其转换为xml

    我需要解析 aspx 文件 来自磁盘 而不是浏览器上呈现的文件 并列出页面上存在的所有服务器端 asp net 控件 然后从中创建一个 xml 文件 哪一个是最好的方法 另外 有没有可用的库 例如 如果我的 aspx 文件包含
  • 在一个响应中返回多个响应数据

    在我的科目表中 我按学期和月份列出了所有学生的课程以及每个月的分数 id 4 this is the subject id userid 1 name bio semester 3 semester month 5 the month po
  • MVC 部分视图模型不刷新

    我有一个部分视图正在加载到 asp net MVC 3 中的 jQuery 模式中 问题是视图未正确刷新 以下是事件的顺序 1 主视图有一个表格 列出了不同的事件记录 表的每一行上都有一个链接来显示事件详细信息 2 当单击此表上的链接时 部
  • name='' 的无效表单控件不可聚焦

    在 Google Chrome 中 某些客户无法进入我的付款页面 当尝试提交表单时 我收到此错误 name 的无效表单控件不可聚焦 这是来自 JavaScript 控制台 我读到问题可能是由于隐藏字段具有必需的属性 现在的问题是我们使用 n
  • 将 dotnet core 应用程序安排为具有数据访问层的 3 层

    我的典型 NET 4 5X Web 应用程序结构至少有 3 层 Web 项目 NET Web 应用程序 域 业务逻辑项目 类库 和数据访问项目 类库 Web项目引用了业务层 业务层又引用了数据访问层 我喜欢这种方法 因为我的 Web 项目没
  • TypeScript 中的语音识别和语音合成

    我能够通过创建如下接口在 TypeScript 中运行 SpeechRecognition 并且工作正常 namespace CORE export interface IWindow extends Window webkitSpeech
  • Java 写入 Windows Server 2016 时文件上次修改时间未更新

    我在 Windows Server 2016 上有一个 Java 10 应用程序 它不断使用 java util logging 写入文件 在 Windows 文件资源管理器中 上次修改 和 大小 列不会更新 按 F5 不会更新详细信息 操
  • 当我们手动将tomcat作为Windows服务运行时,如何更改tomcat的java_opts?

    我在控制台上手动运行 tomcat 6 作为 Windows 服务 我需要在启动之前更改 java opts 我怎么做 另外 有没有办法可以动态查看日志 我知道这是一个旧线程 但需要纠正一些假设 仅供参考 当将 tomcat 作为服务运行时
  • 替换数据框中的重复列

    我有一个data frame in pyspark 该数据框有一些带有特殊字符的列 cols df schema names cols abc test test abc eng test abc test reps def col ren
  • JSON 模式中的小数精度

    我想让我的 JSON 架构验证发送到我的 REST api 的小数位数不超过两位 从我在最新的 JSON Schema RFC v4 中看到的情况来看 不允许这样做 V1 有一个 maxDecimals 验证器 有谁知道为什么被删除 我有一
  • 如何从 Asp Label.Text 加载航路点坐标

    我在其中硬核值的第一个代码
  • 未使用重定向设置实例变量

    什么会导致我的实例变量 product 无法为重定向设置 传递 Product 是一个 ActiveModel 对象 而不是 ActiveRecord 更具体地说 product 变量没有出现在redirect to new service
  • VSCode 文件夹结构

    我想更改文件夹结构 如果您在文件夹 utils 中看到我有另一个名为 mocks 的文件夹 我想要的是更改结构以按文件夹查看1个文件夹 类似这样 就像只有 1 个文件的 services 文件夹一样 我有相同的结构 另一个文件夹中有 1 个
  • 如何从继承的 FromBody 模型中获取正确的类型?

    正文的帖子有几种不同的 XML 传入 所有 XMLS 几乎都是相同的 因此我首先添加一个基类 其他 XMLS 继承自该基类 这是模型 XmlInclude typeof TextMsg XmlRoot xml public class Ba