【问题标题】:Nuget package produces corrupt web.config file (assemblyBinding section)Nuget 包生成损坏的 web.config 文件(assemblyBinding 部分)
【发布时间】:2017-06-27 04:22:48
【问题描述】:

编辑:已经解决了问题!请参阅下面的答案。

我创建的 nuget 包有一个奇怪的问题。 我已经创建了几个nuget包,以前从来没有遇到过这个问题,但是现在突然安装新包时,它会产生一个无效的web.config文件。

nuspec 文件与其他一些(工作的)项目几乎完全相同。我添加了安装脚本和一些特殊内容,并在元数据部分设置了依赖关系:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>Kooco.com Ltd</authors>
    <owners>$author$</owners>
    <description>Server-Project Template for use with the Kooco.Framework</description>
    <releaseNotes>Pre-Alpha Release</releaseNotes>
    <copyright>Copyright 2017</copyright>
    <tags>Maxima Kooco WebProjects</tags>
    <dependencies>
      <dependency id="Newtonsoft.Json" version="10.0" />
      <dependency id="AutoMapper" version="6.0" />
      <dependency id="WebActivatorEx" version="2.2" />
      <dependency id="Kooco.Framework" version="$version$" />
    </dependencies>
    <references>

    </references>
  </metadata>
  <files>
    <file src="install.ps1" target="tools" />
    <file src="NugetOverwriteContents\**\*.*" target="tools\OverwriteContents" />
    <file src="NugetNoOverwriteContents\**\*.*" target="tools\NugetNoOverwriteContents" />
  </files>
</package>

依赖项与其他(工作)包中的依赖项完全相同。

但由于某些原因,在安装包时,nuget 会产生以下 web.config 部分,这会导致应用程序中的错误,因为非关闭标签:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
      <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" /><assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" /><assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /></dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-5.2.0.0" newVersion="5.2.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

在安装 nuget 包之前:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
      <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" /><assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" /></dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-5.2.0.0" newVersion="5.2.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

我不进行自定义配置转换。 我有一个安装脚本,但这个脚本不是问题,我也尝试在没有安装脚本的情况下安装,但遇到了同样的问题。

目标项目是一个空的 ASP.Net Web 应用程序,我在其中使用“空”模板并激活了“MVC”和“WebAPI”。

我的 nuget 包管理器版本是 3.5.0.1484。启用自动更新。 我正在使用 Visual Studio 2015 社区版。我的系统是 Windows 10。

有人知道是什么导致了这个问题吗?

【问题讨论】:

    标签: visual-studio nuget nuget-package


    【解决方案1】:

    有人知道是什么导致了这个问题吗?

    我用你的 nuspec 文件创建了一个 nuget 包,但不包含 &lt;files&gt;... &lt;/files&gt; 的部分,然后将其安装到 ASP.Net MVC 项目中。它工作正常。因此,如果没有更多详细信息,我无法直接解决此问题,我可以为您提供一些故障排除:

    首先,请排除对web.config的人为修改。因为默认绑定信息应该如下所示:

    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Microsoft.Owin.Security.OAuth" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Microsoft.Owin.Security.Cookies" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-3.0.1.0" newVersion="3.0.1.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
            <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    

    但是在你的 web.config 中,在 Newtonsoft.Json 包下复制 bindingRedirect

    <dependentAssembly>
          <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
          <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="1.0.0.0-5.2.3.0" newVersion="5.2.3.0" /><assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" /><assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /><bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /></dependentAssembly>
    

    您可以创建一个新的空白 ASP.Net MVC 项目来检查这一点。

    其次,我们可以通过web.config.transform file 或使用 XML 文档转换 (XDT) 来修改 web.config。

    web.config.transform 文件包含与 web.config 文件相同的内容,并且在您安装 NuGet 包时将应用于 web.config 文件。 而且 XDT 更强大,可以对 web.config 文件进行更复杂的修改,例如插入或删除现有元素。因此,请仔细检查您的包中是否包含任何带有通配符“*”的配置转换文件。您可以尝试在您的包中排除这些文件以检查此问题是否仍然存在。

    【讨论】:

      【解决方案2】:

      我发现了问题: 问题是,在我的一些项目中,web.config 文件的构建操作设置为“内容”,然后 nuget 包构建器似乎自动生成了一个 web.config 转换。 将构建操作更改为“无”解决了问题。

      顺便说一句。使用“NuGet 包资源管理器”工具帮助很大,它允许您查看创建的 nuget 包的内容,然后我在其中看到了自动创建的“web.config.transform”文件。

      【讨论】:

        猜你喜欢
        • 2014-03-31
        • 2015-04-23
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-25
        • 1970-01-01
        相关资源
        最近更新 更多