AppInstaller XML 问题

AppInstaller XML Issue

我正在尝试遵循 Microsoft 文档 但我对为什么我的应用程序安装程序失败感到困惑:

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller xmlns="http://schemas.microsoft.com/appx/appinstaller/2018" Uri="https://xxxxxx.blob.core.windows.net/installer/Package.appinstaller" Version="1.0.0.0">
    <MainPackage Name="MyApp" Version="12.21.289.0" Publisher="CN=xxxxxx" ProcessorArchitecture="x64" Uri="https://xxxxxx.blob.core.windows.net/installer/MyApp.msix"/>
    <UpdateSettings> <OnLaunch HoursBetweenUpdateChecks="1" /> <AutomaticBackgroundTask/> </UpdateSettings>
</AppInstaller>

如果我 运行 MSIX 文件,它会按预期安装。 我一直在努力遵循这个: https://docs.microsoft.com/en-us/windows/msix/desktop/azure-dev-ops 我收到此错误: 如果我删除 UpdateSettings 属性,它只会导致另一个错误: “应用程序安装失败,错误消息:Appinstaller 操作失败,错误代码为 0x80D05011。详细信息:未知错误 (0x80d05011)”

请帮忙。

如果这对任何人有帮助,我发现了这个帖子: https://techcommunity.microsoft.com/t5/msix-deployment/windows-10-2004-msix-not-updating-please-check-whether-the/m-p/1466701

基本上答案是重启你的机器。我这样做了,它似乎已经修复了它

as @The-pademelon 也提到重启交付优化服务也有效。

这是 windows 交付优化服务中的一个错误,我们目前所能做的就是解决方法。

开发者: 这个问题是由于版本号的一部分改变了它的位数,比如从 1.0.9.9 到 1.0.10.0,如果你让构建过程自动增加这些数字,这会很快发生。解决方法是 滚动到下一个版本 (1.1.0.0)。解决这个问题的最好方法可能是始终从 0.100.100 或 0.1000.1000 的基本版本开始,否则您将严重限制可用的总版本号。

用户: 任务管理器 -> 服务 -> DoSvc -> 重启 这比重启系统要快一些,也方便一些。

注意:服务的中断状态是由这个版本编号错误引起的,但一旦发生,重启是纠正它的唯一方法。

添加@user3190036 的答案:我设法构建和安装的最大版本号是 65535.65535.65535.9

似乎第 4 个范围是错误所在,因为它不符合作为错误消息的一部分出现的架构,如果您使用这样的任意大数字:

MakeAppx : error: Error info: error C00CE169: App manifest validation error: The app manifest must be valid as per schema: Line 7, Column 33, Reason: '1.0.125500.9' violates pattern constraint of 
'(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(\.(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])){3}'.
The attribute 'Version' with value '1.0.125500.9' failed to parse.

将正则表达式解构为

(0
|[1-9][0-9]{0,3}
|[1-5][0-9]{4}
|6[0-4][0-9]{3}
|65[0-4][0-9]{2}
|655[0-2][0-9]
|6553[0-5])

(\.
(0
|[1-9][0-9]{0,3}
|[1-5][0-9]{4}|6[0-4][0-9]{3}
|65[0-4][0-9]{2}
|655[0-2][0-9]
|6553[0-5])
){3}

我们可以更清楚地看到取值的可能范围:0..65535对于4个部分中的任何一个,但是由于存在错误,第4个部分被限制为单个数字0..9.

对我有用的最小版本号是 0.0.0.0

2021 年 5 月 5 日在最新的 Win Server 2019 上测试

好吧,经过三天无望的调试和多次尝试寻找这个问题的根源,我们终于弄明白了。 解决方法见下文。

传递优化服务错误地缓存了它检索到的任何 HTTP 资源的大小(它可以是应用安装程序文件或 MSIX 包),并在 Range HTTP header具有可能过时的字节范围值的后续请求。

例如,如果您的应用程序安装程序长 725 字节,第一次 Windows DO 服务发出 well-formed HTTP 请求并下载整个 XML。请求示例:

GET https://foobar.com/baz.appinstaller HTTP/1.1
Connection: Keep-Alive
Accept: */*
Range: bytes=0-724
User-Agent: Microsoft-Delivery-Optimization/10.0
MS-CV: ......
Content-Length: 0
Host: foobar.com

但是如果您更新了您的网络服务器上的应用程序安装程序文件,并且它的大小增加了,例如,最多 4096 字节,DoSvc 仍然请求仅前 725 个字节 ,显然会损坏 XML,无法解析。即使 ETag 处理正确并且已针对 appinstaller HTTP 资源进行了更改!

如果您的应用程序安装程序文件大小 减小 ,您可能会得到 416 Range Not Satisfiable.

这是我们使用 Fiddler 转储的来自 Amazon S3(我们托管应用程序安装程序和 MSIX 程序包的地方)的真实响应:

HTTP/1.1 206 Partial Content
x-amz-id-2: ...
x-amz-request-id: ...
Date: Tue, 06 Apr 2021 21:45:12 GMT
Last-Modified: Tue, 06 Apr 2021 21:40:24 GMT
ETag: "af2d8bb5c638eca059cdb4dc6c694123"
Accept-Ranges: bytes
Content-Range: bytes 0-724/4096
Content-Type: application/appinstaller
Content-Length: 725
Server: AmazonS3

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller 
  Uri="https://tvd-packages.tradingview.com/beta/latest/win32/TradingView.appinstaller" 
  Version="1.0.0.1071"
  xmlns="http://schemas.microsoft.com/appx/appinstaller/2017/2">
  <MainPackage 
    Name="TradingView.Desktop" 
    Version="1.0.0.1071" 
    Publisher="CN=&quot;TradingView, Inc.&quot;, O=&quot;TradingView, Inc.&quot;, STREET=470 Olde Worthington Road Suite 200, L=Westerville, S=Ohio, PostalCode=43082, C=US" 
    ProcessorArchitecture="x64" 
    Uri="https://tvd-packages.tradingview.com/beta/1.0.0-beta.1.5/win32/x64/TradingView.msix" />
  <UpdateSettings>
    <OnLaunch HoursBetweenUpdateChecks="0" />
  </UpdateSettings>

<!--
- WHAT TH

你注意到 Content-Range: bytes 0-724/4096 并且评论被切断了吗??这是传递优化服务 ill-formed HTTP 范围请求的结果。

解决方法:您已经猜到了吗?是的,只是不要改变应用程序安装程序的大小!例如,我们用 XML 注释填充它,正好达到 4096 字节,如果我们需要向 XML 添加更多有意义的内容,我们只需从 XML 注释中删除一些字符即可又是 4096 字节。我们甚至在我们的 gitlab 部署管道中做了一个简单的大小测试,以确保 appinstaller 的大小没有被意外更改。

您可以查看我们自 2021 年 4 月以来使用的当前生产应用程序安装程序:https://tvd-packages.tradingview.com/stable/latest/win32/TradingView.appinstaller

P.S. 如果对同一个 URL 执行请求,问题就会出现。如果 URL 发生变化,DoSvc HTTP 客户端逻辑会将其作为不同的资源进行处理。这就是为什么 appinstaller 文件更有可能成为这个问题的受害者。