[英]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.