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

时间:2015-09-21 23:41:00

标签: c# visual-studio hash clickonce auto-update

上下文

我使用C#和Visual Studio 2015使用ClickOnce开发和部署应用程序,并且我试图缩小ClickOnce更新下载大小。 ClickOnce is capable of delta-only updates

  

更新应用程序时, ClickOnce将当前应用程序的应用程序清单中指定的文件的哈希签名与新版本进行比较。如果不同,ClickOnce将下载新版本。如果签名匹配,ClickOnce将复制现有文件并在新版本的应用程序中使用它。这种方法可以防止ClickOnce再次下载整个应用程序,即使只有一个或两个文件发生了变化。

问题:

我已验证在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.21.0.9.4之间在各自标记中声明的所有其他约150MB的依赖项一样。< / p>

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

更改
JryzNpD+emqeruXW7X2unRm0i58w9z9ct++Jeog40FI=

tF/hs87T4n9sMgoUJUmk31zAUsi7MsWXhLdKGxlR+EM=

但从1.0.9.21.0.9.4的ClickOnce更新每次都会下载MyApp.exe Emgu.CV.dll 其他文件,改变与否!

为什么ClickOnce会下载哈希值未发生变化的文件?

到目前为止的研究:

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

This SO question是相关的,但提问者只是误解了什么&#34;复制如果更新&#34;的意思。

我已阅读this troubleshooting MSDN page,我的问题不会出现。

1 个答案:

答案 0 :(得分:5)

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