繁体   English   中英

ASP.NET Core 3.1 使用 XmlSerializerFormatters()

[英]ASP.NET Core 3.1 using XmlSerializerFormatters()

我目前有一个基于.Net Core 2.2 的应用程序,它可以工作。 我需要将此项目移至.Net Core 3.1,但我似乎无法在 controller 中反序列化 XML。 在这两个应用程序中,我成功创建了 WCF 连接服务。 WDSL 现在定义了更多类,但基本相同。 我对文件进行了比较,左侧是新生成的填充:

<     [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.2")]
---
>     [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.1-preview-30310-0943")]

这与 Reference.cs 中的每个 class 重复。 我的问题是我的 Postman 测试在新控制器上失败。 通过使用 Calculatus Eliminatus,我设法找出了差异,旧的解析将接受:

<?xml version="1.0" encoding="UTF-8"?>
<ConnectedServiceRequestX xmlns="http://somename.com/api/01">
    <Timestamp>2021-04-05T16:35:43</Timestamp>
    <ApiKey>TopSecretKey</ApiKey>
    <CustomerId>ABC</CustomerId>
</ConnectedServiceRequestX>

新的解析器只有在发布的 XML 是这样的情况下才有效:

<?xml version="1.0" encoding="UTF-8"?>
<ConnectedServiceRequestX>
    <Timestamp xmlns="http://somename.com/api/01">2021-04-05T16:35:43</Timestamp>
    <ApiKey xmlns="http://somename.com/api/01">TopSecretKey</ApiKey>
    <CustomerId xmlns="http://somename.com/api/01">ABC</CustomerId>
</ConnectedServiceRequestX>

将 xmlns="http://somename.com/api/01" 置于 class 级别 XML 项时,新解析器会引发异常。 我需要支持较旧的 XML 输入,因为我没有访问我们服务的系统的所有权。 在这种情况下,一家大公司正在规定他们将用来访问我们的数据的界面,而我们是一家小公司。

我倾向于认为有一些选项可以提供给.XmlSerializerFormatters(),这样 xmlns 将默认使用 class 级别 XML 项目上提供的命名空间。 任何帮助表示赞赏。

以下应该有效:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;


namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(ConnectedServiceRequestX));
            ConnectedServiceRequestX request = (ConnectedServiceRequestX)serializer.Deserialize(reader);
        }
    }
    [XmlRoot(Namespace = "http://somename.com/api/01")]
    public class ConnectedServiceRequestX
    {
        public DateTime Timestamp { get; set; }
        public string ApiKey { get; set; }
        public string CustomerId { get; set; }
    }
}

在研究了生成的文件(2019 年 4 月和今天)之间的差异之后,我注意到一些类之前有一行差异。 从 WDSL 生成的 C# 文件中有 60 多个类(我很抱歉之前没有注意到)。 无论如何,该行如下:

 [XmlRootAttribute("ConnectedServiceRequestX", Namespace="http://somename.com/api/01", IsNullable = false)]

这些行是我们在 class 生成之后但在它们最初进入源代码控制之前添加的。 他们要求:

using System.Xml.Serialization;

也将被添加。 这样做是允许将 xmlns 属性放置在外部标记(类项标记)中,而不必复制到内部标记中,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<ConnectedServiceRequestX xmlns="http://somename.com/api/01">
    <Timestamp>2021-04-05T16:35:43</Timestamp>
    <ApiKey>TopSecretKey</ApiKey>
    <CustomerId>ABC</CustomerId>
</ConnectedServiceRequestX>

这就是我使用 Postman 进行的遗留测试的设计方式。 我在学习 ASP.Net Web 服务时编写(生成)此代码,我不记得修改生成的文件以使 Connected Service / XML Post 工作。 所以简短的回答是,当使用 Visual Studio 生成代码(添加连接的服务 - WCF/WDSL)时,Reference.cs 文件可能仍会进行一些修改,从而允许将更友好的 XML 发布到端点。

我现在使用我的旧测试启动并运行(ASP.NET Core 3.1),这让我对 go 使用更新的应用程序进行生产充满信心。 我希望这对其他人有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM