好吧,经过三天无望的调试和多次尝试找到这个问题的根源,我们终于弄明白了。有关解决方法,请参见下文。
传递优化服务错误地缓存了它检索到的任何 HTTP 资源的大小(它可以是 appinstaller 文件或 MSIX 包),并Range
在后续请求中包含 HTTP 标头以及可能过期的字节范围值。
例如,如果您的应用程序安装程序的长度为 725 字节,则 Windows DO 服务第一次发出格式正确的 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
但是,如果您在 Web 服务器上更新了 appinstaller 文件,并且它的大小增加了,例如增加到 4096 字节,DoSvc仍然只请求前 725 字节,并且显然会得到一个无法解析的损坏的 XML。即使ETag
已正确处理并已针对 appinstaller HTTP 资源进行了更改!
如果您的 appinstaller 文件大小减小,您可能会得到416 Range Not Satisfiable。
以下是我们使用 Fiddler 转储的 Amazon S3(我们在其中托管我们的 appinstaller 和 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="TradingView, Inc.", O="TradingView, Inc.", 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
和评论被切断了吗?这是传递优化服务的格式错误的 HTTP 范围请求的结果。
解决方法:您已经猜到了吗?是的,只是不要改变 appinstaller 的大小!例如,我们用 XML 注释填充它,精确到 4096 字节,如果我们需要向 XML 添加更有意义的内容,我们只需从 XML 注释中删除一些字符,使其再次变为 4096 字节。我们甚至在我们的 gitlab 部署管道中进行了简单的大小测试,以确保不会意外更改 appinstaller 的大小。
您可以查看我们自 2021 年 4 月以来使用的当前生产应用安装程序:https ://tvd-packages.tradingview.com/stable/latest/win32/TradingView.appinstaller
PS如果对同一个 URL 执行请求,就会出现问题。如果 URL 更改,DoSvc HTTP 客户端逻辑将其作为不同的资源处理。这就是为什么 appinstaller 文件更有可能成为这个问题的受害者。