如何解决为什么 Blazor 应用程序中的 XML 验证在本地主机上和作为 Azure 静态 Web 应用程序提供不同的消息?
编辑 我在 https://github.com/GilShalit/XMLValidation
做了一个简化的 repo我正在 Blazor WebAssembly (TargetFramework=net5.0) 中构建一个 XML 编辑器。部分功能涉及验证 XML 的完整性,并根据包含三个包含的复杂 xsd 模式进行验证。
这些是我遵循的步骤:
- 构建一个 XmlSchemaSet 并通过为每个 xsd 调用以下方法向其中添加 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);
}
- 初始化事件处理程序:
ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler);
- 将 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);
- 根据 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 文件。
解决方法
看起来 Blazor 不包含来自 System.Xml.Res 类的本地化错误消息模板。我的猜测是 Blazor 在通过 CI/CD 管道构建它时将其剥离。您的开发机器和构建代理可能具有不同的区域设置。
我建议使用以下 project properties 尝试强制捆绑所有文化和/或基于 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body ontouchstart="">
<main>
<div class="ios13-segmented-control"> <span class="selection"></span>
<div class="option"> <input type="radio" id="khar" name="sample" value="khar" checked> <label for="khar"><span>Khar</span></label></div>
<div class="option"> <input type="radio" id="santacruz" name="sample" value="santacruz"> <label for="santacruz"><span>Santacruz</span></label></div>
<div class="option"> <input type="radio" id="andheri" name="sample" value="andheri"> <label for="andheri"><span>Andheri</span></label></div>
</div>
<div class="khar selectt"> <br> <strong style="font-size: 24px; font-weight: 700; line-height:30px;">Khar</strong><br></div>
<div class="santacruz selectt"> <br> <strong style="font-size: 24px; font-weight: 700; line-height:30px;">Santacruz</strong><br></div>
<div class="andheri selectt"> <br> <strong style="font-size: 24px; font-weight: 700; line-height:30px;">Andheri</strong><br></div>
<script type="text/javascript">
$(document).ready(function() {
$('input[type="radio"]').click(function() {
var inputValue = $(this).attr("value");
var targetBox = $("." + inputValue);
$(".selectt").not(targetBox).hide();
$(targetBox).show();
});
});
</script>
</main>
</body>
加载不变文化:
en_US
您还提到调整 linker,但根据文档,它仅适用于 <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>
构建(您似乎还没有尝试部署调试版本)。因此,我建议尝试部署应用的调试版本,以完全消除链接器。
您也可以强制链接所有 i18 资源:
Release
并将 <PropertyGroup>
<BlazorWebAssemblyI18NAssemblies>all</BlazorWebAssemblyI18NAssemblies>
</PropertyGroup>
添加到 System.Xml
以便希望它无需进一步优化即可提供给客户端:
LinkerConfig.xml
,
所以这是一个功能而不是错误...
我在开发社区上打开的一个 issue 被 dotnet/runtime 团队挑选并添加到 GitHub 问题跟踪器 here。
事实证明删除了异常消息以节省大小。
使用 <UseSystemResourceKeys>false</UseSystemResourceKeys>
启用异常消息,我必须说我没有看到大小增加。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。