为什么 ClickOnce 下载未更改的文件?

Why is ClickOnce downloading unchanged files?

上下文:

我正在使用 C# 和 Visual Studio 2015 开发和部署带有 ClickOnce 的应用程序,我正在尝试缩小 ClickOnce 更新下载大小。 ClickOnce is capable of delta-only updates:

When updating an application, ClickOnce compares the hash signatures of the files specified in the application manifest for the current application against the new version. If different, ClickOnce downloads the new version. If the signatures match, ClickOnce copies the existing file and uses it in the new version of the application. This approach prevents ClickOnce from having to download the entire application again, even if only one or two files have changed.

问题:

我已经验证在 MyApp 的更新之间,大多数文件的散列签名没有改变(在命令行上使用 shasum 或在实际的清单文件中)。但是 ClickOnce 仍然会在每次更新时下载每个文件。

例如,MyApp 依赖于 Emgu.CV.dll,我刚刚在 Visual Studio 2015 年发布了 MyApp 1.0.9.4。这是来自 Emgu.CV.dll 的引用清单文件位于发布输出位置,MyApp\Application Files\MyApp_1_0_9_4\MyApp.exe.manifest:

<dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="Emgu.CV.dll" size="363520">
  <assemblyIdentity name="Emgu.CV" version="3.0.0.2158" publicKeyToken="7281126722AB4438" language="neutral" processorArchitecture="msil" />
  <hash>
    <dsig:Transforms>
      <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
    </dsig:Transforms>
    <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
    <dsig:DigestValue>lUb/oa0aQL6HWEhY8Juj6Mc1wChKo0owhJJ+sSfqZUs=</dsig:DigestValue>
  </hash>
</dependentAssembly>

这里是来自先前部署的相同 .dll 依赖项标记,MyApp_1_0_9_2\MyApp.exe.manifest:

<dependentAssembly dependencyType="install" allowDelayedBinding="true" codebase="Emgu.CV.dll" size="363520">
  <assemblyIdentity name="Emgu.CV" version="3.0.0.2158" publicKeyToken="7281126722AB4438" language="neutral" processorArchitecture="msil" />
  <hash>
    <dsig:Transforms>
      <dsig:Transform Algorithm="urn:schemas-microsoft-com:HashTransforms.Identity" />
    </dsig:Transforms>
    <dsig:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha256" />
    <dsig:DigestValue>lUb/oa0aQL6HWEhY8Juj6Mc1wChKo0owhJJ+sSfqZUs=</dsig:DigestValue>
  </hash>
</dependentAssembly>

它们是相同的。值得注意的是,<hash><dsig:DigestValue> 内容是相同的,就像在版本 1.0.9.2 和 [=24= 之间的各自标签中声明的所有其他价值约 150MB 的依赖项一样].

这两个清单文件之间实际上只有几个哈希值发生了变化。例如,MyApp.exe 哈希从

JryzNpD+emqeruXW7X2unRm0i58w9z9ct++Jeog40FI=

tF/hs87T4n9sMgoUJUmk31zAUsi7MsWXhLdKGxlR+EM=

但是下载了从 1.0.9.21.0.9.4 的 ClickOnce 更新 MyApp.exe and Emgu.CV.dll 每隔一个文件,更改与否!

为什么 ClickOnce 下载哈希没有改变的文件?


目前的研究:

This SO question 是相关的,但答案不适用,因为我没有重建被冗余下载的程序集,它们只是被复制(从不变的哈希签名中可以明显看出) .

This SO question 是相关的,但提问者只是误解了“如果较新则复制”的意思。

我已经阅读了this troubleshooting MSDN page,我的问题没有出现。

问题是 ClickOnce 进度对话框。它始终显示您的应用程序的整个大小,即使它只下载了一个文件。确保 运行 使用像 Fiddler 这样的监控工具来查看实际传输的内容。