为什么 Blazor 应用程序中的 XML 验证在本地主机上和作为 Azure 静态 Web 应用程序提供不同的消息?

如何解决为什么 Blazor 应用程序中的 XML 验证在本地主机上和作为 Azure 静态 Web 应用程序提供不同的消息?

编辑 我在 https://github.com/GilShalit/XMLValidation

做了一个简化的 repo

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

这些是我遵循的步骤:

  1. 构建一个 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);
    }
  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 文件。

解决方法

看起来 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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res