设置预编译时 VS 2012 MVC Web App 发布失败

VS 2012 MVC Web App Publish fails when Precompilation set

我有一个 MVC 5 Web 应用程序,我希望通过在发布时进行预编译来节省启动时间。但是,当我选择 "Precompile during publishing" 时,出现以下错误:

Error   5082    Could not load file or assembly 'DotNetOpenAuth.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246' 
or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040).
error ASPRUNTIME    0   0   USIS

Web.Config 确实有此参考的绑定重定向

  <dependentAssembly>
    <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780CCD10D57B246" culture="neutral" />
    <bindingRedirect oldVersion="1.0.0.0-4.1.0.0" newVersion="4.1.0.0" />
  </dependentAssembly>

如果我没有选中这个预编译选项,那么构建和部署都很好,而且 Web 工作正常,没有问题。我无法在选中此预编译选项的情况下发布。

我真的很想让网站只在发布时编译所有视图等,而不要在实时制作网站上重新编译。我正在查看的一些文档暗示这是这些功能的提议......但我没有运气。

编辑: 我取得了一些成功。我意识到我是故意不部署 Web.Config 文件,这样开发人员就不会意外损害生产环境配置,但预编译版本似乎正在将文件复制到临时位置,并且没有 Web.Config 正在部署文件,那里没有 Web.Config 文件,这意味着没有依赖项翻译。

所以,现在看来,如果我想预编译,我将不得不部署 Web.Config(我已将其构建操作从 "Content" 设置为 "None",现在我又把它设置回来了。)这意味着我需要研究 Web.Config 转换等

谢谢, 格雷格

预编译唯一要做的就是编译视图。只有在设置预编译时才会发生这种情况的事实意味着您的其中一个视图中有某些东西正在生成此错误。不过,这有点无关紧要。

我发现纠正此特定错误的最佳方法是卸载并重新安装有问题的 Nuget 包。

只需进入包管理器控制台,确保为 "Default Project" 选择生成错误的项目,然后 运行:

> Uninstall-Package DotNetOpenAuth.Core -Force
> Install-Package DotNetOpenAuth.Core

这应该可以解决问题并允许您的站点发布并且 运行 没问题,有或没有预编译。

解法: 事实证明,由于我没有发布 Web.config 文件,因此没有进行绑定重定向。解决方案是把这个文件改回发布(Build Action from "None" to "Content"),然后预编译就成功了。

对于其他使用 MVC 或 ASP.NET 网站每次访问新 page/view 时运行缓慢的网站,我建议您尝试发布此预编译功能。它只是隐藏在发布设置 (VS 2012) 的文件选项下。我选择预编译,并使站点不可更新以避免动态 view/page 编译。有关详细信息,请参阅:What effect does the new precompile during publishing option have on MVC4 applications? .

此外,为了将正确的设置和连接字符串推送到 Live 和 Test,我开始使用翻译模板 "Web.Release.config" 和 "Web.Debug.config"。这些将仅在部署时换出 Web.config 行。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkId=125889