1

编辑 我在https://github.com/GilShalit/XMLValidation做了一个简化的回购


我正在 Blazor WebAssembly (TargetFramework=net5.0) 中构建 XML 编辑器。部分功能涉及验证 XML 的完整性并根据具有三个包含的复杂 xsd 模式。

这些是我遵循的步骤:

  1. 通过为每个 xsd 调用以下方法,构建一个 XmlSchemaSet 并向其中添加 4 个模式:
    private async Task loadSchema(string path, string nameSpace)
    {
        byte[] byteArrayS = await _client.GetByteArrayAsync(path);
        Console.WriteLine($"{path}: {byteArrayS.Length}");
        MemoryStream streamS = new MemoryStream(byteArrayS);
        XmlReader xmlSchemaReader = XmlReader.Create(streamS);
        schemaSet.Add(nameSpace, xmlSchemaReader);
    }
  1. 使用以下命令初始化事件处理程序:
ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
  1. 将 XML 加载到 XmlDocument 中:
        byte[] byteArrayX = Encoding.ASCII.GetBytes(await _editorTarget.GetValue());
        MemoryStream streamX = new MemoryStream(byteArrayX);
        XmlReader reader = XmlReader.Create(streamX);
        XmlDocument document = new XmlDocument();
        document.Load(reader);
  1. 根据 schemaSet 进行验证:
            document.Schemas = schemaSet;
            document.Validate(eventHandler);

第 3 步和第 4 步在 Try...Catch 块内运行,并在 XML 格式不正确(例如缺少结束标记)时在本地运行,该document.Load(reader);行会产生错误,并显示如下消息:

The 'publicationStmt1' start tag on line 9 position 11 does not match the end tag of 'publicationStmt'. Line 11, position 12.

这很棒。但在部署到 Azure 的应用程序中验证类似情况会产生以下错误消息:Xml_MessageWithErrorPosition, Xml_TagMismatchEx, 11, 12.

当行document.Validate(eventHandler);运行时,模式验证错误会在事件处理程序中捕获,典型消息是:

The element 'fileDesc' in namespace 'http://www.tei-c.org/ns/1.0' has invalid child element 'publicationStmt1' in namespace 'http://www.tei-c.org/ns/1.0'. List of possible elements expected: 'editionStmt, extent, publicationStmt' in namespace 'http://www.tei-c.org/ns/1.0'.

但是在 Azure 上运行时,消息是Sch_InvalidElementContentExpecting.

在本地运行和在 Azure 中运行的验证结果出现这种差异的原因是什么?

我试图通过添加禁用链接:

<ItemGroup>
  <BlazorLinkerDescriptor Include="LinkerConfig.xml" />
</ItemGroup>

但这对部署的应用程序没有影响,使用 Release 而不是 Debug 在本地运行也没有改变任何东西。

我还确保从 Azure 运行时实际加载了 4 个 xsd 文件。

4

2 回答 2

1

看起来 Blazor 不包含来自System.Xml.Res类的本地化错误消息模板。我的猜测是 Blazor 在通过 CI/CD 管道构建它时会将其剥离。您的开发机器和构建代理可能具有不同的语言环境。

我建议使用以下项目属性来尝试强制捆绑所有文化和/或加载基于以下内容的不变文化en_US

<PropertyGroup>
  <BlazorWebAssemblyLoadAllGlobalizationData>true</BlazorWebAssemblyLoadAllGlobalizationData>
<InvariantGlobalization>true</InvariantGlobalization> <!-- If the app doesn't require localization, you may configure the app to support the invariant culture -->
</PropertyGroup>

您还提到了调整链接器,但根据文档,它仅适用于Release构建(您似乎还没有尝试部署调试版本)。因此,我建议尝试部署您的应用程序的调试版本,以完全消除链接器。

您还可以强制链接所有 i18 资源:

<PropertyGroup>
  <BlazorWebAssemblyI18NAssemblies>all</BlazorWebAssemblyI18NAssemblies>
</PropertyGroup>

并添加System.XmlLinkerConfig.xml希望它可以在没有进一步优化的情况下提供给客户:

<linker>
  <assembly fullname="System.Xml" />
</linker>
于 2021-03-07T12:02:46.163 回答
0

所以这是一个功能而不是一个错误......

我在 Dev 社区打开的一个问题被 dotnet/runtime 团队发现并添加到 GitHub 问题跟踪器

事实证明,异常消息被删除以节省大小。

使用<UseSystemResourceKeys>false</UseSystemResourceKeys>启用异常消息,我必须说我没有看到大小增加。

于 2021-03-09T16:52:43.760 回答